11.1Sjmcneill#!/bin/sh 21.1Sjmcneill# 31.5Smlelstv# $NetBSD: resize_disklabel,v 1.5 2023/03/18 11:36:23 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.5Smlelstv /sbin/drvctl -p "$disk" disk-info/geometry/sectors-per-unit 311.1Sjmcneill} 321.1Sjmcneill 331.1Sjmcneillget_rawpart_sectors() 341.1Sjmcneill{ 351.4Smlelstv local disk rawpart 361.4Smlelstv 371.1Sjmcneill disk=$1 381.1Sjmcneill rawpart=$2 391.4Smlelstv /sbin/disklabel -t "$disk" \ 401.4Smlelstv | sed -ne 's/.*:p'"$rawpart"'#\([0-9]*\):.*/\1/p' 411.1Sjmcneill} 421.1Sjmcneill 431.2Sjmcneillgrow_mbrpart() 441.2Sjmcneill{ 451.4Smlelstv local disk rawpart ts rs oldsize newsize 461.4Smlelstv 471.2Sjmcneill disk=$1 481.2Sjmcneill rawpart=$(get_rawpart) 491.2Sjmcneill 501.2Sjmcneill eval $(/sbin/fdisk -S $disk) 511.2Sjmcneill if [ ! "$PART1ID" = "169" ]; then 521.2Sjmcneill warn "No NetBSD partition found in MBR partition #1" 531.2Sjmcneill return 541.2Sjmcneill fi 551.2Sjmcneill 561.4Smlelstv ts=$((${DLSIZE} - ${PART1START})) 571.2Sjmcneill rs=${PART1SIZE} 581.2Sjmcneill 591.2Sjmcneill if [ "$ts" = "$rs" ]; then 601.2Sjmcneill return 611.2Sjmcneill fi 621.2Sjmcneill 631.4Smlelstv oldsize=$(($rs / 2048)) 641.4Smlelstv newsize=$(($ts / 2048)) 651.2Sjmcneill echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)" 661.2Sjmcneill /sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk} 671.2Sjmcneill} 681.2Sjmcneill 691.1Sjmcneillgrow_disklabel() 701.1Sjmcneill{ 711.4Smlelstv local disk part rawpart ts rs oldsize newsize 721.4Smlelstv 731.1Sjmcneill disk=$1 741.1Sjmcneill part=$2 751.1Sjmcneill rawpart=$(get_rawpart) 761.1Sjmcneill 771.1Sjmcneill ts=$(get_total_sectors $disk) 781.1Sjmcneill rs=$(get_rawpart_sectors $disk $rawpart) 791.1Sjmcneill 801.1Sjmcneill if [ "$ts" = "$rs" ]; then 811.1Sjmcneill return 821.1Sjmcneill fi 831.1Sjmcneill 841.4Smlelstv oldsize=$(($rs / 2048)) 851.4Smlelstv newsize=$(($ts / 2048)) 861.1Sjmcneill echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)" 871.1Sjmcneill printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \ 881.1Sjmcneill disklabel -i $disk >/dev/null 891.1Sjmcneill} 901.1Sjmcneill 911.1Sjmcneillresize_disklabel_start() 921.1Sjmcneill{ 931.1Sjmcneill if [ x"${resize_disklabel_disk}" = "x" ]; then 941.3Sjmcneill resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)" 951.1Sjmcneill fi 961.1Sjmcneill if [ x"${resize_disklabel_part}" = "x" ]; then 971.3Sjmcneill resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) )))) 981.1Sjmcneill fi 991.1Sjmcneill 1001.2Sjmcneill grow_mbrpart "${resize_disklabel_disk}" 1011.1Sjmcneill grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}" 1021.1Sjmcneill} 1031.1Sjmcneill 1041.1Sjmcneillload_rc_config $name 1051.1Sjmcneillrun_rc_command "$1" 106