xref: /netbsd-src/distrib/utils/embedded/files/resize_disklabel (revision 5d501e0c8a46c7755b4f96b8d045cc92f1a72fd5)
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