resize_disklabel revision 1.2
11.1Sjmcneill#!/bin/sh
21.1Sjmcneill#
31.2Sjmcneill# $NetBSD: resize_disklabel,v 1.2 2017/04/14 13:47:21 jmcneill 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.1Sjmcneill	partno=$(/sbin/sysctl -n kern.rawpartition)
201.1Sjmcneill	test $partno = 2 && echo c || echo d
211.1Sjmcneill}
221.1Sjmcneill
231.1Sjmcneillget_total_sectors()
241.1Sjmcneill{
251.1Sjmcneill	disk=$1
261.1Sjmcneill	/sbin/drvctl -p $disk disk-info/geometry/sectors-per-unit
271.1Sjmcneill}
281.1Sjmcneill
291.1Sjmcneillget_rawpart_sectors()
301.1Sjmcneill{
311.1Sjmcneill	disk=$1
321.1Sjmcneill	rawpart=$2
331.1Sjmcneill	/sbin/disklabel $disk | grep "^ $rawpart:" | awk '{ print $2; }'
341.1Sjmcneill}
351.1Sjmcneill
361.2Sjmcneillgrow_mbrpart()
371.2Sjmcneill{
381.2Sjmcneill	disk=$1
391.2Sjmcneill	rawpart=$(get_rawpart)
401.2Sjmcneill
411.2Sjmcneill	eval $(/sbin/fdisk -S $disk)
421.2Sjmcneill	if [ ! "$PART1ID" = "169" ]; then
431.2Sjmcneill		warn "No NetBSD partition found in MBR partition #1"
441.2Sjmcneill		return
451.2Sjmcneill	fi
461.2Sjmcneill
471.2Sjmcneill	ts=$(($(get_total_sectors $disk) - ${PART1START}))
481.2Sjmcneill	rs=${PART1SIZE}
491.2Sjmcneill
501.2Sjmcneill	if [ "$ts" = "$rs" ]; then
511.2Sjmcneill		return
521.2Sjmcneill	fi
531.2Sjmcneill
541.2Sjmcneill	oldsize=$(($rs * 512 / 1024 / 1024))
551.2Sjmcneill	newsize=$(($ts * 512 / 1024 / 1024))
561.2Sjmcneill	echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)"
571.2Sjmcneill	/sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk}
581.2Sjmcneill}
591.2Sjmcneill
601.1Sjmcneillgrow_disklabel()
611.1Sjmcneill{
621.1Sjmcneill	disk=$1
631.1Sjmcneill	part=$2
641.1Sjmcneill	rawpart=$(get_rawpart)
651.1Sjmcneill
661.1Sjmcneill	ts=$(get_total_sectors $disk)
671.1Sjmcneill	rs=$(get_rawpart_sectors $disk $rawpart)
681.1Sjmcneill
691.1Sjmcneill	if [ "$ts" = "$rs" ]; then
701.1Sjmcneill		return
711.1Sjmcneill	fi
721.1Sjmcneill
731.1Sjmcneill	oldsize=$(($rs * 512 / 1024 / 1024))
741.1Sjmcneill	newsize=$(($ts * 512 / 1024 / 1024))
751.1Sjmcneill	echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)"
761.1Sjmcneill	printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \
771.1Sjmcneill	    disklabel -i $disk >/dev/null
781.1Sjmcneill}
791.1Sjmcneill
801.1Sjmcneillresize_disklabel_start()
811.1Sjmcneill{
821.1Sjmcneill	if [ x"${resize_disklabel_disk}" = "x" ]; then
831.1Sjmcneill		warn "\${resize_disklabel_disk} is not set, not resizing disklabel"
841.1Sjmcneill		return
851.1Sjmcneill	fi
861.1Sjmcneill	if [ x"${resize_disklabel_part}" = "x" ]; then
871.1Sjmcneill		warn "\${resize_disklabel_part} is not set, not resizing disklabel"
881.1Sjmcneill		return
891.1Sjmcneill	fi
901.1Sjmcneill
911.2Sjmcneill	grow_mbrpart "${resize_disklabel_disk}"
921.1Sjmcneill	grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}"
931.1Sjmcneill}
941.1Sjmcneill
951.1Sjmcneillload_rc_config $name
961.1Sjmcneillrun_rc_command "$1"
97