如何在 initrd 中加载模块?

如何在 initrd 中加载模块?

我想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。

相关内容