This also eliminates --skip-missing. Check scripts should now check
to ensure that any files and settings they will copy from the host
system actually exist when called without arguments.
The check scripts are also updated to not try to source dracut-functions
which(1) is a perfectly good way of checking if a command is on the path.
---
dracut | 36 +++++---------------------------
dracut-functions | 51 ++++++++++++++++++++++++++++++++++++++++++++++
modules.d/90crypt/check | 4 +--
modules.d/90lvm/check | 5 +---
modules.d/90mdraid/check | 5 +---
test/make-test-root | 2 +
6 files changed, 62 insertions(+), 41 deletions(-)
diff --git a/dracut b/dracut
index e024fa4..7ff833c 100755
--- a/dracut
+++ b/dracut
@@ -34,7 +34,6 @@ Creates initial ramdisk images for preloading modules
booting the local host instead of a generic host.
-i, --include [SOURCE] [TARGET]
Include the files in SOURCE in the final initramfs
- --skip-missing
"
}
@@ -51,7 +50,6 @@ while (($# > 0)); do
-l|--local) allowlocal="yes" ;;
-h|--hostonly) hostonly="-h" ;;
-i|--include) include_src="$2"; include_target="$3"; shift 2;;
- --skip-missing) skipmissing="yes" ;;
*) break ;;
esac
shift
@@ -83,16 +81,13 @@ export dracutfunctions
case $dracutmodules in
""|auto)
dracutmodules="all"
- skipmissing="yes"
;;
hostonly)
dracutmodules="all"
- skipmissing="yes"
hostonly="-h"
;;
esac
-
[[ $2 ]] && kernel=$2 || kernel=$(uname -r)
[[ $1 ]] && outfile=$(readlink -f $1) || outfile="/boot/initrd-$kernel.img"
@@ -113,30 +108,13 @@ for d in bin sbin usr/bin usr/sbin usr/lib etc proc sys
sysroot dev/pts; do
mkdir -p "$initdir/$d";
done
-# these bits are fugly, and need some cleanup.
-# Actually documenting how dracut modules work these days would be good.
-skip_missing() {
- # $1 = location of module
- [[ $skipmissing ]] || return 0
- [[ -x $1/check ]] || return 0
- "$1/check" $hostonly
-}
+# check all our modules to see if they should be sourced
+check_modules
-can_source_module() {
- # $1 = location of module
- mod=${1##*/}; mod=${mod#[0-9][0-9]};
- if [[ $dracutmodules != all ]]; then
- strstr "$dracutmodules " "$mod " || return 1
- fi
- strstr "$omit_dracutmodules " "$mod " && return 1
- skip_missing "$1"
-}
-
-# source all our modules
-for moddir in "$dsrc/modules.d"/*; do
- [[ -d $moddir || -L $moddir ]] || continue
- can_source_module "$moddir" || continue
- [[ -x $moddir/install ]] && . "$moddir/install"
+#source our modules.
+for moddir in "$dsrc/modules.d"/[0-9][0-9]*; do
+ mod=${moddir##*/}; mod=${mod#[0-9][0-9]}
+ strstr "$mods_to_load" "$mod" && . "$moddir/install"
done
unset moddir
@@ -161,5 +139,3 @@ fi
( cd "$initdir"; find . |cpio -H newc -o |gzip -9 > "$outfile"; )
[[ "$beverbose" = "yes" ]] && ls -lh "$outfile"
-
-:
diff --git a/dracut-functions b/dracut-functions
index 16ec7d0..6bad22c 100755
--- a/dracut-functions
+++ b/dracut-functions
@@ -200,6 +200,57 @@ dracut_install() {
done
}
+memoize() {
+ local cmd=memoize_$@ ret
+ cmd=${cmd//[^[:alnum:]]/_}
+ [[ ${!cmd} ]] && return ${!cmd}
+ "$@"
+ ret=$?
+ eval "$cmd=$ret"
+ return $ret
+}
+
+check_module_deps() {
+ local moddir dep
+ # turn a module name into a directory, if we can.
+ moddir=$(echo ${dsrc}/modules.d/??${1})
+ [[ -d $moddir && -x $moddir/install ]] || return 1
+ # if we do not have a check script, we are unconditionally included
+ if [[ -x $moddir/check ]]; then
+ memoize "$moddir/check" || return 1
+ for dep in $("$moddir/check" -d); do
+ memoize check_module_deps "$dep" && continue
+ dwarning "Dependency $mod failed."
+ return 1
+ done
+ fi
+ mods_to_load+=" $1 "
+}
+
+should_source_module() {
+ local dep
+ [[ -x $1/install ]] || return 1
+ [[ -x $1/check ]] || return 0
+ "$1/check" $hostonly || return 1
+ for dep in $("$1/check" -d); do
+ memoize check_module_deps "$dep" && continue
+ dwarning "Cannot load $mod, dependencies failed."
+ return 1
+ done
+}
+
+check_modules() {
+ for moddir in "$dsrc/modules.d"/[0-9][0-9]*; do
+ local mod=${moddir##*/}; mod=${mod#[0-9][0-9]}
+ [[ -d $moddir ]] || continue
+ [[ $dracutmodules != all ]] && ! strstr "$dracutmodules" "$mod" && \
+ continue
+ strstr "$omit_dracutmodules" "$mod" && continue
+ should_source_module "$moddir" || continue
+ mods_to_load+=" $mod "
+ done
+}
+
# install modules, and handle installing all their dependencies as well.
srcmods="/lib/modules/$kernel/"
instmods() {
diff --git a/modules.d/90crypt/check b/modules.d/90crypt/check
index 7ab1acb..4189eaa 100755
--- a/modules.d/90crypt/check
+++ b/modules.d/90crypt/check
@@ -1,8 +1,6 @@
#!/bin/sh
-[[ $dracutfunctions ]] && . $dracutfunctions
-
-find_binary cryptsetup >/dev/null || exit 1
+which cryptsetup >/dev/null 2>&1 || exit 1
if [ "$1" = "-h" ]; then
blkid | grep -q crypt_LUKS || exit 1
diff --git a/modules.d/90lvm/check b/modules.d/90lvm/check
index dc433d9..3b2a4c3 100755
--- a/modules.d/90lvm/check
+++ b/modules.d/90lvm/check
@@ -1,8 +1,5 @@
#!/bin/sh
-
-[[ $dracutfunctions ]] && . $dracutfunctions
-
-find_binary lvm >/dev/null || exit 1
+which lvm >/dev/null 2>&1 || exit 1
if [ "$1" = "-h" ]; then
blkid | grep -q lvm2pv || exit 1
diff --git a/modules.d/90mdraid/check b/modules.d/90mdraid/check
index d809fb4..b533035 100755
--- a/modules.d/90mdraid/check
+++ b/modules.d/90mdraid/check
@@ -1,8 +1,5 @@
#!/bin/sh
-
-[[ $dracutfunctions ]] && . $dracutfunctions
-
-find_binary mdadm >/dev/null || exit 1
+which mdadm >/dev/null 2>&1 || exit 1
if [ "$1" = "-h" ]; then
blkid | grep -q linux_raid || exit 1
diff --git a/test/make-test-root b/test/make-test-root
index cfc8758..e7f5276 100755
--- a/test/make-test-root
+++ b/test/make-test-root
@@ -12,6 +12,7 @@ kernel=$(uname -r)
/lib/terminfo/l/linux mount dmesg ifconfig dhclient mkdir cp ping
dhclient
inst "modules.d/40network/dhclient-script" "/sbin/dhclient-script"
inst "modules.d/40network/ifup" "/sbin/ifup"
+
dracut_install grep
inst test/test-init /sbin/init
find_binary plymouth >/dev/null && dracut_install plymouth
@@ -25,6 +26,7 @@ unset initdir
# results in cryptsetup not being able to unlock the LVM PV.
# Probably a bug in cryptsetup, but...
./dracut -l -i "$targetfs" /source \
+ -i test/overlay / \
-m "dash kernel-modules test crypt lvm mdraid udev-rules base
rootfs-block" \
-d "ata_piix ext2 sd_mod" \
-f test/initramfs.makeroot
--
1.6.0.4
--
To unsubscribe from this list: send the line "unsubscribe initramfs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html