svn commit: r273955 - in head: etc/rc.d share/man/man7

John-Mark Gurney jmg at FreeBSD.org
Sun Nov 2 00:11:27 UTC 2014


Author: jmg
Date: Sun Nov  2 00:11:25 2014
New Revision: 273955
URL: https://svnweb.freebsd.org/changeset/base/273955

Log:
  add an rc.d script to automatically grow the specified FS...  It has
  been tested on both MBR and GPT...  It won't be enabled until you add
  growfs_enable="YES" and will only run on first boot..

Added:
  head/etc/rc.d/growfs   (contents, props changed)
  head/share/man/man7/growfs.7   (contents, props changed)
Modified:
  head/etc/rc.d/Makefile
  head/share/man/man7/Makefile

Modified: head/etc/rc.d/Makefile
==============================================================================
--- head/etc/rc.d/Makefile	Sun Nov  2 00:05:52 2014	(r273954)
+++ head/etc/rc.d/Makefile	Sun Nov  2 00:11:25 2014	(r273955)
@@ -49,6 +49,7 @@ FILES=	DAEMON \
 	geli \
 	geli2 \
 	gptboot \
+	growfs \
 	gssd \
 	hastd \
 	${_hcsecd} \

Added: head/etc/rc.d/growfs
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/etc/rc.d/growfs	Sun Nov  2 00:11:25 2014	(r273955)
@@ -0,0 +1,98 @@
+#!/bin/sh
+#
+# Copyright 2014 John-Mark Gurney
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# PROVIDE: growfs
+# BEFORE: sysctl
+# KEYWORD: firstboot
+
+# This allows us to distribute a image
+# and have it work on essentially any size drive.
+#
+# TODO: Figure out where this should really be ordered.
+# I suspect it should go just after fsck but before mountcritlocal
+# but it's hard to tell for sure because of the bug described
+# below.
+# 
+
+. /etc/rc.subr
+
+name="growfs"
+start_cmd="growfs_start"
+stop_cmd=":"
+rcvar="growfs_enable"
+
+growfs_start ()
+{
+    echo "Growing root partition to fill device"
+    rootdev=$(df / | tail -n 1 | awk '{ sub("/dev/", "", $1); print $1 }')
+    if [ x"$rootdev" = x"${rootdev%/*}" ]; then
+	# raw device
+	rawdev="$rootdev"
+    else
+	rawdev=$(glabel status | awk '$1 == "'"$rootdev"'" { print $3 }')
+	if [ x"$rawdev" = x"" ]; then
+	    echo "Can't figure out device for: $rootdev"
+	    return
+	fi
+    fi
+
+    sysctl -b kern.geom.conftxt | awk '
+{
+	lvl=$1
+	device[lvl] = $3
+	type[lvl] = $2
+	idx[lvl] = $7
+	parttype[lvl] = $13
+	if (dev == $3) {
+		for (i = 1; i <= lvl; i++) {
+			# resize
+			if (type[i] == "PART") {
+				pdev = device[i - 1]
+				cmd[i] = "gpart resize -i " idx[i] " " pdev
+				if (parttype[i] == "GPT")
+					cmd[i] = "gpart recover " pdev " ; " cmd[i]
+			} else if (type[i] == "LABEL") {
+				continue
+			} else {
+				print "unhandled type: " type[i]
+				exit 1
+			}
+		}
+		for (i = 1; i <= lvl; i++) {
+			if (cmd[i])
+				system(cmd[i])
+		}
+		exit 0
+	}
+}' dev="$rawdev"
+    growfs -y /dev/"$rootdev"
+}
+
+load_rc_config $name
+run_rc_command "$1"

Modified: head/share/man/man7/Makefile
==============================================================================
--- head/share/man/man7/Makefile	Sun Nov  2 00:05:52 2014	(r273954)
+++ head/share/man/man7/Makefile	Sun Nov  2 00:11:25 2014	(r273955)
@@ -14,6 +14,7 @@ MAN=	adding_user.7 \
 	environ.7 \
 	ffs.7 \
 	firewall.7 \
+	growfs.7 \
 	hier.7 \
 	hostname.7 \
 	intro.7 \

Added: head/share/man/man7/growfs.7
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/man/man7/growfs.7	Sun Nov  2 00:11:25 2014	(r273955)
@@ -0,0 +1,64 @@
+.\" Copyright 2014 John-Mark Gurney
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd November 1, 2014
+.Dt GROWFS 7
+.Os
+.Sh NAME
+.Nm growfs
+.Nd start up script to grow the root file-system.
+.Sh DESCRIPTION
+The following options in
+.Pa /etc/rc.conf
+control the behavior of
+.Nm :
+.Bl -tag -width ".Va growfs_enable" -offset indent
+.It Va growfs_enable
+.Pq Dq Li NO
+If set to
+.Dq Li YES ,
+the first time the machine boots, the root file-system will be automatically
+expanded, if possible, to fill up all available space after it.
+.El
+.Pp
+To expand the root file-system with-out rebooting, run the following command:
+.Dl % /etc/rc.d/growfs onestart
+.Sh IMPLEMENTATION NOTES
+The script requires that
+.Pa awk
+be present and on the path.
+This usually means that
+.Pa /usr
+should be mounted prior to running the script.
+.Sh FILES
+.Pa /etc/rc.conf
+.Sh EXIT STATUS
+.Ex -std
+.Sh SEE ALSO
+.Xr rc.conf 5
+.Sh AUTHORS
+The man page and script were written by
+.An John-Mark Gurney Aq Mt jmg at FreeBSD.org .


More information about the svn-src-head mailing list