From nobody Sun Dec 11 10:09:25 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4NVL8S3nF5z4k9fY; Sun, 11 Dec 2022 10:09:28 +0000 (UTC) (envelope-from gbe@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4NVL8S2qK9z43Bk; Sun, 11 Dec 2022 10:09:28 +0000 (UTC) (envelope-from gbe@freebsd.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1670753368; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Ee1/DojWSGqaI6MkDJTHYEcBDbncGV4mLi7iLcoHTuY=; b=pa6JIU+LCa95bDUyW7qZHlKanZQMZvonJgOIzuOgNkMdoFi2uVVZMpEm7bJY08bb2IHWqK 5xulusg5/fsFosYyKQ6IRI5siB5nbH4g5YwR6wPI6B4Byyb3h6lBI7OF4M6/x25kiqk2o2 x0DZr4fJbD2J6Xky3XUFL95NNz+5EzJpP0UGZk1dBQtMyQ+e9qh9T9tMy9Q95gN6ENQOOS rZJNHXe2h6JqTGe+rV9qTkHSC6FXMtGf+ykQPIFl9L1PPHWQDekM7+tWQVQxRoUehSAjrA sXcdY1nUutYf9Kgbkl+emZTbZTnTsc2TnJQm9BElBKBXCr1HykNvkV3guAnbMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1670753368; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Ee1/DojWSGqaI6MkDJTHYEcBDbncGV4mLi7iLcoHTuY=; b=JI9LKCGHm399VaFoKv31XitxMhnumoCnfFxO4HnPgMt15g/bMrdg5P7fmTmQz3THyh8SDV COh0PSUhICm1f2fEne7Ety9Em8zQkzuamvbmorpriLDfHYuIK9YTEGRX7o84AgoPiVfH9+ Zg1o/ZN+oQb/6ENEoFE6BBDQZhki3w04tm3hnryiUqBdhptI6IHqVSSitqHlUwnvmkh6Vg OJu+T8tA68zDPHGrsvGfMWW9tvyrvQgXQOqVdBitbIPM4ha+89hEjVDn0Prj/DXxBTCn2A zCVVacG22xXpBN+EPVDjtKWQ6uCQqjTZiB594LCJDCPfzzzjWWbXa2EuhNMikg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1670753368; a=rsa-sha256; cv=none; b=I9FvZcr0IxEDp3MZ7Ohz4EDhpbRf3E2nTIfgpEn3eZYUG1ZirReMx08jQLhyBkdqtLhL/E TNK9cOhVRy9x4CJ4pk3nNfXGpuX7O0NgDftx9ITs4WeKqqzLwhDLeoaA5HUOxMtlBErbuB b5WLi1EhwP40AAcwcJEvWurO0eP6dIlHMLTC8oM8Pzb9sHMc43x3d0ACyklnFGyX0SfVG6 nNCyDf6aRofAQSbbeK/aUyl+naepJHcl/mEljeeSVsH3/difj+3vvFi96bB27N7pxJVfDm O1R9o3KUgV7g+NjziiA/vXce7djySLa+KEfMf1TgDY6sH53ys5bzDXmBKRbDjw== Received: from localhost (p200300cb870eb3aec9ece6279067066f.dip0.t-ipconnect.de [IPv6:2003:cb:870e:b3ae:c9ec:e627:9067:66f]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: gbe) by smtp.freebsd.org (Postfix) with ESMTPSA id 4NVL8R54m2zKhb; Sun, 11 Dec 2022 10:09:27 +0000 (UTC) (envelope-from gbe@freebsd.org) Date: Sun, 11 Dec 2022 11:09:25 +0100 From: Gordon Bergling To: Mike Karels Cc: src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org Subject: Re: git: 4a30d7bb373c - main - growfs script: add swap partition as well as growing root Message-ID: References: <202212101941.2BAJfDx0085242@gitrepo.freebsd.org> List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="NFh+9eNsllkFuJIc" Content-Disposition: inline In-Reply-To: <202212101941.2BAJfDx0085242@gitrepo.freebsd.org> X-Url: X-Operating-System: FreeBSD 13.1-STABLE amd64 X-Host-Uptime: 11:07AM up 3 days, 18:09, 2 users, load averages: 0.26, 0.26, 0.23 X-ThisMailContainsUnwantedMimeParts: N --NFh+9eNsllkFuJIc Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Mike, thanks for implementation. After the MFC and the new -STABLE snapshots I am really looking forward to try this out an my RPi4B. --Gordon On Sat, Dec 10, 2022 at 07:41:13PM +0000, Mike Karels wrote: > The branch main has been updated by karels: >=20 > URL: https://cgit.FreeBSD.org/src/commit/?id=3D4a30d7bb373c08f42f953b9cd1= e793e236b4cd92 >=20 > commit 4a30d7bb373c08f42f953b9cd1e793e236b4cd92 > Author: Mike Karels > AuthorDate: 2022-12-10 19:38:36 +0000 > Commit: Mike Karels > CommitDate: 2022-12-10 19:38:36 +0000 >=20 > growfs script: add swap partition as well as growing root > =20 > Add the ability to create a swap partition in the course of growing > the root file system on first boot, enabling by default. The default > rules are: add swap if the disk is at least 15 GB (decimal), and the > existing root is less than 40% of the disk. The default size is 10% > of the disk, but is limited by the memory size. The limit is twice > memory size up to 4 GB, 8 GB up to 8 GB memory, and memory size over > 8 GB memory. Swap size is clamped at vm.swap_maxpages/2 as well. > The new swap partition is labeled as "growfs_swap". > =20 > The default behavior can be overridden by setting growfs_swap_size in > /etc/rc.conf or in the kernel environment, with kenv taking priority. > A value of 0 inhibits the addition of swap, an empty value specifies > the default, and other values indicate a swap size in bytes. > =20 > By default, addition of swap is inhibited if a swap partition is found > in the output of the sysctl kern.geom.conftxt before the current root > partition, usually meaning that there is another disk present. > Swap space is not added if one is already present in /etc/fstab. > =20 > The root partition is read-only when growfs runs, so /etc/fstab can > not be modified. That step is handled by a new growfs_fstab script, > added in a separate commit. Set the value "growfs_swap_pdev" in kenv > to indicate that this should be done, as well as for internal use. > =20 > There is optional verbose output meant for debugging; it can only be > enabled by modifying the script (in two places, for sh and awk). > This should be removed before release, after testing on -current. > =20 > Discussed with: cperciva > Reviewed by: imp (previous version) > Differential Revision: https://reviews.freebsd.org/D37462 > --- > libexec/rc/rc.d/growfs | 178 +++++++++++++++++++++++++++++++++++++++++++= ++++-- > 1 file changed, 172 insertions(+), 6 deletions(-) >=20 > diff --git a/libexec/rc/rc.d/growfs b/libexec/rc/rc.d/growfs > index 5402bd442279..3c48a7dca6b2 100755 > --- 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 > =20 > -# 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. > =20 > # Note that this uses awk(1), and thus will not work if /usr is on a sep= arate > # filesystem. We need to run early, because there might be not enough f= ree > @@ -48,7 +50,7 @@ start_cmd=3D"growfs_start" > stop_cmd=3D":" > rcvar=3D"growfs_enable" > =20 > -growfs_get_diskdev () > +growfs_get_diskdev() > { > local _search=3D${1} > sysctl -b kern.geom.conftxt | > @@ -61,8 +63,51 @@ growfs_get_diskdev () > done > } > =20 > -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). > +# Rule for swap size based on memory size: > +# up to 4 GB twice memory size > +# 4 GB - 8 GB 8 GB > +# over 8 GB memory size > +growfs_swap_max() > { > + memsize=3D$(sysctl -n hw.physmem) > + memsizeMB=3D$(($memsize / (1024 * 1024))) > + > + if [ $memsizeMB -lt 4096 ] > + then > + swapmax=3D$(($memsize * 2)) > + elif [ $memsizeMB -lt 8192 ] > + then > + swapmax=3D$((8192 * 1024 * 1024)) > + else > + swapmax=3D$memsize > + fi > + > + pagesize=3D$(sysctl -n hw.pagesize) > + vm_swap_max=3D$(($(sysctl -n vm.swap_maxpages) / 2 * $pagesize)) > + > + if [ $swapmax -gt $vm_swap_max ] > + then > + $swapmax=3D$vm_swap_max > + fi > + echo -n "$swapmax" > +} > + > +# Find newly-added swap partition on parent device ($1). > +growfs_last_swap() > +{ > + swapdev=3D$(gpart list $1 | awk ' > + $2 =3D=3D "Name:" { dev =3D $3 } > + $1 =3D=3D "type:" && $2 =3D=3D "freebsd-swap" { swapdev =3D dev } > + END { print swapdev } > + ') > + echo -n $swapdev > +} > + > +growfs_start() > +{ > + verbose=3D0 > echo "Growing root partition to fill device" > FSTYPE=3D$(mount -p | awk '{ if ( $2 =3D=3D "/") { print $3 }}') > FSDEV=3D$(mount -p | awk '{ if ( $2 =3D=3D "/") { print $1 }}') > @@ -100,19 +145,126 @@ growfs_start () > diskdev=3D${rootdev} > fi > =20 > + # 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=3D1 > + swapsize=3D"$(kenv -q growfs_swap_size 2>/dev/null)" > + case "$swapsize" in > + "0") addswap=3D0 > + ;; > + "") case "$growfs_swap_size" in > + "0") addswap=3D0 > + ;; > + "") > + if ! awk ' > + /^#/ { next } > + $3 =3D=3D "swap" { exit 1 } > + ' < /etc/fstab > + then > + addswap=3D0 > + fi > + ;; > + *) swapsize=3D"$growfs_swap_size" > + ;; > + esac > + ;; > + *) ;; > + esac > + > + swaplim=3D$(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 =3D 0 > lvl=3D$1 > device[lvl] =3D $3 > type[lvl] =3D $2 > idx[lvl] =3D $7 > + offset[lvl] =3D $9 > parttype[lvl] =3D $13 > + size[lvl] =3D $4 > + if (verbose) print lvl, type[lvl], $3 > + if (type[lvl] =3D=3D "DISK") { > + disksize =3D size[lvl] > + if (verbose) > + print "disksize ", disksize > + # Don't add swap on disks under 15 GB (decimal) by default. > + if (addswap =3D=3D 1 && (size[lvl] > 15000000000 || swapsize > 0)) > + doing_swap =3D 1 > + else > + doing_swap =3D 0 > + } else if (type[lvl] =3D=3D "PART" && $11 =3D=3D "freebsd-swap" && \ > + int(swapsize) =3D=3D 0) { > + # This finds swap only if it precedes root, e.g. preceding disk. > + addswap =3D 0 > + doing_swap =3D 0 > + print "swap device exists, not adding swap" > + } > if (dev =3D=3D $3) { > for (i =3D 1; i <=3D lvl; i++) { > # resize > if (type[i] =3D=3D "PART") { > pdev =3D device[i - 1] > - cmd[i] =3D "gpart resize -i " idx[i] " " pdev > + if (verbose) > + print i, pdev, addswap, disksize, \ > + doing_swap > + swapcmd =3D "" > + # Allow swap if current root is < 40% of disk. > + if (parttype[i] !=3D "MBR" && doing_swap =3D=3D 1 && \ > + (size[i] / disksize < 0.4 || \ > + swapsize > 0)) { > + print "Adding swap partition" > + if (int(swapsize) =3D=3D 0) { > + swapsize =3D int(disksize / 10) > + if (swapsize > swaplim) > + swapsize =3D swaplim > + } > + sector =3D $5 > + swapsize /=3D sector > + if (verbose) > + print "swapsize sectors", > + swapsize > + align =3D 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] =3D=3D "MBR") { > + if (verbose) > + print "sz ", size[i - 1], \ > + " off ", offset[i - 1] > + expand =3D size[0] - \ > + (size[i - 1] + offset[i - 1]) > + } else { > + if (verbose) > + print "sz ", size[i], \ > + " off ", offset[i] > + expand =3D size[0] - \ > + (size[i] + offset[i]) > + } > + if (verbose) > + print "expand ", expand, \ > + " sz ", size[i] > + swapbase =3D (expand + size[i]) / sector > + swapbase -=3D swapsize + align > + swapcmd =3D "gpart add -t freebsd-swap -a " align " -b " swapbase "= " pdev "; kenv growfs_swap_pdev=3D" pdev " >/dev/null; " > + if (verbose) > + swapcmd =3D "set -x; " swapcmd > + } > + cmd[i] =3D swapcmd "gpart resize -i " idx[i] " " pdev > if (parttype[i] =3D=3D "GPT") > cmd[i] =3D "gpart recover " pdev " ; " cmd[i] > } else if (type[i] =3D=3D "LABEL") { > @@ -128,7 +280,7 @@ growfs_start () > } > exit 0 > } > -}' dev=3D"$search" > +}' dev=3D"$search" addswap=3D"$addswap" swapsize=3D"$swapsize" swaplim= =3D"$swaplim" > gpart commit "$diskdev" 2> /dev/null > case "$FSTYPE" in > ufs) > @@ -138,6 +290,20 @@ growfs_start () > 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=3D$(kenv -q growfs_swap_pdev) > + if [ -n "$pdev" ] > + then > + dev=3D$(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 > } > =20 > load_rc_config $name >=20 --=20 --NFh+9eNsllkFuJIc Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQGTBAEBCgB9FiEEYbWI0KY5X7yH/Fy4OQX2V8rP09wFAmOVrE9fFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDYx QjU4OEQwQTYzOTVGQkM4N0ZDNUNCODM5MDVGNjU3Q0FDRkQzREMACgkQOQX2V8rP 09yr7wgAo13XQQ+m8SyeSCCjardR/qs6y2MfAspTSkUcOFXCKOocU+HqhxHASv9M NKV59qpzE5EOPau2bWTJyhvbgkT/7dnHuExV405MWhOwpKw6C6cFYCjpHJAIeLPW PzxChCEZk4QCcflymF4mo/gU+enPwnnff6POS/9JYFNfo6o8jeg4a2ktMTiakPAY TDX+Numwx5c5IewMsFtQ+6m81fuoR1D+CTvwzT1NZntrgk6z2/dEeO7MKiUL83rc t9kh/tN/R/TexxuDOqatmfZemHWfmOHyv8lXUXN/f+wV53Rtaq7zkJKMJWfwPdQS ZdqftLxwyHUZOgOY4Efmt4PA8rDguA== =2X6p -----END PGP SIGNATURE----- --NFh+9eNsllkFuJIc--