resize_disklabel revision 1.4
11.1Sjmcneill#!/bin/sh
21.1Sjmcneill#
31.4Smlelstv# $NetBSD: resize_disklabel,v 1.4 2023/02/18 07:58:34 mlelstv Exp $
41.1Sjmcneill#
51.1Sjmcneill
61.1Sjmcneill# PROVIDE: resize_disklabel
71.1Sjmcneill# REQUIRE: fsck_root
81.1Sjmcneill# BEFORE: resize_root
91.1Sjmcneill
101.1Sjmcneill$_rc_subr_loaded . /etc/rc.subr
111.1Sjmcneill
121.1Sjmcneillname="resize_disklabel"
131.1Sjmcneillrcvar=$name
141.1Sjmcneillstart_cmd="resize_disklabel_start"
151.1Sjmcneillstop_cmd=":"
161.1Sjmcneill
171.1Sjmcneillget_rawpart()
181.1Sjmcneill{
191.4Smlelstv	local partno
201.4Smlelstv
211.1Sjmcneill	partno=$(/sbin/sysctl -n kern.rawpartition)
221.4Smlelstv	printf "$(printf \\\\%o $((partno + 97)))"
231.1Sjmcneill}
241.1Sjmcneill
251.1Sjmcneillget_total_sectors()
261.1Sjmcneill{
271.4Smlelstv	local disk
281.4Smlelstv
291.1Sjmcneill	disk=$1
301.4Smlelstv	/sbin/disklabel -t "$disk" \
311.4Smlelstv	| sed -ne 's/.*:su#\([0-9]*\):.*/\1/p'
321.1Sjmcneill}
331.1Sjmcneill
341.1Sjmcneillget_rawpart_sectors()
351.1Sjmcneill{
361.4Smlelstv	local disk rawpart
371.4Smlelstv
381.1Sjmcneill	disk=$1
391.1Sjmcneill	rawpart=$2
401.4Smlelstv	/sbin/disklabel -t "$disk" \
411.4Smlelstv	| sed -ne 's/.*:p'"$rawpart"'#\([0-9]*\):.*/\1/p'
421.1Sjmcneill}
431.1Sjmcneill
441.2Sjmcneillgrow_mbrpart()
451.2Sjmcneill{
461.4Smlelstv	local disk rawpart ts rs oldsize newsize
471.4Smlelstv
481.2Sjmcneill	disk=$1
491.2Sjmcneill	rawpart=$(get_rawpart)
501.2Sjmcneill
511.2Sjmcneill	eval $(/sbin/fdisk -S $disk)
521.2Sjmcneill	if [ ! "$PART1ID" = "169" ]; then
531.2Sjmcneill		warn "No NetBSD partition found in MBR partition #1"
541.2Sjmcneill		return
551.2Sjmcneill	fi
561.2Sjmcneill
571.4Smlelstv	ts=$((${DLSIZE} - ${PART1START}))
581.2Sjmcneill	rs=${PART1SIZE}
591.2Sjmcneill
601.2Sjmcneill	if [ "$ts" = "$rs" ]; then
611.2Sjmcneill		return
621.2Sjmcneill	fi
631.2Sjmcneill
641.4Smlelstv	oldsize=$(($rs / 2048))
651.4Smlelstv	newsize=$(($ts / 2048))
661.2Sjmcneill	echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)"
671.2Sjmcneill	/sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk}
681.2Sjmcneill}
691.2Sjmcneill
701.1Sjmcneillgrow_disklabel()
711.1Sjmcneill{
721.4Smlelstv	local disk part rawpart ts rs oldsize newsize
731.4Smlelstv
741.1Sjmcneill	disk=$1
751.1Sjmcneill	part=$2
761.1Sjmcneill	rawpart=$(get_rawpart)
771.1Sjmcneill
781.1Sjmcneill	ts=$(get_total_sectors $disk)
791.1Sjmcneill	rs=$(get_rawpart_sectors $disk $rawpart)
801.1Sjmcneill
811.1Sjmcneill	if [ "$ts" = "$rs" ]; then
821.1Sjmcneill		return
831.1Sjmcneill	fi
841.1Sjmcneill
851.4Smlelstv	oldsize=$(($rs / 2048))
861.4Smlelstv	newsize=$(($ts / 2048))
871.1Sjmcneill	echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)"
881.1Sjmcneill	printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \
891.1Sjmcneill	    disklabel -i $disk >/dev/null
901.1Sjmcneill}
911.1Sjmcneill
921.1Sjmcneillresize_disklabel_start()
931.1Sjmcneill{
941.1Sjmcneill	if [ x"${resize_disklabel_disk}" = "x" ]; then
951.3Sjmcneill		resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)"
961.1Sjmcneill	fi
971.1Sjmcneill	if [ x"${resize_disklabel_part}" = "x" ]; then
981.3Sjmcneill		resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) ))))
991.1Sjmcneill	fi
1001.1Sjmcneill
1011.2Sjmcneill	grow_mbrpart "${resize_disklabel_disk}"
1021.1Sjmcneill	grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}"
1031.1Sjmcneill}
1041.1Sjmcneill
1051.1Sjmcneillload_rc_config $name
1061.1Sjmcneillrun_rc_command "$1"
107