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