rc: Add a zpoolreguid rc.d script

If one boots up multiple copies of a template VM image containing a
zpool, the pool GUIDs will be identical, making it impossible to, e.g.,
share datasets between them.

This diff introduces a simple workaround for the problem: one can use
the script to, upon first boot, assign a new GUID to one or more zpools.
This will be useful when building ZFS-based VM images from release(7).

Reviewed by:	mav, allanjude, asomers
Reviewed by:	Pau Amma (docs)
MFC after:	1 month
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D35336
This commit is contained in:
Mark Johnston 2022-05-30 10:43:44 -04:00
parent ef7a6f1ded
commit 227caacc91
4 changed files with 35 additions and 1 deletions

View file

@ -69,6 +69,8 @@ rc_conf_files="/etc/rc.conf /etc/rc.conf.local"
zfs_enable="NO" # Set to YES to automatically mount ZFS file systems
zfskeys_enable="NO" # Set YES to autoload ZFS encryption keys
zfs_bootonce_activate="NO" # Set YES to make successful bootonce BE permanent
zpool_reguid="" # Set to zpools for which the GUID should be replaced
# upon first boot.
# ZFSD support
zfsd_enable="NO" # Set to YES to automatically start the ZFS fault

View file

@ -326,6 +326,7 @@ ZFS+= zfsbe
ZFS+= zfsd
ZFS+= zfskeys
ZFS+= zpool
ZFS+= zpoolreguid
ZFS+= zvol
ZFSPACKAGE= rc
.endif

25
libexec/rc/rc.d/zpoolreguid Executable file
View file

@ -0,0 +1,25 @@
#!/bin/sh
# PROVIDE: zpoolreguid
# REQUIRE: zpool
# BEFORE: mountcritlocal
# KEYWORD: firstboot nojail
. /etc/rc.subr
name="zpoolreguid"
desc="Generate a new zpool GUID"
rcvar="zfs_enable"
start_cmd="zpoolreguid_start"
zpoolreguid_start()
{
local pool
for pool in "${zpool_reguid}"; do
zpool reguid $pool
done
}
load_rc_config $name
run_rc_command "$1"

View file

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd March 3, 2022
.Dd May 26, 2022
.Dt RC.CONF 5
.Os
.Sh NAME
@ -2067,6 +2067,12 @@ If set to
.Pa /etc/rc.d/zfs
will attempt to automatically mount ZFS file systems and initialize ZFS volumes
(ZVOLs).
.It Va zpool_reguid
.Pq Vt str
A space-separated list of ZFS pool names for which new pool GUIDs should be
assigned upon first boot.
This is useful when using a ZFS pool copied from a template, such as a virtual
machine image.
.It Va gptboot_enable
.Pq Vt bool
If set to