#!/bin/sh # # $NetBSD: resize_disklabel,v 1.5 2023/03/18 11:36:23 mlelstv Exp $ # # PROVIDE: resize_disklabel # REQUIRE: fsck_root # BEFORE: resize_root $_rc_subr_loaded . /etc/rc.subr name="resize_disklabel" rcvar=$name start_cmd="resize_disklabel_start" stop_cmd=":" get_rawpart() { local partno partno=$(/sbin/sysctl -n kern.rawpartition) printf "$(printf \\\\%o $((partno + 97)))" } get_total_sectors() { local disk disk=$1 /sbin/drvctl -p "$disk" disk-info/geometry/sectors-per-unit } get_rawpart_sectors() { local disk rawpart disk=$1 rawpart=$2 /sbin/disklabel -t "$disk" \ | sed -ne 's/.*:p'"$rawpart"'#\([0-9]*\):.*/\1/p' } grow_mbrpart() { local disk rawpart ts rs oldsize newsize disk=$1 rawpart=$(get_rawpart) eval $(/sbin/fdisk -S $disk) if [ ! "$PART1ID" = "169" ]; then warn "No NetBSD partition found in MBR partition #1" return fi ts=$((${DLSIZE} - ${PART1START})) rs=${PART1SIZE} if [ "$ts" = "$rs" ]; then return fi oldsize=$(($rs / 2048)) newsize=$(($ts / 2048)) echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)" /sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk} } grow_disklabel() { local disk part rawpart ts rs oldsize newsize disk=$1 part=$2 rawpart=$(get_rawpart) ts=$(get_total_sectors $disk) rs=$(get_rawpart_sectors $disk $rawpart) if [ "$ts" = "$rs" ]; then return fi oldsize=$(($rs / 2048)) newsize=$(($ts / 2048)) echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)" printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \ disklabel -i $disk >/dev/null } resize_disklabel_start() { if [ x"${resize_disklabel_disk}" = "x" ]; then resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)" fi if [ x"${resize_disklabel_part}" = "x" ]; then resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) )))) fi grow_mbrpart "${resize_disklabel_disk}" grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}" } load_rc_config $name run_rc_command "$1"