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