Modify kernel module installation routine to respect --hostonly.
If dracut was run with --hostonly, instmods will only load a module into the initramfs if it is already loaded on the host machine. This really trims the fat out of a --hostonly generated initramfs, and eliminates the need for the kernel-modules-loaded hook. This patch also allows a module to flag that it should only load as a dependency by exiting 255 instead of 0. Currently, only the network module uses this functionality.master
parent
3774d3cc15
commit
4cf262689e
|
@ -28,6 +28,7 @@ IF_dynamic=""
|
||||||
# Generic substring function. If $2 is in $1, return 0.
|
# Generic substring function. If $2 is in $1, return 0.
|
||||||
strstr() { [[ ! ${1#*$2*} = $1 ]]; }
|
strstr() { [[ ! ${1#*$2*} = $1 ]]; }
|
||||||
|
|
||||||
|
# Log initrd creation.
|
||||||
if ! [[ $dracutlogfile ]]; then
|
if ! [[ $dracutlogfile ]]; then
|
||||||
[[ $dsrc = /usr/lib/dracut ]] && \
|
[[ $dsrc = /usr/lib/dracut ]] && \
|
||||||
dracutlogfile=/var/log/dracut/log || \
|
dracutlogfile=/var/log/dracut/log || \
|
||||||
|
@ -211,26 +212,21 @@ dracut_install() {
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
memoize() {
|
|
||||||
local cmd=memoize_$@ ret
|
|
||||||
cmd=${cmd//[^[:alnum:]]/_}
|
|
||||||
[[ ${!cmd} ]] && return ${!cmd}
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
eval "$cmd=$ret"
|
|
||||||
return $ret
|
|
||||||
}
|
|
||||||
|
|
||||||
check_module_deps() {
|
check_module_deps() {
|
||||||
local moddir dep
|
local moddir dep ret
|
||||||
|
# if we are already set to be loaded, we do not have to be checked again.
|
||||||
|
strstr "$mods_to_load" " $1 "
|
||||||
# turn a module name into a directory, if we can.
|
# turn a module name into a directory, if we can.
|
||||||
moddir=$(echo ${dsrc}/modules.d/??${1})
|
moddir=$(echo ${dsrc}/modules.d/??${1})
|
||||||
[[ -d $moddir && -x $moddir/install ]] || return 1
|
[[ -d $moddir && -x $moddir/install ]] || return 1
|
||||||
# if we do not have a check script, we are unconditionally included
|
# if we do not have a check script, we are unconditionally included
|
||||||
if [[ -x $moddir/check ]]; then
|
if [[ -x $moddir/check ]]; then
|
||||||
memoize "$moddir/check" || return 1
|
"$moddir/check"
|
||||||
|
ret=$?
|
||||||
|
# a return value of 255 = load module only as a dependency.
|
||||||
|
((ret==0||ret==255)) || return 1
|
||||||
for dep in $("$moddir/check" -d); do
|
for dep in $("$moddir/check" -d); do
|
||||||
memoize check_module_deps "$dep" && continue
|
check_module_deps "$dep" && continue
|
||||||
dwarning "Dependency $mod failed."
|
dwarning "Dependency $mod failed."
|
||||||
return 1
|
return 1
|
||||||
done
|
done
|
||||||
|
@ -244,7 +240,7 @@ should_source_module() {
|
||||||
[[ -x $1/check ]] || return 0
|
[[ -x $1/check ]] || return 0
|
||||||
"$1/check" $hostonly || return 1
|
"$1/check" $hostonly || return 1
|
||||||
for dep in $("$1/check" -d); do
|
for dep in $("$1/check" -d); do
|
||||||
memoize check_module_deps "$dep" && continue
|
check_module_deps "$dep" && continue
|
||||||
dwarning "Cannot load $mod, dependencies failed."
|
dwarning "Cannot load $mod, dependencies failed."
|
||||||
return 1
|
return 1
|
||||||
done
|
done
|
||||||
|
@ -253,6 +249,9 @@ should_source_module() {
|
||||||
check_modules() {
|
check_modules() {
|
||||||
for moddir in "$dsrc/modules.d"/[0-9][0-9]*; do
|
for moddir in "$dsrc/modules.d"/[0-9][0-9]*; do
|
||||||
local mod=${moddir##*/}; mod=${mod#[0-9][0-9]}
|
local mod=${moddir##*/}; mod=${mod#[0-9][0-9]}
|
||||||
|
# If we are already scheduled to be loaded, no need to check again.
|
||||||
|
strstr "$mods_to_load" " $mod " && continue
|
||||||
|
# This should never happen, but...
|
||||||
[[ -d $moddir ]] || continue
|
[[ -d $moddir ]] || continue
|
||||||
[[ $dracutmodules != all ]] && ! strstr "$dracutmodules" "$mod" && \
|
[[ $dracutmodules != all ]] && ! strstr "$dracutmodules" "$mod" && \
|
||||||
continue
|
continue
|
||||||
|
@ -281,7 +280,14 @@ instmods() {
|
||||||
;;
|
;;
|
||||||
--*) mpargs+=" $mod";;
|
--*) mpargs+=" $mod";;
|
||||||
*) mod=${mod##*/}
|
*) mod=${mod##*/}
|
||||||
|
# if we are already installed, skip this module and go on
|
||||||
|
# to the next one.
|
||||||
[[ -f $initdir/$1 ]] && { shift; continue; }
|
[[ -f $initdir/$1 ]] && { shift; continue; }
|
||||||
|
# If we are building a host-specific initramfs and this
|
||||||
|
# module is not already loaded, move on to the next one.
|
||||||
|
[[ $hostonly ]] && ! grep -q "$mod" /proc/modules && {
|
||||||
|
shift; continue;
|
||||||
|
}
|
||||||
modprobe $mpargs --ignore-install --set-version $kernel \
|
modprobe $mpargs --ignore-install --set-version $kernel \
|
||||||
--show-depends $mod 2>/dev/null | \
|
--show-depends $mod 2>/dev/null | \
|
||||||
while read cmd modpath options; do
|
while read cmd modpath options; do
|
||||||
|
@ -293,14 +299,14 @@ instmods() {
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
inst_simple "$modpath"
|
inst_simple "$modpath"
|
||||||
|
done
|
||||||
for fw in $(/sbin/modinfo -F firmware $mod 2>/dev/null); do
|
for fw in $(/sbin/modinfo -F firmware $mod 2>/dev/null); do
|
||||||
if [ -f /lib/firmware/$fw ]; then
|
if [[ -f /lib/firmware/$fw ]]; then
|
||||||
inst_simple "/lib/firmware/$fw"
|
inst_simple "/lib/firmware/$fw"
|
||||||
else
|
else
|
||||||
dwarning "Possible missing firmware /lib/firmware/${fw} for module ${mod}.ko"
|
dwarning "Possible missing firmware /lib/firmware/${fw} for module ${mod}.ko"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
done
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
shift
|
shift
|
||||||
|
|
Loading…
Reference in New Issue