如何在initrd中加载模块?
我想在initrd阶段显式加载模块(比如netconsole
),类似于主系统启动过程中的/etc/modules
。
首先,我检查了系统中的initrd是否已包含所需模块(参见附录)。
我查看了/initrd.img
(这是一个压缩的cpio存档,所以为了快速查看它,我已经完成了zcat /initrd.img > initrd.cpio
并使用mc
进入了它)。 我已经在脚本中查找了modprobe
任何调用,并且已经发现/conf/modules
modules中列出的/conf/modules
( /
这里是initrd的根)是由/scripts/functions
的load_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。