1 1.1 jmcneill #!/bin/sh 2 1.1 jmcneill # 3 1.3 jmcneill # $NetBSD: resize_disklabel,v 1.3 2018/10/06 09:58:55 jmcneill 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.1 jmcneill partno=$(/sbin/sysctl -n kern.rawpartition) 20 1.1 jmcneill test $partno = 2 && echo c || echo d 21 1.1 jmcneill } 22 1.1 jmcneill 23 1.1 jmcneill get_total_sectors() 24 1.1 jmcneill { 25 1.1 jmcneill disk=$1 26 1.1 jmcneill /sbin/drvctl -p $disk disk-info/geometry/sectors-per-unit 27 1.1 jmcneill } 28 1.1 jmcneill 29 1.1 jmcneill get_rawpart_sectors() 30 1.1 jmcneill { 31 1.1 jmcneill disk=$1 32 1.1 jmcneill rawpart=$2 33 1.1 jmcneill /sbin/disklabel $disk | grep "^ $rawpart:" | awk '{ print $2; }' 34 1.1 jmcneill } 35 1.1 jmcneill 36 1.2 jmcneill grow_mbrpart() 37 1.2 jmcneill { 38 1.2 jmcneill disk=$1 39 1.2 jmcneill rawpart=$(get_rawpart) 40 1.2 jmcneill 41 1.2 jmcneill eval $(/sbin/fdisk -S $disk) 42 1.2 jmcneill if [ ! "$PART1ID" = "169" ]; then 43 1.2 jmcneill warn "No NetBSD partition found in MBR partition #1" 44 1.2 jmcneill return 45 1.2 jmcneill fi 46 1.2 jmcneill 47 1.2 jmcneill ts=$(($(get_total_sectors $disk) - ${PART1START})) 48 1.2 jmcneill rs=${PART1SIZE} 49 1.2 jmcneill 50 1.2 jmcneill if [ "$ts" = "$rs" ]; then 51 1.2 jmcneill return 52 1.2 jmcneill fi 53 1.2 jmcneill 54 1.2 jmcneill oldsize=$(($rs * 512 / 1024 / 1024)) 55 1.2 jmcneill newsize=$(($ts * 512 / 1024 / 1024)) 56 1.2 jmcneill echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)" 57 1.2 jmcneill /sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk} 58 1.2 jmcneill } 59 1.2 jmcneill 60 1.1 jmcneill grow_disklabel() 61 1.1 jmcneill { 62 1.1 jmcneill disk=$1 63 1.1 jmcneill part=$2 64 1.1 jmcneill rawpart=$(get_rawpart) 65 1.1 jmcneill 66 1.1 jmcneill ts=$(get_total_sectors $disk) 67 1.1 jmcneill rs=$(get_rawpart_sectors $disk $rawpart) 68 1.1 jmcneill 69 1.1 jmcneill if [ "$ts" = "$rs" ]; then 70 1.1 jmcneill return 71 1.1 jmcneill fi 72 1.1 jmcneill 73 1.1 jmcneill oldsize=$(($rs * 512 / 1024 / 1024)) 74 1.1 jmcneill newsize=$(($ts * 512 / 1024 / 1024)) 75 1.1 jmcneill echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)" 76 1.1 jmcneill printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \ 77 1.1 jmcneill disklabel -i $disk >/dev/null 78 1.1 jmcneill } 79 1.1 jmcneill 80 1.1 jmcneill resize_disklabel_start() 81 1.1 jmcneill { 82 1.1 jmcneill if [ x"${resize_disklabel_disk}" = "x" ]; then 83 1.3 jmcneill resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)" 84 1.1 jmcneill fi 85 1.1 jmcneill if [ x"${resize_disklabel_part}" = "x" ]; then 86 1.3 jmcneill resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) )))) 87 1.1 jmcneill fi 88 1.1 jmcneill 89 1.2 jmcneill grow_mbrpart "${resize_disklabel_disk}" 90 1.1 jmcneill grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}" 91 1.1 jmcneill } 92 1.1 jmcneill 93 1.1 jmcneill load_rc_config $name 94 1.1 jmcneill run_rc_command "$1" 95