mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-24 18:39:34 +03:00
Amend Dracut module to export ZFS root on shutdown
Make use of Dracut's ability to restore the initramfs on shutdown and pivot to it, allowing for a clean unmount and export of the ZFS root. No need to force-import on every reboot anymore. Signed-off-by: Lukas Wunner <lukas@wunner.de> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #2195 Issue #2476 Issue #2498 Issue #2556 Issue #2563 Issue #2575 Issue #2600 Issue #2755 Issue #2766
This commit is contained in:
parent
8ac9b5e6b5
commit
07a3312f17
1
dracut/90zfs/.gitignore
vendored
1
dracut/90zfs/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
export-zfs.sh
|
||||
module-setup.sh
|
||||
mount-zfs.sh
|
||||
parse-zfs.sh
|
||||
|
@ -1,10 +1,12 @@
|
||||
pkgdracutdir = $(dracutdir)/modules.d/90zfs
|
||||
pkgdracut_SCRIPTS = \
|
||||
$(top_srcdir)/dracut/90zfs/export-zfs.sh \
|
||||
$(top_srcdir)/dracut/90zfs/module-setup.sh \
|
||||
$(top_srcdir)/dracut/90zfs/mount-zfs.sh \
|
||||
$(top_srcdir)/dracut/90zfs/parse-zfs.sh
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(top_srcdir)/dracut/90zfs/export-zfs.sh.in \
|
||||
$(top_srcdir)/dracut/90zfs/module-setup.sh.in \
|
||||
$(top_srcdir)/dracut/90zfs/mount-zfs.sh.in \
|
||||
$(top_srcdir)/dracut/90zfs/parse-zfs.sh.in
|
||||
|
29
dracut/90zfs/export-zfs.sh.in
Executable file
29
dracut/90zfs/export-zfs.sh.in
Executable file
@ -0,0 +1,29 @@
|
||||
#!/bin/sh
|
||||
|
||||
_do_zpool_export() {
|
||||
local ret=0
|
||||
local final=$1
|
||||
local force
|
||||
|
||||
if [ "x$final" != "x" ]; then
|
||||
force="-f"
|
||||
fi
|
||||
|
||||
info "Exporting ZFS storage pools"
|
||||
zpool list -H | while read fs rest ; do
|
||||
zpool export $force "$fs" || ret=$?
|
||||
done
|
||||
|
||||
if [ "x$final" != "x" ]; then
|
||||
info "zpool list"
|
||||
zpool list 2>&1 | vinfo
|
||||
fi
|
||||
|
||||
return $ret
|
||||
}
|
||||
|
||||
if command -v zpool >/dev/null; then
|
||||
_do_zpool_export $1
|
||||
else
|
||||
:
|
||||
fi
|
@ -39,6 +39,7 @@ install() {
|
||||
dracut_install hostid
|
||||
inst_hook cmdline 95 "$moddir/parse-zfs.sh"
|
||||
inst_hook mount 98 "$moddir/mount-zfs.sh"
|
||||
inst_hook shutdown 30 "$moddir/export-zfs.sh"
|
||||
|
||||
if [ -e @sysconfdir@/zfs/zpool.cache ]; then
|
||||
inst @sysconfdir@/zfs/zpool.cache
|
||||
|
@ -67,5 +67,7 @@ case "$root" in
|
||||
else
|
||||
mount -o zfsutil -t zfs "$zfsbootfs" "$NEWROOT" && ROOTFS_MOUNTED=yes
|
||||
fi
|
||||
|
||||
need_shutdown
|
||||
;;
|
||||
esac
|
||||
|
@ -77,6 +77,9 @@ command line and determine if ZFS is the active root filesystem.
|
||||
* `mount-zfs.sh`: Run later in initramfs boot process after udev has settled
|
||||
to mount the root dataset.
|
||||
|
||||
* `export-zfs.sh`: Run on shutdown after dracut has restored the initramfs
|
||||
and pivoted to it, allowing for a clean unmount and export of the ZFS root.
|
||||
|
||||
`module-setup.sh`
|
||||
---------------
|
||||
|
||||
@ -164,3 +167,25 @@ import can lead to serious data corruption and loss of pools, so this option
|
||||
should be used with extreme caution. Note that even with this flag set, if
|
||||
the required zpool was auto-imported by the kernel module, no additional
|
||||
`zpool import` commands are run, so nothing is forced.
|
||||
|
||||
`export-zfs.sh`
|
||||
-------------
|
||||
|
||||
Normally the zpool containing the root dataset cannot be exported on
|
||||
shutdown as it is still in use by the init process. To work around this,
|
||||
Dracut is able to restore the initramfs on shutdown and pivot to it.
|
||||
All remaining process are then running from a ramdisk, allowing for a
|
||||
clean unmount and export of the ZFS root. The theory of operation is
|
||||
described in detail in the [Dracut manual](https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html#_dracut_on_shutdown).
|
||||
|
||||
This script will try to export all remaining zpools after Dracut has
|
||||
pivoted to the initramfs. If an initial regular export is not successful,
|
||||
Dracut will call this script once more with the `final` option,
|
||||
in which case a forceful export is attempted.
|
||||
|
||||
Other Dracut modules include similar shutdown scripts and Dracut
|
||||
invokes these scripts round-robin until they succeed. In particular,
|
||||
the `90dm` module installs a script which tries to close and remove
|
||||
all device mapper targets. Thus, if there are ZVOLs containing
|
||||
dm-crypt volumes or if the zpool itself is backed by a dm-crypt
|
||||
volume, the shutdown scripts will try to untangle this.
|
||||
|
Loading…
Reference in New Issue
Block a user