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