resize_disklabel revision 1.4
1#!/bin/sh
2#
3# $NetBSD: resize_disklabel,v 1.4 2023/02/18 07:58:34 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/disklabel -t "$disk" \
31	| sed -ne 's/.*:su#\([0-9]*\):.*/\1/p'
32}
33
34get_rawpart_sectors()
35{
36	local disk rawpart
37
38	disk=$1
39	rawpart=$2
40	/sbin/disklabel -t "$disk" \
41	| sed -ne 's/.*:p'"$rawpart"'#\([0-9]*\):.*/\1/p'
42}
43
44grow_mbrpart()
45{
46	local disk rawpart ts rs oldsize newsize
47
48	disk=$1
49	rawpart=$(get_rawpart)
50
51	eval $(/sbin/fdisk -S $disk)
52	if [ ! "$PART1ID" = "169" ]; then
53		warn "No NetBSD partition found in MBR partition #1"
54		return
55	fi
56
57	ts=$((${DLSIZE} - ${PART1START}))
58	rs=${PART1SIZE}
59
60	if [ "$ts" = "$rs" ]; then
61		return
62	fi
63
64	oldsize=$(($rs / 2048))
65	newsize=$(($ts / 2048))
66	echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)"
67	/sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk}
68}
69
70grow_disklabel()
71{
72	local disk part rawpart ts rs oldsize newsize
73
74	disk=$1
75	part=$2
76	rawpart=$(get_rawpart)
77
78	ts=$(get_total_sectors $disk)
79	rs=$(get_rawpart_sectors $disk $rawpart)
80
81	if [ "$ts" = "$rs" ]; then
82		return
83	fi
84
85	oldsize=$(($rs / 2048))
86	newsize=$(($ts / 2048))
87	echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)"
88	printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \
89	    disklabel -i $disk >/dev/null
90}
91
92resize_disklabel_start()
93{
94	if [ x"${resize_disklabel_disk}" = "x" ]; then
95		resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)"
96	fi
97	if [ x"${resize_disklabel_part}" = "x" ]; then
98		resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) ))))
99	fi
100
101	grow_mbrpart "${resize_disklabel_disk}"
102	grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}"
103}
104
105load_rc_config $name
106run_rc_command "$1"
107