]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
Record loaded kernel modules when hostonly mode is enabled
authorKairui Song <kasong@redhat.com>
Tue, 17 Jul 2018 09:16:07 +0000 (17:16 +0800)
committerHarald Hoyer <harald@hoyer.xyz>
Wed, 18 Jul 2018 09:50:18 +0000 (11:50 +0200)
A hostonly image will not include every possibly required kernel module,
so if any hardware or configuration changed, the image may fail to boot.

One way to know if there are any hardware change or configuration change
that will require an image rebuild or not is to check the loaded kernel
module list. If the loaded kernel module list differs from last build
time, then the image may require to be rebuilt.

This commit will let dracut record the loaded kernel module list when
the image is being built, so other tools or services can compare this
list with currently loaded kernel modules to decide if dracut should be
called to rebuild the image.

To retrieve the loaded kernel modules list when an image is built, use
lsinitrd command:

lsinitrd $image -f */lib/dracut/loaded-kernel-modules.txt

dracut-functions.sh
dracut.sh

index ccc489719678600fdf132136e92677523dcb3bed..7c408f836382ef33e1e0735cde82e8b6c6f81f5a 100755 (executable)
@@ -676,6 +676,17 @@ get_ucode_file ()
     fi
 }
 
+# Get currently loaded modules
+# sorted, and delimited by newline
+get_loaded_kernel_modules ()
+{
+    local modules=( )
+    while read _module _size _used _used_by; do
+        modules+=( "$_module" )
+    done <<< $(lsmod | sed -n '1!p')
+    printf '%s\n' "${modules[@]}" | sort
+}
+
 # Not every device in /dev/mapper should be examined.
 # If it is an LVM device, touch only devices which have /dev/VG/LV symlink.
 lvm_internal_dev() {
index cfa4abde136040f4019f695f1aa4344998e44d25..6614d27df7eb1b05e54f3dcdcdf011b7cbe25ed3 100755 (executable)
--- a/dracut.sh
+++ b/dracut.sh
@@ -1492,6 +1492,9 @@ dinfo "*** Including modules done ***"
 
 ## final stuff that has to happen
 if [[ $no_kernel != yes ]]; then
+    if [[ $hostonly ]]; then
+        echo "$(get_loaded_kernel_modules)" > $initdir/lib/dracut/loaded-kernel-modules.txt
+    fi
 
     if [[ $drivers ]]; then
         hostonly='' instmods $drivers