aboutsummaryrefslogtreecommitdiff
path: root/etc/rc.d
diff options
context:
space:
mode:
authorJohn-Mark Gurney <jmg@FreeBSD.org>2014-11-02 00:11:25 +0000
committerJohn-Mark Gurney <jmg@FreeBSD.org>2014-11-02 00:11:25 +0000
commit7bd12696d701b3237bedb7a5e9e4f00ca258683d (patch)
treeba0557f8d593bbda6d9e3f79a4373642106aedd0 /etc/rc.d
parentcdcf242896502a01c42a947107b6dcf80cf09fae (diff)
downloadsrc-7bd12696d701b3237bedb7a5e9e4f00ca258683d.tar.gz
src-7bd12696d701b3237bedb7a5e9e4f00ca258683d.zip
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..
Notes
Notes: svn path=/head/; revision=273955
Diffstat (limited to 'etc/rc.d')
-rw-r--r--etc/rc.d/Makefile1
-rwxr-xr-xetc/rc.d/growfs98
2 files changed, 99 insertions, 0 deletions
diff --git a/etc/rc.d/Makefile b/etc/rc.d/Makefile
index 72b524709701..f42b207936e6 100644
--- a/etc/rc.d/Makefile
+++ b/etc/rc.d/Makefile
@@ -49,6 +49,7 @@ FILES= DAEMON \
geli \
geli2 \
gptboot \
+ growfs \
gssd \
hastd \
${_hcsecd} \
diff --git a/etc/rc.d/growfs b/etc/rc.d/growfs
new file mode 100755
index 000000000000..db87d29322c4
--- /dev/null
+++ b/etc/rc.d/growfs
@@ -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"