xref: /netbsd-src/etc/rc.d/resize_root (revision b23f276898cad935b8788bf2b503e3e0dd60ffe3)
1#!/bin/sh
2#
3# $NetBSD: resize_root,v 1.6 2023/10/04 00:04:42 gutteridge Exp $
4#
5
6# PROVIDE: resize_root
7# REQUIRE: fsck_root
8# KEYWORD: interactive
9
10$_rc_subr_loaded . /etc/rc.subr
11
12name="resize_root"
13rcvar=$name
14start_cmd="resize_root_start"
15stop_cmd=":"
16fstab_file=/etc/fstab
17rootmp="/"
18
19split_options()
20{
21	local IFS
22	IFS=,
23	OPTS=$1
24	for i in $OPTS; do
25		echo $i
26	done
27}
28
29resize_root_start()
30{
31	# if ! checkyesno $rcvar; then
32	# 	echo "Not resizing $rootmp: resize_root must be set to YES/yes/..."
33	# 	return
34	# fi
35
36	trap : 2 		# Ignore SIGINT, SIGQUIT, so we
37	trap : 3		# enter single-user mode on failure.
38
39	# Do nothing if root file system is not mentioned in /etc/fstab, or if
40	# root file system seems to be a network mount, or if root file system
41	# is not ffs or if logging is enabled.
42	rootdev=""
43	while read fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno
44	do
45		# skip comment or blank line
46		case "${fs_spec}" in
47		\#*|'') continue ;;
48		ROOT\.*) fs_spec="/dev/$(sysctl -n kern.root_device)${fs_spec#ROOT.}" ;;
49		esac
50
51		# skip non-root
52		if [ "${fs_file}" != "$rootmp" ]; then
53			continue
54		fi
55
56		if [ "${fs_vfstype}" != "ffs" ]; then
57			echo "Not resizing $rootmp: not an ffs file system"
58			return
59		fi
60
61		case "${fs_spec}" in
62		*:*)
63			echo "Not resizing $rootmp: network mount"
64			return
65			;;
66		esac
67
68		for opt in $(split_options "${fs_mntops}"); do
69			if [ "$opt" = "log" ];  then
70				echo "Not resizing $rootmp: logging unsupported"
71				return
72			fi
73		done
74
75		rootdev=${fs_spec}
76		break
77	done < "${fstab_file}"
78
79	if [ -z "$rootdev" ]; then
80		echo "Not resizing $rootmp: not listed in ${fstab_file}"
81		return
82	fi
83
84	if resize_ffs -c "$rootdev"; then
85		echo "Resizing $rootmp ($rootdev)"
86		if ! resize_ffs -y $resize_root_flags "$rootdev"; then
87		    echo "Error resizing root."
88		    stop_boot
89		fi
90		if [ ! -z "${resize_root_postcmd}" ]; then
91			${resize_root_postcmd}
92		fi
93	else
94		echo "Not resizing $rootmp ($rootdev): already correct size"
95	fi
96	return
97}
98
99load_rc_config $name
100run_rc_command "$1"
101