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