Browse Source

Added support for including necessary firmware into initramfs

Maxim Kammerer 12 years ago
parent
commit
3356df9325

+ 3 - 3
src/etc/init.d/xconfig

@@ -65,11 +65,11 @@ start() {
         rm -f ${xorgdir}/xorg.conf.new
 
         if   get_bootparam 'xvesa'; then
-            tryxconf vesa        ewarn  "[fallback] VESA X server driver"
+            tryxconf vesa        ewarn  "[forced] VESA X server driver"
         elif get_bootparam 'xfb';   then
-            tryxconf fbdev       ewarn  "[fallback] Framebuffer X server driver"
+            tryxconf fbdev       ewarn  "[forced] Framebuffer X server driver"
         elif get_bootparam 'xkms';  then
-            tryxconf modesetting ewarn  "[fallback] Modesetting X server driver"
+            tryxconf modesetting ewarn  "[forced] Modesetting X server driver"
         else
             tryxconf native      einfo  "Native X server driver"
             tryxconf modesetting ewarn  "[fallback] Modesetting X server driver"

+ 39 - 31
src/root/helpers/gen-initramfs

@@ -6,44 +6,38 @@ kversion=${hsversion/-/-hardened-}
 [ ${kversion} != ${hsversion} ] || kversion=${hsversion}-hardened
 
 
-# modules.fs:     per-filesystem module lists to load during init
-# modules.extra:  extra modules to add to initramfs (covers modules.fs)
-# modules.global: complete module directories to add to initramfs
-extralst=${HOME}/initrd/modules.extra
-globlst=${HOME}/initrd/modules.global
+# Modules / module directories to add to initramfs
+modlst=${HOME}/initrd/modules.init
+fwlst=${HOME}/initrd/modules.fw
 initramfs=${HOME}/initrd/initramfs
 
 
 # Modules staging directory
-stagedir=`mktemp -d`
-modlst=${stagedir}/modules.list
-initlst=${stagedir}/initramfs
+stagebase=`mktemp -d`
+stagedir=${stagebase}/stage
+initlst=${stagebase}/initramfs
 
 mainobj=/usr/src/linux-main
 image=/usr/local/addons/initrd/initrd-x86.cpio
 
 
-# Determine module names to add to initramfs (not necessarily canonical)
-extmods=`sed -n '/^[^#]/p' ${extralst}`
-globmods=
-for globmod in `sed -n '/^[^#]/p' ${globlst}`; do
-    globmods="${globmods} "`find /lib/modules/${kversion}/kernel/${globmod} \
-                                 -name '*.ko' -printf '%f\n' | sed 's/\.ko$//'`
-done
-
-
-# Build list of modules to copy, including dependencies
-for mod in ${extmods} ${globmods}; do
+# Prepare initramfs kernel modules
+sed -n '/^[^#]/p' ${modlst} | while read mod; do
+    # Determine module names to add to initramfs (not necessarily canonical)
+    if [ -z "${mod##*/*}" ]; then
+        find /lib/modules/${kversion}/kernel/${mod} \
+             -name '*.ko' -printf '%f\n' | sed 's/\.ko$//'
+    else
+        echo ${mod}
+    fi
+done | while read mod; do
+    # Build list of modules to copy, including dependencies
     # unlike "modinfo -F depends", "modprobe -i --show-depends" lists nested
     # dependencies, and does it with canonical paths (i.e., _ vs. -, aliases, ...)
-    modprobe -ni --show-depends -S ${kversion} ${mod} \
-        | sed -n 's/^insmod //p' >> ${modlst}
-done
-
-
-# Copy modules and compute their dependencies and map
-# (depmod will fail if not all dependencies are present)
-for mod in `sort -u ${modlst}`; do
+    modprobe -ni --show-depends -S ${kversion} ${mod}
+done | sed -n 's/^insmod //p' | sort -u | while read mod; do
+    # Copy modules and compute their dependencies and map
+    # (depmod will fail if not all dependencies are present)
     mkdir -p     ${stagedir}`dirname ${mod}`
     cp -p ${mod} ${stagedir}`dirname ${mod}`
 done
@@ -51,15 +45,29 @@ cp /lib/modules/${kversion}/modules.{builtin,order} ${stagedir}/lib/modules/${kv
 depmod -b ${stagedir} -e -F ${mainobj}/System.map ${kversion}
 
 
+# Prepare initramfs firmwares
+sed -n '/^[^#]/p' ${fwlst} | while read fw; do
+    find /lib/firmware/${fw} ! -type d
+done | while read fw; do
+    mkdir -p    ${stagedir}`dirname ${fw}`
+    cp -p ${fw} ${stagedir}`dirname ${fw}`
+done
+
+
 # Build complete initramfs file list
-cp ${initramfs} ${stagedir}
-find ${stagedir} -mindepth 3 -type d \
+cp ${initramfs} ${stagebase}
+find ${stagedir} -mindepth 1 -type d \
     -printf 'dir  %P    0755 0 0\n' >> ${initlst}
-find ${stagedir} -mindepth 3 -type f \
+find ${stagedir} -mindepth 1 -type f \
     -printf 'file %P %p 0644 0 0\n' >> ${initlst}
 
+if [ -n "`find ${stagedir} ! -type d ! -type f`" ]; then
+    echo "Enexpected modules/firmware file types"
+    exit 1
+fi
+
 
 # Generate initramfs archive
 ${mainobj}/usr/gen_init_cpio ${initlst} > ${image}
 
-rm -r ${stagedir}
+rm -r ${stagebase}

+ 4 - 3
src/root/helpers/lst-firmwares

@@ -41,7 +41,8 @@ comm -13 <(find /lib/firmware ! -type d -printf '%P\n' | sort)
     | sed 's/^/unlisted: /'
 
 
-# Ensure that initramfs modules do not require any firmware
-strings -a -n 10 $(bsdtar tf ${initrd} 'lib/modules/*.ko' | sed 's:^:/:') \
-    | sed -n 's/^firmware=//p' | sort -u                                  \
+# Ensure that initramfs modules do not require unincluded firmware
+diff <(bsdtar tf ${initrd} 'lib/firmware/*.*' | sed 's:^lib/firmware/::' | sort -u) \
+     <(modinfo -k ${kversion} -F firmware \
+       $(bsdtar tf ${initrd} 'lib/modules/*.ko' | sed 's:^.*/\(.*\)\.ko:\1:') | sort -u) \
     | sed 's/^/initramfs: /'

+ 1 - 4
src/root/initrd/initramfs

@@ -17,7 +17,6 @@ dir   stage          0755 0 0
 dir   stage/boot     0755 0 0
 dir   stage/live     0755 0 0
 dir   stage/rwroot   0755 0 0
-dir   stage/union    0755 0 0
 
 # Busybox
 dir   bin            0755 0 0
@@ -27,6 +26,4 @@ file  bin/busybox       /bin/busybox              0755 0 0
 dir   proc           0755 0 0
 dir   sys            0755 0 0
 
-# Module directories
-dir   lib            0755 0 0
-dir   lib/modules    0755 0 0
+# Entries added in gen-initramfs below

+ 0 - 7
src/root/initrd/modules.extra

@@ -1,7 +0,0 @@
-# Loop devices
-loop
-
-
-# Virtio storage (e.g., QEMU)
-virtio_pci
-virtio_blk

+ 1 - 1
src/root/initrd/modules.fs

@@ -1,4 +1,4 @@
-# Modules to force-load during initramfs stage (see modules.extra)
+# Modules to force-load during initramfs stage (see modules.init)
 # (no module autoloading on mount in Busybox)
 force_load_fs="squashfs vfat isofs ext4 hfsplus nls_cp437 nls_iso8859-1 nls_utf8"
 

+ 4 - 0
src/root/initrd/modules.fw

@@ -0,0 +1,4 @@
+# Both directories and individual files are supported
+
+# USB_STORAGE_ENE_UB6250
+ene-ub6250

+ 13 - 0
src/root/initrd/modules.global → src/root/initrd/modules.init

@@ -1,3 +1,16 @@
+# === Individual modules ===
+
+# Loop devices
+loop
+
+# Virtio storage (e.g., QEMU)
+virtio_pci
+virtio_blk
+
+
+
+# === Module packages ===
+
 # USB 1.1/2/3/W hosts and storage devices
 drivers/usb/host
 drivers/usb/storage