mkinitrd 命令用于创建初始 RAM 磁盘(initrd)映像文件。该映像文件是一个临时的根文件系统,在 Linux 内核启动过程中被加载到内存中。它的主要作用是在挂载真正的根文件系统之前,为内核提供必要的驱动程序(尤其是存储控制器驱动,如 SCSI、RAID、LVM 等)和工具,以便内核能够识别和访问包含根文件系统的存储设备。
在系统启动流程中,引导加载程序(如 GRUB)会加载内核和这个 initrd 映像。内核将其解压到内存中的一个 RAM 磁盘中,并以其作为临时根文件系统执行其中的初始化脚本(通常是 /init),该脚本负责加载实际根文件系统所需的模块,然后切换(pivot_root)到真正的根文件系统。
典型应用场景:
- 更新内核后,为新的内核版本生成对应的 initrd 映像。
- 在系统配置发生变化后(例如,在 /etc/fstab 中添加了新的存储设备或文件系统类型),重新生成 initrd 以确保启动时能正确识别。
- 将自定义的内核模块(如第三方硬件驱动)打包进 initrd。
注意:在许多现代 Linux 发行版(如 Fedora, RHEL 8+, CentOS 8+)中,mkinitrd 命令已被功能更强大的 dracut 工具取代。dracut 是新一代的 initramfs 创建工具。如果你的系统使用的是 dracut,相关命令为 dracut。
语法格式
bash
运行
mkinitrd [选项] <映像文件> <内核版本>格式说明:
[选项]:用于控制 mkinitrd 命令行为的可选参数。<映像文件>:必需参数。指定要生成的 initrd 映像文件的路径和名称,通常以 .img 结尾,例如 /boot/initramfs-$(uname -r).img。<内核版本>:必需参数。指定为哪个内核版本创建 initrd。通常使用 $(uname -r) 来获取当前运行的内核版本。
常用选项及说明
表格
| 选项 | 说明 |
|---|---|
| -f 或 --force | 如果指定的映像文件已经存在,则强制覆盖它,而不进行提示。 |
| -v 或 --verbose | 启用详细输出模式,显示命令执行过程中的详细信息,有助于调试。 |
| --preload=<模块名> | 预加载指定的内核模块到 initrd 中。可以多次使用此选项来指定多个模块。 |
| --with=<模块名> | 指定一个内核模块,mkinitrd 会分析此模块的依赖关系,并将其依赖的所有模块一同打包进 initrd。可以多次使用。 |
| --omit-scsi-modules | 在生成的 initrd 中省略所有 SCSI 相关的驱动程序模块。 |
| --version | 显示 mkinitrd 命令本身的版本信息并退出。 |
| --help | 显示命令的帮助信息摘要。 |
示例用法
示例 1:为当前运行的内核创建 initrd(基本用法)
这是最常用的命令,为当前正在运行的内核版本创建或更新 initrd 映像文件。
bash
运行
mkinitrd /boot/initrd-$(uname -r).img $(uname -r)- $(uname -r) 会自动替换为当前内核版本(如 3.10.0-1160.el7.x86_64)。
- 生成的映像文件通常位于 /boot 目录下。
示例 2:强制覆盖已存在的 initrd 文件
如果 /boot 目录下已存在同名文件,使用 -f 选项强制覆盖。
bash
运行
mkinitrd -f /boot/initramfs-$(uname -r).img $(uname -r)示例 3:创建 initrd 并显示详细过程
使用 -v 选项查看创建过程中的详细信息,例如加载了哪些模块。
bash
运行
mkinitrd -v -f /boot/initrd-$(uname -r).img $(uname -r)示例 4:将特定模块及其依赖打包进 initrd
假设系统使用了 dm_multipath(多路径)模块,需要确保它在 initrd 中可用。
bash
运行
mkinitrd --with=dm_multipath -f /boot/initrd-$(uname -r).img $(uname -r)示例 5:预加载多个自定义模块
如果安装了第三方存储控制器驱动(如 mpt3sas),需要预加载。
bash
运行
mkinitrd --preload=mpt3sas --preload=sd_mod -f /boot/initrd-custom.img 3.10.0-1160.el7.x86_64示例 6:检查生成的 initrd 文件内容
initrd 文件通常是经过 gzip 压缩的 cpio 归档文件。可以使用以下命令检查其内容:
bash
运行
# 1. 复制一份文件并解压(避免破坏原文件) cp /boot/initrd-$(uname -r).img /tmp/initrd.img.gz cd /tmp # 2. 解压 gzip gzip -d initrd.img.gz # 3. 解包 cpio 归档 mkdir initrd-root cd initrd-root cpio -idm < ../initrd.img # 4. 现在可以查看 initrd-root 目录下的文件结构了 ls -la initrd-root/注意事项
- 权限要求:创建 initrd 映像通常需要 root 权限,因为它需要读取 /lib/modules/ 下的内核模块和 /boot 目录。
bash
运行
sudo mkinitrd ... - 内核版本匹配:确保 <内核版本> 参数与 /lib/modules/ 目录下存在的内核版本目录名完全一致。使用 uname -r 是最安全的方式。
- dracut 的替代:如前所述,在新版系统中(使用 systemd 和 initramfs),应优先使用 dracut 命令。其基本用法类似:
bash
运行
dracut -f /boot/initramfs-$(uname -r).img $(uname -r) - 生成后更新引导配置:在大多数情况下,更新 initrd 后,建议检查引导加载程序(如 GRUB)的配置,确保其指向新生成的映像文件,尤其是在手动指定文件名时。