Home | History | Annotate | Line # | Download | only in files
resize_disklabel revision 1.3
      1 #!/bin/sh
      2 #
      3 # $NetBSD: resize_disklabel,v 1.3 2018/10/06 09:58:55 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 		resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)"
     84 	fi
     85 	if [ x"${resize_disklabel_part}" = "x" ]; then
     86 		resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) ))))
     87 	fi
     88 
     89 	grow_mbrpart "${resize_disklabel_disk}"
     90 	grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}"
     91 }
     92 
     93 load_rc_config $name
     94 run_rc_command "$1"
     95