1 #!/bin/sh 2 # 3 # $NetBSD: resize_disklabel,v 1.4 2023/02/18 07:58:34 mlelstv Exp $ 4 # 5 6 # PROVIDE: resize_disklabel 7 # REQUIRE: fsck_root 8 # BEFORE: resize_root 9 10 $_rc_subr_loaded . /etc/rc.subr 11 12 name="resize_disklabel" 13 rcvar=$name 14 start_cmd="resize_disklabel_start" 15 stop_cmd=":" 16 17 get_rawpart() 18 { 19 local partno 20 21 partno=$(/sbin/sysctl -n kern.rawpartition) 22 printf "$(printf \\\\%o $((partno + 97)))" 23 } 24 25 get_total_sectors() 26 { 27 local disk 28 29 disk=$1 30 /sbin/disklabel -t "$disk" \ 31 | sed -ne 's/.*:su#\([0-9]*\):.*/\1/p' 32 } 33 34 get_rawpart_sectors() 35 { 36 local disk rawpart 37 38 disk=$1 39 rawpart=$2 40 /sbin/disklabel -t "$disk" \ 41 | sed -ne 's/.*:p'"$rawpart"'#\([0-9]*\):.*/\1/p' 42 } 43 44 grow_mbrpart() 45 { 46 local disk rawpart ts rs oldsize newsize 47 48 disk=$1 49 rawpart=$(get_rawpart) 50 51 eval $(/sbin/fdisk -S $disk) 52 if [ ! "$PART1ID" = "169" ]; then 53 warn "No NetBSD partition found in MBR partition #1" 54 return 55 fi 56 57 ts=$((${DLSIZE} - ${PART1START})) 58 rs=${PART1SIZE} 59 60 if [ "$ts" = "$rs" ]; then 61 return 62 fi 63 64 oldsize=$(($rs / 2048)) 65 newsize=$(($ts / 2048)) 66 echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)" 67 /sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk} 68 } 69 70 grow_disklabel() 71 { 72 local disk part rawpart ts rs oldsize newsize 73 74 disk=$1 75 part=$2 76 rawpart=$(get_rawpart) 77 78 ts=$(get_total_sectors $disk) 79 rs=$(get_rawpart_sectors $disk $rawpart) 80 81 if [ "$ts" = "$rs" ]; then 82 return 83 fi 84 85 oldsize=$(($rs / 2048)) 86 newsize=$(($ts / 2048)) 87 echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)" 88 printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \ 89 disklabel -i $disk >/dev/null 90 } 91 92 resize_disklabel_start() 93 { 94 if [ x"${resize_disklabel_disk}" = "x" ]; then 95 resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)" 96 fi 97 if [ x"${resize_disklabel_part}" = "x" ]; then 98 resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) )))) 99 fi 100 101 grow_mbrpart "${resize_disklabel_disk}" 102 grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}" 103 } 104 105 load_rc_config $name 106 run_rc_command "$1" 107