Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107200033
D37462.id113882.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D37462.id113882.diff
View Options
diff --git a/libexec/rc/rc.d/growfs b/libexec/rc/rc.d/growfs
--- a/libexec/rc/rc.d/growfs
+++ b/libexec/rc/rc.d/growfs
@@ -1,5 +1,6 @@
#!/bin/sh
#
+# Copyright 2022 Michael J. Karels
# Copyright 2014 John-Mark Gurney
# All rights reserved.
#
@@ -32,8 +33,9 @@
# BEFORE: root
# KEYWORD: firstboot
-# This allows us to distribute an image
-# and have it work on essentially any size drive.
+# Grow root partition to fill available space, optionally adding a swap
+# partition at the end. This allows us to distribute an image and
+# have it work on essentially any size drive.
# Note that this uses awk(1), and thus will not work if /usr is on a separate
# filesystem. We need to run early, because there might be not enough free
@@ -48,7 +50,7 @@
stop_cmd=":"
rcvar="growfs_enable"
-growfs_get_diskdev ()
+growfs_get_diskdev()
{
local _search=${1}
sysctl -b kern.geom.conftxt |
@@ -61,8 +63,47 @@
done
}
-growfs_start ()
+# Compute upper bound on swap partition size (if added), based on physmem
+# and vm.swap_maxpages / 2 (the limit that elicits a warning).
+growfs_swap_max()
{
+ memsize=$(sysctl -n hw.physmem)
+ memsizeMB=$(($memsize / (1024 * 1024)))
+
+ if [ $memsizeMB -lt 4096 ]
+ then
+ swapmax=$(($memsize * 2))
+ elif [ $memsizeMB -lt 8192 ]
+ then
+ swapmax=$((8192 * 1024 * 1024))
+ else
+ swapmax=$memsize
+ fi
+
+ pagesize=$(sysctl -n hw.pagesize)
+ vm_swap_max=$(($(sysctl -n vm.swap_maxpages) / 2 * $pagesize))
+
+ if [ $swapmax -gt $vm_swap_max ]
+ then
+ $swapmax=$vm_swap_max
+ fi
+ echo -n "$swapmax"
+}
+
+# Find newly-added swap partition on parent device ($1).
+growfs_last_swap()
+{
+ swapdev=$(gpart list $1 | awk '
+ $2 == "Name:" { dev = $3 }
+ $1 == "type:" && $2 == "freebsd-swap" { swapdev = dev }
+ END { print swapdev }
+ ')
+ echo -n $swapdev
+}
+
+growfs_start()
+{
+ verbose=0
echo "Growing root partition to fill device"
FSTYPE=$(mount -p | awk '{ if ( $2 == "/") { print $3 }}')
FSDEV=$(mount -p | awk '{ if ( $2 == "/") { print $1 }}')
@@ -100,19 +141,125 @@
diskdev=${rootdev}
fi
+ # Check kenv for growfs_swap_size; if not present,
+ # check $growfs_swap_size from /etc/rc.conf.
+ # A value of 0 suppresses swap addition,
+ # "" (or unset) specifies the default;
+ # other values indicate the size in bytes.
+ # If default, check whether swap is already in fstab;
+ # if so, don't add another.
+ addswap=1
+ swapsize="$(kenv -q growfs_swap_size 2>/dev/null)"
+ case "$swapsize" in
+ "0") addswap=0
+ ;;
+ "") case "$growfs_swap_size" in
+ "0") addswap=0
+ ;;
+ "")
+ if ! awk '
+ /^#/ { next }
+ $3 == "swap" { exit 1 }
+ ' < /etc/fstab
+ then
+ addswap=0
+ fi
+ ;;
+ *) swapsize="$growfs_swap_size"
+ ;;
+ esac
+ ;;
+ *) ;;
+ esac
+
+ swaplim=$(growfs_swap_max)
+
+ [ $verbose -eq 1 ] && {
+ echo "diskdev is $diskdev"
+ echo "search is $search"
+ echo "swapsize is $swapsize"
+ echo "swaplim is $swaplim"
+ }
+
sysctl -b kern.geom.conftxt | awk '
{
+ verbose = 0
lvl=$1
device[lvl] = $3
type[lvl] = $2
idx[lvl] = $7
+ offset[lvl] = $9
parttype[lvl] = $13
+ size[lvl] = $4
+ if (verbose) print lvl, type[lvl], $3
+ if (type[lvl] == "DISK") {
+ disksize = size[lvl]
+ if (verbose)
+ print "disksize ", disksize
+ if (addswap == 1 && (size[lvl] > 15000000000 || swapsize > 0))
+ doing_swap = 1
+ else
+ doing_swap = 0
+ } else if (type[lvl] == "PART" && $11 == "freebsd-swap" && \
+ int(swapsize) == 0) {
+ # This finds swap only if it precedes root, e.g. preceding disk.
+ addswap = 0
+ doing_swap = 0
+ print "swap device exists, not adding swap"
+ }
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 (verbose)
+ print i, pdev, addswap, disksize, \
+ doing_swap
+ swapcmd = ""
+ # Allow swap if current root is < 40% of disk.
+ if (parttype[i] != "MBR" && doing_swap == 1 && \
+ (size[i] / disksize < 0.4 || \
+ swapsize > 0)) {
+ print "Adding swap partition"
+ if (int(swapsize) == 0) {
+ swapsize = int(disksize / 10)
+ if (swapsize > swaplim)
+ swapsize = swaplim
+ }
+ sector = $5
+ swapsize /= sector
+ if (verbose)
+ print "swapsize sectors",
+ swapsize
+ align = 4 * 1024 * 1024 / sector
+
+ # Estimate offset for swap; let
+ # gpart compute actual start and size.
+ # Assume expansion all goes into this
+ # partition for MBR case.
+ if (parttype[i - 1] == "MBR") {
+ if (verbose)
+ print "sz ", size[i - 1], \
+ " off ", offset[i - 1]
+ expand = size[0] - \
+ (size[i - 1] + offset[i - 1])
+ } else {
+ if (verbose)
+ print "sz ", size[i], \
+ " off ", offset[i]
+ expand = size[0] - \
+ (size[i] + offset[i])
+ }
+ if (verbose)
+ print "expand ", expand, \
+ " sz ", size[i]
+ swapbase = (expand + size[i]) / sector
+ swapbase -= swapsize + align
+ swapcmd = "gpart add -t freebsd-swap -a " align " -b " swapbase " " pdev "; kenv growfs_swap_pdev=" pdev " >/dev/null; "
+ if (verbose)
+ swapcmd = "set -x; " swapcmd
+ }
+ cmd[i] = swapcmd "gpart resize -i " idx[i] " " pdev
if (parttype[i] == "GPT")
cmd[i] = "gpart recover " pdev " ; " cmd[i]
} else if (type[i] == "LABEL") {
@@ -128,7 +275,7 @@
}
exit 0
}
-}' dev="$search"
+}' dev="$search" addswap="$addswap" swapsize="$swapsize" swaplim="$swaplim"
gpart commit "$diskdev" 2> /dev/null
case "$FSTYPE" in
ufs)
@@ -138,6 +285,20 @@
zpool online -e $pool $rootdev
;;
esac
+
+ # Get parent device of swap partition if one was added;
+ # if so, find swap device and label it.
+ pdev=$(kenv -q growfs_swap_pdev)
+ if [ -n "$pdev" ]
+ then
+ dev=$(growfs_last_swap "$pdev")
+ if [ -z "$dev" ]
+ then
+ echo "Swap partition not found on $pdev"
+ exit 0
+ fi
+ glabel label -v growfs_swap $dev
+ fi
}
load_rc_config $name
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Jan 12, 1:58 PM (20 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15769937
Default Alt Text
D37462.id113882.diff (5 KB)
Attached To
Mode
D37462: growfs script: add swap partition as well as growing root
Attached
Detach File
Event Timeline
Log In to Comment