我想netconsole
在 initrd 阶段明确加载一个模块(比如),类似于/etc/modules
主系统启动过程。
首先,我检查系统中的 initrd 是否已经包含所需的模块(参见附录)。
我查看了/initrd.img
(这是一个压缩的 cpio 档案,因此为了快速查看它,我使用zcat /initrd.img > initrd.cpio
进入了其中mc
)。我在脚本中查找了对 的调用modprobe
,并发现/conf/modules
(此处是 initrd 的根目录)中列出的模块由来自的函数(由 调用)/
自动加载。load_modules()
/scripts/functions
/init
/conf/modules
但是 Ubuntu 系统中更新initrd 的标准工具是什么?
(顺便说一句,在我研究 Ubuntu 的 initrd 代码时,我注意到脚本netconsole
中有一些特殊支持/init
,我可能会根据自己的需要进行工作,但无论如何,我的问题更为普遍,涉及任何其他自定义模块。)
附录
正如我上面所说:首先,我检查系统中的 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
#
答案1
我发现了如何在 Ubuntu 14.04 中向 initrd 添加模块。我将模块的名称添加到 /etc/initramfs-tools/modules 。这将模块添加到 initrd 文件中。在对 /etc/initramfs-tools/modules 进行更改后,不要忘记更新 initrd 文件 ( update-initramfs -u )。
答案2
Ubuntu 使用 initramfs-tools(请参阅 man initramfs-tools 了解简介)来处理 initrd 的创建。
要在 initrd 中添加模块 netconsole 并强制加载它,请在 /etc/initramfs-tools/hooks 中创建一个文件(即 /etc/initramfs-tools/hooks/netconsole),其内容如下:
/bin/sh #!/bin/sh 复制代码 先决条件="" 先决条件() { 回显“$PREREQ” } 案例 $1 先决条件) 先决条件 出口 0 ;; 埃萨克 ./usr/share/initramfs-tools/钩子函数 force_load 网络控制台
并使其可执行。然后运行:
update-initramfs -u
更新最新内核的initrd。