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