1 #!/bin/sh 2 # 3 # $NetBSD: resize_root,v 1.1 2015/03/30 10:58:37 chopps Exp $ 4 # 5 6 # PROVIDE: resize_root 7 # REQUIRE: fsck_root 8 9 $_rc_subr_loaded . /etc/rc.subr 10 11 name="resize_root" 12 rcvar=$name 13 start_cmd="resize_root_start" 14 stop_cmd=":" 15 fstab_file=/etc/fstab 16 rootmp="/" 17 18 split_options() 19 { 20 local IFS 21 IFS=, 22 OPTS=$1 23 for i in $OPTS; do 24 echo $i 25 done 26 } 27 28 resize_root_start() 29 { 30 # if ! checkyesno $rcvar; then 31 # echo "Not resizing $rootmp: resize_root must be set to YES/yes/..." 32 # return 33 # fi 34 35 trap : 2 # Ignore SIGINT, SIGQUIT, so we 36 trap : 3 # enter single-user mode on failure. 37 38 # Do nothing if root file system is not mentioned in /etc/fstab, or if 39 # root file system seems to be a network mount, or if root file system 40 # is not ffs or if logging is enabled. 41 rootdev="" 42 while read fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno 43 do 44 # skip comment or blank line 45 case "${fs_spec}" in 46 \#*|'') continue ;; 47 esac 48 49 # skip non-root 50 if [ "${fs_file}" != "$rootmp" ]; then 51 continue 52 fi 53 54 if [ "${fs_vfstype}" != "ffs" ]; then 55 echo "Not resizing $rootmp: not an ffs file system" 56 return 57 fi 58 59 case "${fs_spec}" in 60 *:*) 61 echo "Not resizing $rootmp: network mount" 62 return 63 ;; 64 esac 65 66 for opt in $(split_options "${fs_mntops}"); do 67 if [ "$opt" = "log" ]; then 68 echo "Not resizing $rootmp: logging unsupported" 69 return 70 fi 71 done 72 73 rootdev=${fs_spec%/*}/r${fs_spec##*/} 74 break 75 done < "${fstab_file}" 76 77 if [ -z "$rootdev" ]; then 78 echo "Not resizing $rootmp: not listed in ${fstab_file}" 79 return 80 fi 81 82 if resize_ffs -c $rootdev; then 83 echo "Resizing $rootmp" 84 if ! resize_ffs -y $rootdev; then 85 echo "Error resizing root." 86 stop_boot 87 fi 88 else 89 echo "Not resizing $rootmp: already correct size" 90 fi 91 return 92 } 93 94 load_rc_config $name 95 run_rc_command "$1" 96