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