Add bootfs.snapshot and bootfs.rollback kernel parameters

Unlike other filesystems, snapshots and rollbacks of bootfs need to be
done from a rescue environment. This patch makes it possible to snap-
shot or rollback the bootfs simply by specifying bootfs.snapshot or
bootfs.rollback on the kernel command line. The operation will be
performed by dracut just before bootfs is mounted.

Reviewed-by: Antonio Russo <antonio.e.russo@gmail.com> 
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Gregory Bartholomew <gregory.lee.bartholomew@gmail.com>
Closes #10198
This commit is contained in:
gregory-lee-bartholomew
2020-05-29 23:16:08 -05:00
committed by GitHub
parent 3d93161b01
commit 9052e3d70b
6 changed files with 66 additions and 2 deletions
+2
View File
@@ -7,3 +7,5 @@ zfs-lib.sh
zfs-load-key.sh
zfs-needshutdown.sh
zfs-env-bootfs.service
zfs-snapshot-bootfs.service
zfs-rollback-bootfs.service
+6 -2
View File
@@ -10,7 +10,9 @@ pkgdracut_SCRIPTS = \
zfs-lib.sh
pkgdracut_DATA = \
zfs-env-bootfs.service
zfs-env-bootfs.service \
zfs-snapshot-bootfs.service \
zfs-rollback-bootfs.service
EXTRA_DIST = \
$(top_srcdir)/contrib/dracut/90zfs/export-zfs.sh.in \
@@ -21,7 +23,9 @@ EXTRA_DIST = \
$(top_srcdir)/contrib/dracut/90zfs/zfs-load-key.sh.in \
$(top_srcdir)/contrib/dracut/90zfs/zfs-needshutdown.sh.in \
$(top_srcdir)/contrib/dracut/90zfs/zfs-lib.sh.in \
$(top_srcdir)/contrib/dracut/90zfs/zfs-env-bootfs.service.in
$(top_srcdir)/contrib/dracut/90zfs/zfs-env-bootfs.service.in \
$(top_srcdir)/contrib/dracut/90zfs/zfs-snapshot-bootfs.service.in \
$(top_srcdir)/contrib/dracut/90zfs/zfs-rollback-bootfs.service.in
$(pkgdracut_SCRIPTS) $(pkgdracut_DATA) :%:%.in
-$(SED) -e 's,@bindir\@,$(bindir),g' \
+6
View File
@@ -109,5 +109,11 @@ install() {
ln -s ../zfs-import.target "${initdir}/$systemdsystemunitdir/initrd.target.wants"/zfs-import.target
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @systemdunitdir@/zfs-import.target
fi
for _service in zfs-snapshot-bootfs.service zfs-rollback-bootfs.service ; do
inst "${moddir}"/$_service "${systemdsystemunitdir}"/$_service
if ! [ -L "${initdir}/$systemdsystemunitdir/initrd.target.wants"/$_service ]; then
ln -s ../$_service "${initdir}/$systemdsystemunitdir/initrd.target.wants"/$_service
fi
done
fi
}
@@ -0,0 +1,14 @@
[Unit]
Description=Rollback bootfs just before it is mounted
Requisite=zfs-import.target
After=zfs-import.target zfs-snapshot-bootfs.service
Before=dracut-mount.service
DefaultDependencies=no
ConditionKernelCommandLine=bootfs.rollback
[Service]
# ${BOOTFS} should have been set by zfs-env-bootfs.service
Type=oneshot
ExecStartPre=/bin/sh -c 'test -n "${BOOTFS}"'
ExecStart=/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.rollback)"; /sbin/zfs rollback -Rf "${BOOTFS}@${SNAPNAME:-%v}"'
RemainAfterExit=yes
@@ -0,0 +1,14 @@
[Unit]
Description=Snapshot bootfs just before it is mounted
Requisite=zfs-import.target
After=zfs-import.target
Before=dracut-mount.service
DefaultDependencies=no
ConditionKernelCommandLine=bootfs.snapshot
[Service]
# ${BOOTFS} should have been set by zfs-env-bootfs.service
Type=oneshot
ExecStartPre=/bin/sh -c 'test -n "${BOOTFS}"'
ExecStart=-/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.snapshot)"; /sbin/zfs snapshot "${BOOTFS}@${SNAPNAME:-%v}"'
RemainAfterExit=yes