[PATCH 23/50] Rip out old recursive module loading, replace with something simpler
bash allows unlimited recursion and several other tricks to make finding all the dependencies of a kernel module much simpler. This nukes about 130 lines, most of it in dracut-functions. This diff also touches some cleanups made in the inst function.master
parent
170b260bd9
commit
6fa0c3d60b
6
dracut
6
dracut
|
@ -113,11 +113,7 @@ for d in etc proc sys sysroot dev/pts; do mkdir -p "$initdir/$d"; done
|
|||
# FIXME: hard-coded module list of doom.
|
||||
[[ $modules ]] || modules="=ata =block =drm dm-crypt aes sha256 cbc"
|
||||
|
||||
mkdir -p "$initdir/lib/modules/$kernel"
|
||||
# expand out module deps, etc
|
||||
for mod in $(resolveAndExpandModules $modules) ; do
|
||||
installmodule $mod "$initdir"
|
||||
done
|
||||
instmod $modules
|
||||
|
||||
/sbin/depmod -a -b "$initdir" $kernel || {
|
||||
error "\"/sbin/depmod -a $kernel\" failed."
|
||||
|
|
183
dracut-functions
183
dracut-functions
|
@ -70,12 +70,10 @@ inst() {
|
|||
local root="${1%%/}" ; shift
|
||||
local dest="${1##/}"
|
||||
[[ $dest ]] || dest="${file##/}"
|
||||
|
||||
mkdir -p "$root/${dest%/*}"
|
||||
|
||||
local RET=0
|
||||
local target=""
|
||||
[ -L "$file" ] && target=$(readlink "$file")
|
||||
[[ -L $file ]] && target=$(readlink "$file")
|
||||
if [[ $target && $dest != $target ]]; then
|
||||
if [[ -e $root/$dest ]]; then
|
||||
RET=0
|
||||
|
@ -83,25 +81,22 @@ inst() {
|
|||
ln -sf "$target" "$root/$dest"
|
||||
#inst "$target" "$root"
|
||||
local BASE=${target##*/}
|
||||
local LIBDIR=`echo "$file" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,'`
|
||||
local LIBDIR=$(echo "$file" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,')
|
||||
if [[ $LIBDIR = $BASE ]]; then
|
||||
local LIBDIR=`echo "/$dest" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,'`
|
||||
local LIBDIR=$(echo "/$dest" | sed -e 's,\(\(.*\)/\)[^/]\+$,\1,')
|
||||
fi
|
||||
|
||||
local TLIBDIR=`echo "$target" | sed -e 's,\(^/lib[^/]*\)/.*$,\1/,' \
|
||||
-e 's,\(\(.*\)/\)[^/]\+$,\1,'`
|
||||
local TLIBDIR=$(echo "$target" | sed -e 's,\(^/lib[^/]*\)/.*$,\1/,' \
|
||||
-e 's,\(\(.*\)/\)[^/]\+$,\1,')
|
||||
if [[ $TLIBDIR = $BASE ]]; then
|
||||
local TLIBDIR=`echo "/$dest" | sed \
|
||||
local TLIBDIR=$(echo "/$dest" | sed \
|
||||
-e 's,\(^/lib[^/]*\)/.*$,\1/,' \
|
||||
-e 's,\(\(.*\)/\)[^/]\+$,\1,'`
|
||||
-e 's,\(\(.*\)/\)[^/]\+$,\1,')
|
||||
fi
|
||||
|
||||
inst "$LIBDIR/$BASE" "$root" "$TLIBDIR/$BASE"
|
||||
RET=$?
|
||||
return $RET
|
||||
fi
|
||||
fi
|
||||
|
||||
local SHEBANG=$(dd if="$file" bs=2 count=1 2>/dev/null)
|
||||
if [[ $SHEBANG = '#!' ]]; then
|
||||
# We're intentionally not playing the "what did this moron run
|
||||
|
@ -111,7 +106,6 @@ inst() {
|
|||
RET=$?
|
||||
return $RET
|
||||
fi
|
||||
|
||||
if [[ -e $root/$dest ]]; then
|
||||
RET=0
|
||||
else
|
||||
|
@ -120,162 +114,61 @@ inst() {
|
|||
RET=$?
|
||||
else
|
||||
cp -aL "$file" "$root/$dest"
|
||||
|
||||
local DEPS=$(get_dso_deps "$file")
|
||||
if [[ $DEPS ]]; then
|
||||
IF_dynamic="yes"
|
||||
fi
|
||||
for x in $DEPS; do
|
||||
local TLIBDIR=`echo "$x" | sed 's,\(/lib[^/]*\)/.*$,\1,'`
|
||||
local BASE=`basename "$x"`
|
||||
local TLIBDIR=$(echo "$x" | sed 's,\(/lib[^/]*\)/.*$,\1,')
|
||||
local BASE=$(basename "$x")
|
||||
inst "$x" "$root" "$TLIBDIR/$BASE"
|
||||
done
|
||||
RET=$?
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
return $RET
|
||||
}
|
||||
|
||||
# module dep finding and installation functions
|
||||
moduledep() {
|
||||
MPARGS=""
|
||||
if [ "$1" == "--ignore-install" ]; then
|
||||
MPARGS="$MPARGS --ignore-install"
|
||||
shift
|
||||
fi
|
||||
deps=""
|
||||
deps=$(modprobe $MPARGS --set-version $kernel --show-depends $1 2>/dev/null| awk '/^insmod / { print gensub(".*/","","g",$2) }' | while read foo ; do [ "${foo%%.ko}" != "$1" ] && echo -n "${foo%%.ko} " ; done)
|
||||
modcat="/lib/modules/$kernel/modules"
|
||||
instmods() {
|
||||
local mod mpargs modpath modname cmd
|
||||
while (($# > 0)); do
|
||||
mod=${1%.ko}
|
||||
case $mod in
|
||||
=ata) instmods $mpargs $(cat "${modcat}.block" |egrep 'ata|ahci');;
|
||||
=*) instmods $mpargs $(cat "${modcat}.${mod#=}");;
|
||||
--*) mpargs+=" $mod";;
|
||||
*) modprobe $mpargs --set-version $kernel --show-depends $mod \
|
||||
2>/dev/null |while read cmd modpath; do
|
||||
[[ $cmd = insmod ]] || continue
|
||||
modname=${modpath##*/}
|
||||
modname=${modname%.ko}
|
||||
[[ ${mod/-/_} != ${modname/-/_} ]] && {
|
||||
instmods $mpargs $modname
|
||||
continue
|
||||
}
|
||||
|
||||
locatemodule() {
|
||||
MPARGS=""
|
||||
if [ "$1" == "--ignore-install" ]; then
|
||||
MPARGS="$MPARGS --ignore-install"
|
||||
shift
|
||||
fi
|
||||
fmPath=$(modprobe $MPARGS --set-version $kernel --show-depends $1 2>/dev/null | awk '/^insmod / { print $2; }' | tail -1)
|
||||
if [ -n "$fmPath" -a -f "$fmPath" ]; then
|
||||
return 0
|
||||
fi
|
||||
for modExt in o.gz o ko ; do
|
||||
for modDir in /lib/modules/$kernel/updates /lib/modules/$kernel ; do
|
||||
if [ -d $modDir ]; then
|
||||
fmPath=$(find $modDir -name $1.ko |awk {'print $1; exit;'})
|
||||
if [ -n "$fmPath" -a -f "$fmPath" ]; then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
inst "$modpath" "$initdir" "/lib/modules/$kernel/$modname.ko"
|
||||
done
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
resolveAndExpandModules() {
|
||||
items=$*
|
||||
|
||||
mods=$(expandModules $items)
|
||||
resdeps mods
|
||||
echo $resolved
|
||||
}
|
||||
|
||||
expandModules() {
|
||||
items=$*
|
||||
|
||||
for m in $items ; do
|
||||
char=$(echo $m | cut -c1)
|
||||
if [ $char = '=' ]; then
|
||||
NAME=$(echo $m | cut -c2-)
|
||||
if [ "$NAME" = "ata" ]; then
|
||||
MODS="$MODS $(cat /lib/modules/$kernel/modules.block |egrep '(ata|ahci)' |sed -e 's/.ko//')"
|
||||
else
|
||||
# Ignore if group list does not exist
|
||||
if [ -e /lib/modules/$kernel/modules.$NAME ]; then
|
||||
MODS="$MODS $(cat /lib/modules/$kernel/modules.$NAME |sed -e 's/.ko//')"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
MODS="$MODS $m"
|
||||
fi
|
||||
done
|
||||
echo $MODS
|
||||
}
|
||||
|
||||
installmodule()
|
||||
{
|
||||
MPARGS=""
|
||||
if [ "$1" == "--ignore-install" ]; then
|
||||
MPARGS="$MPARGS --ignore-install"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
fi
|
||||
MODULE=$1
|
||||
MNTIMAGE=$2
|
||||
fmPath=""
|
||||
locatemodule $MPARGS $MODULE
|
||||
MODULE=$fmPath
|
||||
if [ -z "$MODULE" ]; then
|
||||
return
|
||||
fi
|
||||
if [ -x /usr/bin/strip ]; then
|
||||
/usr/bin/strip -g $MODULE -o $MNTIMAGE/lib/modules/$kernel/$(basename $MODULE)
|
||||
else
|
||||
inst "$MODULE" "$MNTIMAGE" "/lib/modules/$kernel/$(basename $MODULE)"
|
||||
fi
|
||||
for fw in $(/sbin/modinfo -F firmware $MODULE 2>/dev/null); do
|
||||
done
|
||||
for fw in $(/sbin/modinfo -F firmware $mod 2>/dev/null); do
|
||||
if [ -f /lib/firmware/$fw ]; then
|
||||
inst "/lib/firmware/$fw" "$MNTIMAGE" "/lib/firmware/$fw"
|
||||
inst_simple "/lib/firmware/$fw"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# This loops to make sure it resolves dependencies of dependencies of...
|
||||
resdeps () {
|
||||
modlist="$1"
|
||||
|
||||
before=1
|
||||
after=2
|
||||
|
||||
items=$(eval echo \${$modlist})
|
||||
while [ $before != $after ]; do
|
||||
before=$(echo $items | wc -c)
|
||||
list=""
|
||||
|
||||
for i in $items ; do
|
||||
deps=""
|
||||
moduledep $i
|
||||
list="$list $deps"
|
||||
done
|
||||
items=$(for n in $items $list; do echo $n; done | sort -u)
|
||||
after=`echo $items | wc -c`
|
||||
done
|
||||
|
||||
resolved="$items"
|
||||
}
|
||||
|
||||
findkeymap () {
|
||||
local MAP=$1
|
||||
|
||||
if [ ! -f "$MAP" ]; then
|
||||
[[ ! -f $MAP ]] && \
|
||||
MAP=$(find /lib/kbd/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1)
|
||||
fi
|
||||
|
||||
case " $KEYMAPS " in
|
||||
*" $MAP "*)
|
||||
return
|
||||
;;
|
||||
esac
|
||||
|
||||
[[ " $KEYMAPS " = *" $MAP "* ]] && return
|
||||
KEYMAPS="$KEYMAPS $MAP"
|
||||
|
||||
case $MAP in
|
||||
*.gz)
|
||||
cmd=zgrep
|
||||
;;
|
||||
*.bz2)
|
||||
cmd=bzgrep
|
||||
;;
|
||||
*)
|
||||
cmd=grep
|
||||
;;
|
||||
*.gz) cmd=zgrep;;
|
||||
*.bz2) cmd=bzgrep;;
|
||||
*) cmd=grep ;;
|
||||
esac
|
||||
|
||||
for INCL in $($cmd "^include " $MAP | cut -d' ' -f2 | tr -d '"'); do
|
||||
|
|
Loading…
Reference in New Issue