1#!/bin/sh 2# 3# $NetBSD: resize_disklabel,v 1.5 2023/03/18 11:36:23 mlelstv Exp $ 4# 5 6# PROVIDE: resize_disklabel 7# REQUIRE: fsck_root 8# BEFORE: resize_root 9 10$_rc_subr_loaded . /etc/rc.subr 11 12name="resize_disklabel" 13rcvar=$name 14start_cmd="resize_disklabel_start" 15stop_cmd=":" 16 17get_rawpart() 18{ 19 local partno 20 21 partno=$(/sbin/sysctl -n kern.rawpartition) 22 printf "$(printf \\\\%o $((partno + 97)))" 23} 24 25get_total_sectors() 26{ 27 local disk 28 29 disk=$1 30 /sbin/drvctl -p "$disk" disk-info/geometry/sectors-per-unit 31} 32 33get_rawpart_sectors() 34{ 35 local disk rawpart 36 37 disk=$1 38 rawpart=$2 39 /sbin/disklabel -t "$disk" \ 40 | sed -ne 's/.*:p'"$rawpart"'#\([0-9]*\):.*/\1/p' 41} 42 43grow_mbrpart() 44{ 45 local disk rawpart ts rs oldsize newsize 46 47 disk=$1 48 rawpart=$(get_rawpart) 49 50 eval $(/sbin/fdisk -S $disk) 51 if [ ! "$PART1ID" = "169" ]; then 52 warn "No NetBSD partition found in MBR partition #1" 53 return 54 fi 55 56 ts=$((${DLSIZE} - ${PART1START})) 57 rs=${PART1SIZE} 58 59 if [ "$ts" = "$rs" ]; then 60 return 61 fi 62 63 oldsize=$(($rs / 2048)) 64 newsize=$(($ts / 2048)) 65 echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)" 66 /sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk} 67} 68 69grow_disklabel() 70{ 71 local disk part rawpart ts rs oldsize newsize 72 73 disk=$1 74 part=$2 75 rawpart=$(get_rawpart) 76 77 ts=$(get_total_sectors $disk) 78 rs=$(get_rawpart_sectors $disk $rawpart) 79 80 if [ "$ts" = "$rs" ]; then 81 return 82 fi 83 84 oldsize=$(($rs / 2048)) 85 newsize=$(($ts / 2048)) 86 echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)" 87 printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \ 88 disklabel -i $disk >/dev/null 89} 90 91resize_disklabel_start() 92{ 93 if [ x"${resize_disklabel_disk}" = "x" ]; then 94 resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)" 95 fi 96 if [ x"${resize_disklabel_part}" = "x" ]; then 97 resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) )))) 98 fi 99 100 grow_mbrpart "${resize_disklabel_disk}" 101 grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}" 102} 103 104load_rc_config $name 105run_rc_command "$1" 106