xref: /netbsd-src/etc/rc.d/resize_root (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1#!/bin/sh
2#
3# $NetBSD: resize_root,v 1.3 2015/04/07 18:02:11 jmcneill 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		esac
49
50		# skip non-root
51		if [ "${fs_file}" != "$rootmp" ]; then
52			continue
53		fi
54
55		if [ "${fs_vfstype}" != "ffs" ]; then
56			echo "Not resizing $rootmp: not an ffs file system"
57			return
58		fi
59
60		case "${fs_spec}" in
61		*:*)
62			echo "Not resizing $rootmp: network mount"
63			return
64			;;
65		esac
66
67		for opt in $(split_options "${fs_mntops}"); do
68			if [ "$opt" = "log" ];  then
69				echo "Not resizing $rootmp: logging unsupported"
70				return
71			fi
72		done
73
74		rootdev=${fs_spec%/*}/r${fs_spec##*/}
75		break
76	done < "${fstab_file}"
77
78	if [ -z "$rootdev" ]; then
79		echo "Not resizing $rootmp: not listed in ${fstab_file}"
80		return
81	fi
82
83	if resize_ffs -c $rootdev; then
84		echo "Resizing $rootmp"
85		if ! resize_ffs -y $resize_root_flags $rootdev; then
86		    echo "Error resizing root."
87		    stop_boot
88		fi
89		if [ ! -z "${resize_root_postcmd}" ]; then
90			${resize_root_postcmd}
91		fi
92	else
93		echo "Not resizing $rootmp: already correct size"
94	fi
95	return
96}
97
98load_rc_config $name
99run_rc_command "$1"
100