Home | History | Annotate | Line # | Download | only in files
resize_disklabel revision 1.4
      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