A collection of dracut fixes
- In older systems without sysroot.mount, import before dracut-mount, and re-enable old dracut mount hook - rootflags MUST be present even if the administrator neglected to specify it explicitly - Check that mount.zfs exists in sbindir - Remove awk and head as (now unused) requirements, add grep, and install the right mount.zfs - Eliminate one use of grep in Dracut - Use a more accurate grepping statement to identify zfsutil in rootflags - Ensure that pooldev is nonempty - Properly handle /dev/sd* devices and more - Use new -P to get list of zpool devices - Bail out of the generator when zfs:AUTO is on the root command line - Ignore errors from systemctl trying to load sysroot.mount, we only care about the output - Determine which one is the correct initqueuedir at run time. - Add a compatibility getargbool for our detection / setup script. - Update dracut .gitignore files Signed-off-by: <Matthew Thode mthode@mthode.org> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #4558 Closes #4562
This commit is contained in:
parent
8adb798aa5
commit
d402c18dd6
|
@ -0,0 +1 @@
|
||||||
|
module-setup.sh
|
|
@ -15,21 +15,24 @@ get_pool_devices() {
|
||||||
local poolconfigoutput
|
local poolconfigoutput
|
||||||
local pooldev
|
local pooldev
|
||||||
local prefix
|
local prefix
|
||||||
|
local resolved
|
||||||
poolconfigtemp=`mktemp`
|
poolconfigtemp=`mktemp`
|
||||||
@sbindir@/zpool list -v -H "$1" > "$poolconfigtemp" 2>&1
|
@sbindir@/zpool list -v -H -P "$1" > "$poolconfigtemp" 2>&1
|
||||||
if [ "$?" != "0" ] ; then
|
if [ "$?" != "0" ] ; then
|
||||||
poolconfigoutput=$(cat "$poolconfigtemp")
|
poolconfigoutput=$(cat "$poolconfigtemp")
|
||||||
dinfo "zfsexpandknowledge: pool $1 cannot be listed: $poolconfigoutput"
|
dinfo "zfsexpandknowledge: pool $1 cannot be listed: $poolconfigoutput"
|
||||||
else
|
else
|
||||||
while read pooldev ; do
|
while read pooldev ; do
|
||||||
for prefix in /dev/disk/* /dev/mapper ; do
|
if [ -n "$pooldev" -a -e "$pooldev" ] ; then
|
||||||
if [ -e "$prefix"/"$pooldev" ] ; then
|
if [ -h "$pooldev" ] ; then
|
||||||
dinfo "zfsexpandknowledge: pool $1 has device $prefix/$pooldev"
|
resolved=`readlink -f "$pooldev"`
|
||||||
echo `readlink -f "$prefix"/"$pooldev"`
|
else
|
||||||
break
|
resolved="$pooldev"
|
||||||
|
fi
|
||||||
|
dinfo "zfsexpandknowledge: pool $1 has device $pooldev (which resolves to $resolved)"
|
||||||
|
echo "$resolved"
|
||||||
fi
|
fi
|
||||||
done
|
done < <(cat "$poolconfigtemp" | awk -F '\t' '/\t\/dev/ { print $2 }')
|
||||||
done < <(cat "$poolconfigtemp" | awk -F '\t' 'NR>1 { print $2 }')
|
|
||||||
fi
|
fi
|
||||||
rm -f "$poolconfigtemp"
|
rm -f "$poolconfigtemp"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,4 +2,5 @@ export-zfs.sh
|
||||||
module-setup.sh
|
module-setup.sh
|
||||||
mount-zfs.sh
|
mount-zfs.sh
|
||||||
parse-zfs.sh
|
parse-zfs.sh
|
||||||
|
zfs-generator.sh
|
||||||
zfs-lib.sh
|
zfs-lib.sh
|
||||||
|
|
|
@ -5,8 +5,11 @@ check() {
|
||||||
[ "${1}" = "-d" ] && return 0
|
[ "${1}" = "-d" ] && return 0
|
||||||
|
|
||||||
# Verify the zfs tool chain
|
# Verify the zfs tool chain
|
||||||
which zpool >/dev/null 2>&1 || return 1
|
for tool in "@sbindir@/zpool" "@sbindir@/zfs" "@sbindir@/mount.zfs" ; do
|
||||||
which zfs >/dev/null 2>&1 || return 1
|
test -x "$tool" || return 1
|
||||||
|
done
|
||||||
|
# Verify grep exists
|
||||||
|
which grep >/dev/null 2>&1 || return 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -31,20 +34,18 @@ install() {
|
||||||
inst_rules @udevruledir@/90-zfs.rules
|
inst_rules @udevruledir@/90-zfs.rules
|
||||||
inst_rules @udevruledir@/69-vdev.rules
|
inst_rules @udevruledir@/69-vdev.rules
|
||||||
inst_rules @udevruledir@/60-zvol.rules
|
inst_rules @udevruledir@/60-zvol.rules
|
||||||
|
dracut_install hostid
|
||||||
|
dracut_install grep
|
||||||
dracut_install @sbindir@/zfs
|
dracut_install @sbindir@/zfs
|
||||||
dracut_install @sbindir@/zpool
|
dracut_install @sbindir@/zpool
|
||||||
|
dracut_install @sbindir@/mount.zfs
|
||||||
dracut_install @udevdir@/vdev_id
|
dracut_install @udevdir@/vdev_id
|
||||||
dracut_install @udevdir@/zvol_id
|
dracut_install @udevdir@/zvol_id
|
||||||
dracut_install mount.zfs
|
|
||||||
dracut_install hostid
|
|
||||||
dracut_install awk
|
|
||||||
dracut_install head
|
|
||||||
inst_hook cmdline 95 "${moddir}/parse-zfs.sh"
|
inst_hook cmdline 95 "${moddir}/parse-zfs.sh"
|
||||||
if [ -n "$systemdutildir" ] ; then
|
if [ -n "$systemdutildir" ] ; then
|
||||||
inst_script "${moddir}/zfs-generator.sh" "$systemdutildir"/system-generators/dracut-zfs-generator
|
inst_script "${moddir}/zfs-generator.sh" "$systemdutildir"/system-generators/dracut-zfs-generator
|
||||||
else
|
|
||||||
inst_hook mount 98 "${moddir}/mount-zfs.sh"
|
|
||||||
fi
|
fi
|
||||||
|
inst_hook mount 98 "${moddir}/mount-zfs.sh"
|
||||||
inst_hook shutdown 30 "${moddir}/export-zfs.sh"
|
inst_hook shutdown 30 "${moddir}/export-zfs.sh"
|
||||||
|
|
||||||
inst_simple "${moddir}/zfs-lib.sh" "/lib/dracut-zfs-lib.sh"
|
inst_simple "${moddir}/zfs-lib.sh" "/lib/dracut-zfs-lib.sh"
|
||||||
|
|
|
@ -10,6 +10,16 @@ case "${root}" in
|
||||||
*) return ;;
|
*) return ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# If sysroot.mount exists, the initial RAM disk configured
|
||||||
|
# it to mount ZFS on root. In that case, we bail early.
|
||||||
|
loadstate="$(systemctl --system --show -p LoadState sysroot.mount || true)"
|
||||||
|
if [ "${loadstate}" = "LoadState=not-found" -o "${loadstate}" = "" ] ; then
|
||||||
|
info "ZFS: sysroot.mount absent, mounting root with mount-zfs.sh"
|
||||||
|
else
|
||||||
|
info "ZFS: sysroot.mount present, delegating root mount to it"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
# Delay until all required block devices are present.
|
# Delay until all required block devices are present.
|
||||||
udevadm settle
|
udevadm settle
|
||||||
|
|
||||||
|
|
|
@ -55,5 +55,9 @@ esac
|
||||||
# modules to settle before mounting.
|
# modules to settle before mounting.
|
||||||
if [ ${wait_for_zfs} -eq 1 ]; then
|
if [ ${wait_for_zfs} -eq 1 ]; then
|
||||||
ln -s /dev/null /dev/root 2>/dev/null
|
ln -s /dev/null /dev/root 2>/dev/null
|
||||||
echo '[ -e /dev/zfs ]' > "${hookdir}/initqueue/finished/zfs.sh"
|
initqueuedir="${hookdir}/initqueue/finished"
|
||||||
|
test -d initqueuedir || {
|
||||||
|
initqueuedir="${hookdir}/initqueue-finished"
|
||||||
|
}
|
||||||
|
echo '[ -e /dev/zfs ]' > "${initqueuedir}/zfs.sh"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -13,10 +13,18 @@ type getarg >/dev/null 2>&1 || . "$dracutlib"
|
||||||
[ -z "$rootflags" ] && rootflags=$(getarg rootflags=)
|
[ -z "$rootflags" ] && rootflags=$(getarg rootflags=)
|
||||||
|
|
||||||
[ "${root##zfs:}" = "${root}" -a "${root##ZFS=}" = "${root}" -a "$rootfstype" != "zfs" ] && exit 0
|
[ "${root##zfs:}" = "${root}" -a "${root##ZFS=}" = "${root}" -a "$rootfstype" != "zfs" ] && exit 0
|
||||||
|
# If root is set to zfs:AUTO, then we know sysroot.mount will not be generated
|
||||||
|
# so we have no need to enhance it.
|
||||||
|
# See https://github.com/zfsonlinux/zfs/pull/4558#discussion_r61118952 for details.
|
||||||
|
if [ "${root}" = "zfs:AUTO" ] ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
rootfstype=zfs
|
rootfstype=zfs
|
||||||
if echo "${rootflags}" | grep -q zfsutil ; then
|
if echo "${rootflags}" | grep -Eq '^zfsutil$|^zfsutil,|,zfsutil$|,zfsutil,' ; then
|
||||||
true
|
true
|
||||||
|
elif test -n "${rootflags}" ; then
|
||||||
|
rootflags="zfsutil,${rootflags}"
|
||||||
else
|
else
|
||||||
rootflags=zfsutil
|
rootflags=zfsutil
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -1,6 +1,24 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
command -v getarg >/dev/null || . /lib/dracut-lib.sh
|
command -v getarg >/dev/null || . /lib/dracut-lib.sh
|
||||||
|
command -v getargbool >/dev/null || {
|
||||||
|
# Compatibility with older Dracut versions.
|
||||||
|
# With apologies to the Dracut developers.
|
||||||
|
getargbool() {
|
||||||
|
local _b
|
||||||
|
unset _b
|
||||||
|
local _default
|
||||||
|
_default="$1"; shift
|
||||||
|
_b=$(getarg "$@")
|
||||||
|
[ $? -ne 0 -a -z "$_b" ] && _b="$_default"
|
||||||
|
if [ -n "$_b" ]; then
|
||||||
|
[ $_b = "0" ] && return 1
|
||||||
|
[ $_b = "no" ] && return 1
|
||||||
|
[ $_b = "off" ] && return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
OLDIFS="${IFS}"
|
OLDIFS="${IFS}"
|
||||||
NEWLINE="
|
NEWLINE="
|
||||||
|
|
|
@ -4,6 +4,7 @@ DefaultDependencies=no
|
||||||
Requires=systemd-udev-settle.service
|
Requires=systemd-udev-settle.service
|
||||||
After=systemd-udev-settle.service
|
After=systemd-udev-settle.service
|
||||||
After=cryptsetup.target
|
After=cryptsetup.target
|
||||||
|
Before=dracut-mount.service
|
||||||
ConditionPathExists=@sysconfdir@/zfs/zpool.cache
|
ConditionPathExists=@sysconfdir@/zfs/zpool.cache
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
|
|
@ -4,6 +4,7 @@ DefaultDependencies=no
|
||||||
Requires=systemd-udev-settle.service
|
Requires=systemd-udev-settle.service
|
||||||
After=systemd-udev-settle.service
|
After=systemd-udev-settle.service
|
||||||
After=cryptsetup.target
|
After=cryptsetup.target
|
||||||
|
Before=dracut-mount.service
|
||||||
ConditionPathExists=!@sysconfdir@/zfs/zpool.cache
|
ConditionPathExists=!@sysconfdir@/zfs/zpool.cache
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
|
Loading…
Reference in New Issue