1d32faae6Sjmcneill#!/bin/sh 2d32faae6Sjmcneill# 3*5d501e0cSmlelstv# $NetBSD: resize_disklabel,v 1.5 2023/03/18 11:36:23 mlelstv Exp $ 4d32faae6Sjmcneill# 5d32faae6Sjmcneill 6d32faae6Sjmcneill# PROVIDE: resize_disklabel 7d32faae6Sjmcneill# REQUIRE: fsck_root 8d32faae6Sjmcneill# BEFORE: resize_root 9d32faae6Sjmcneill 10d32faae6Sjmcneill$_rc_subr_loaded . /etc/rc.subr 11d32faae6Sjmcneill 12d32faae6Sjmcneillname="resize_disklabel" 13d32faae6Sjmcneillrcvar=$name 14d32faae6Sjmcneillstart_cmd="resize_disklabel_start" 15d32faae6Sjmcneillstop_cmd=":" 16d32faae6Sjmcneill 17d32faae6Sjmcneillget_rawpart() 18d32faae6Sjmcneill{ 199921d008Smlelstv local partno 209921d008Smlelstv 21d32faae6Sjmcneill partno=$(/sbin/sysctl -n kern.rawpartition) 229921d008Smlelstv printf "$(printf \\\\%o $((partno + 97)))" 23d32faae6Sjmcneill} 24d32faae6Sjmcneill 25d32faae6Sjmcneillget_total_sectors() 26d32faae6Sjmcneill{ 279921d008Smlelstv local disk 289921d008Smlelstv 29d32faae6Sjmcneill disk=$1 30*5d501e0cSmlelstv /sbin/drvctl -p "$disk" disk-info/geometry/sectors-per-unit 31d32faae6Sjmcneill} 32d32faae6Sjmcneill 33d32faae6Sjmcneillget_rawpart_sectors() 34d32faae6Sjmcneill{ 359921d008Smlelstv local disk rawpart 369921d008Smlelstv 37d32faae6Sjmcneill disk=$1 38d32faae6Sjmcneill rawpart=$2 399921d008Smlelstv /sbin/disklabel -t "$disk" \ 409921d008Smlelstv | sed -ne 's/.*:p'"$rawpart"'#\([0-9]*\):.*/\1/p' 41d32faae6Sjmcneill} 42d32faae6Sjmcneill 43fa18b035Sjmcneillgrow_mbrpart() 44fa18b035Sjmcneill{ 459921d008Smlelstv local disk rawpart ts rs oldsize newsize 469921d008Smlelstv 47fa18b035Sjmcneill disk=$1 48fa18b035Sjmcneill rawpart=$(get_rawpart) 49fa18b035Sjmcneill 50fa18b035Sjmcneill eval $(/sbin/fdisk -S $disk) 51fa18b035Sjmcneill if [ ! "$PART1ID" = "169" ]; then 52fa18b035Sjmcneill warn "No NetBSD partition found in MBR partition #1" 53fa18b035Sjmcneill return 54fa18b035Sjmcneill fi 55fa18b035Sjmcneill 569921d008Smlelstv ts=$((${DLSIZE} - ${PART1START})) 57fa18b035Sjmcneill rs=${PART1SIZE} 58fa18b035Sjmcneill 59fa18b035Sjmcneill if [ "$ts" = "$rs" ]; then 60fa18b035Sjmcneill return 61fa18b035Sjmcneill fi 62fa18b035Sjmcneill 639921d008Smlelstv oldsize=$(($rs / 2048)) 649921d008Smlelstv newsize=$(($ts / 2048)) 65fa18b035Sjmcneill echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)" 66fa18b035Sjmcneill /sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk} 67fa18b035Sjmcneill} 68fa18b035Sjmcneill 69d32faae6Sjmcneillgrow_disklabel() 70d32faae6Sjmcneill{ 719921d008Smlelstv local disk part rawpart ts rs oldsize newsize 729921d008Smlelstv 73d32faae6Sjmcneill disk=$1 74d32faae6Sjmcneill part=$2 75d32faae6Sjmcneill rawpart=$(get_rawpart) 76d32faae6Sjmcneill 77d32faae6Sjmcneill ts=$(get_total_sectors $disk) 78d32faae6Sjmcneill rs=$(get_rawpart_sectors $disk $rawpart) 79d32faae6Sjmcneill 80d32faae6Sjmcneill if [ "$ts" = "$rs" ]; then 81d32faae6Sjmcneill return 82d32faae6Sjmcneill fi 83d32faae6Sjmcneill 849921d008Smlelstv oldsize=$(($rs / 2048)) 859921d008Smlelstv newsize=$(($ts / 2048)) 86d32faae6Sjmcneill echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)" 87d32faae6Sjmcneill printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \ 88d32faae6Sjmcneill disklabel -i $disk >/dev/null 89d32faae6Sjmcneill} 90d32faae6Sjmcneill 91d32faae6Sjmcneillresize_disklabel_start() 92d32faae6Sjmcneill{ 93d32faae6Sjmcneill if [ x"${resize_disklabel_disk}" = "x" ]; then 94dde6e2aeSjmcneill resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)" 95d32faae6Sjmcneill fi 96d32faae6Sjmcneill if [ x"${resize_disklabel_part}" = "x" ]; then 97dde6e2aeSjmcneill resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) )))) 98d32faae6Sjmcneill fi 99d32faae6Sjmcneill 100fa18b035Sjmcneill grow_mbrpart "${resize_disklabel_disk}" 101d32faae6Sjmcneill grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}" 102d32faae6Sjmcneill} 103d32faae6Sjmcneill 104d32faae6Sjmcneillload_rc_config $name 105d32faae6Sjmcneillrun_rc_command "$1" 106