我想netconsole
在 initrd 阶段显式加载一个模块(比如 ),类似于/etc/modules
在主系统启动过程中。
首先,我检查了我系统中的 initrd 是否已经包含了想要的模块(见附录)。
我已经查看过/initrd.img
(这是一个压缩的 cpio 存档,所以为了快速查看它,我已经完成zcat /initrd.img > initrd.cpio
并进入其中mc
)。我已经在脚本中查找了任何调用,并发现(此处是 initrd 的根目录)modprobe
中列出的模块由来自(调用方)的函数自动加载。/conf/modules
/
load_modules()
/scripts/functions
/init
但是 Ubuntu 系统中更新/conf/modules
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
#
我发现了如何在 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)中创建一个包含以下内容的文件:
并使其可执行。然后运行:
update-initramfs -u
更新最新内核的 initrd。