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