如何在initrd中加载模块?

我想在initrd阶段显式加载模块(比如netconsole ),类似于主系统启动过程中的/etc/modules

首先,我检查了系统中的initrd是否已包含所需模块(参见附录)。

我查看了/initrd.img (这是一个压缩的cpio存档,所以为了快速查看它,我已经完成了zcat /initrd.img > initrd.cpio并使用mc进入了它)。 我已经在脚本中查找了modprobe任何调用,并且已经发现/conf/modules modules中列出的/conf/modules/这里是initrd的根)是由/scripts/functionsload_modules()函数自动加载的(由/init调用/init )。

但是Ubuntu系统中更新/conf/modules initrd /conf/modules的标准工具是什么?

(顺便说一句,在我研究Ubuntu的initrd代码时,我注意到/init脚本中有一些特殊的netconsole支持,我可能会根据我的需要进行工作,但无论如何,我的问题更为笼统,关于任何问题。其他自定义模块。)

附录

正如我上面所说:首先,我检查了系统中的initrd已经包含了想要的模块(即netconsole )。 这是如何:

 # zcat /initrd.img | cpio --extract --verbose --list | fgrep netconsole -rw-r--r-- 1 root root 25372 Aug 31 20:59 lib/modules/3.19.0-28-generic/kernel/drivers/net/netconsole.ko 109504 blocks # 

而且我检查它已经包含所需的网络驱动程序:

 # ls -ld /sys/class/net/eth0/device/driver lrwxrwxrwx 1 root root 0 Sep 21 15:34 /sys/class/net/eth0/device/driver -> ../../../../bus/pci/drivers/sky2 # zcat /initrd.img | cpio --extract --verbose --list | fgrep sky2 -rw-r--r-- 1 root root 92948 Aug 31 20:49 lib/modules/3.19.0-28-generic/kernel/drivers/net/ethernet/marvell/sky2.ko 109504 blocks # 

我发现如何在Ubuntu 14.04中向initrd添加模块我在/ etc / initramfs-tools / modules中添加了模块的名称。 这将模块添加到initrd文件中。 在对/ etc / initramfs-tools / modules进行更改后,不要忘记更新initrd文件(update-initramfs -u)。

Ubuntu使用initramfs-tools(参见man initramfs-tools作为介绍)来处理initrd的创建。

要在initrd中添加模块netconsole并强制加载,请在/ etc / initramfs-tools / hooks(即/ etc / initramfs-tools / hooks / netconsole)中创建一个文件,其中包含以下内容:

 #!/ bin / sh的
 PREREQ = “”
 prereqs()
 {
    echo“$ PREREQ”
 }

案例1美元
 prereqs)
    prereqs
   退出0
    ;;
 ESAC

 。 在/ usr /共享/的initramfs工具/钩子函数

 force_load netconsole

并使其可执行。 然后运行:

update-initramfs -u

更新最新内核的initrd。