xref: /netbsd-src/distrib/utils/embedded/files/resize_disklabel (revision 76c7fc5f6b13ed0b1508e6b313e88e59977ed78e)
1#!/bin/sh
2#
3# $NetBSD: resize_disklabel,v 1.3 2018/10/06 09:58:55 jmcneill 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	partno=$(/sbin/sysctl -n kern.rawpartition)
20	test $partno = 2 && echo c || echo d
21}
22
23get_total_sectors()
24{
25	disk=$1
26	/sbin/drvctl -p $disk disk-info/geometry/sectors-per-unit
27}
28
29get_rawpart_sectors()
30{
31	disk=$1
32	rawpart=$2
33	/sbin/disklabel $disk | grep "^ $rawpart:" | awk '{ print $2; }'
34}
35
36grow_mbrpart()
37{
38	disk=$1
39	rawpart=$(get_rawpart)
40
41	eval $(/sbin/fdisk -S $disk)
42	if [ ! "$PART1ID" = "169" ]; then
43		warn "No NetBSD partition found in MBR partition #1"
44		return
45	fi
46
47	ts=$(($(get_total_sectors $disk) - ${PART1START}))
48	rs=${PART1SIZE}
49
50	if [ "$ts" = "$rs" ]; then
51		return
52	fi
53
54	oldsize=$(($rs * 512 / 1024 / 1024))
55	newsize=$(($ts * 512 / 1024 / 1024))
56	echo "Growing $disk MBR partition #1 (${oldsize}MB -> ${newsize}MB)"
57	/sbin/fdisk -f -u -1 -s 169/${PART1START}/${ts} ${disk}
58}
59
60grow_disklabel()
61{
62	disk=$1
63	part=$2
64	rawpart=$(get_rawpart)
65
66	ts=$(get_total_sectors $disk)
67	rs=$(get_rawpart_sectors $disk $rawpart)
68
69	if [ "$ts" = "$rs" ]; then
70		return
71	fi
72
73	oldsize=$(($rs * 512 / 1024 / 1024))
74	newsize=$(($ts * 512 / 1024 / 1024))
75	echo "Growing $disk disklabel (${oldsize}MB -> ${newsize}MB)"
76	printf "A\ny\n$part\n\n\n\$\nc\n\n\n\$\nd\n\n\n\$\nW\ny\nQ\n" | \
77	    disklabel -i $disk >/dev/null
78}
79
80resize_disklabel_start()
81{
82	if [ x"${resize_disklabel_disk}" = "x" ]; then
83		resize_disklabel_disk="$(/sbin/sysctl -n kern.root_device)"
84	fi
85	if [ x"${resize_disklabel_part}" = "x" ]; then
86		resize_disklabel_part=$(printf \\$(printf '%03o' $(( 97 + $(sysctl -n kern.root_partition) ))))
87	fi
88
89	grow_mbrpart "${resize_disklabel_disk}"
90	grow_disklabel "${resize_disklabel_disk}" "${resize_disklabel_part}"
91}
92
93load_rc_config $name
94run_rc_command "$1"
95