5.5. 验证初始 RAM 文件系统镜像
初始 RAM 文件系统映像的作用是预加载块设备模块,如 IDE、SCSI 或 RAID,以便可以访问和挂载这些模块通常所在的根文件系统。在红帽企业 Linux 7 系统上,每当使用 Yum、PackageKit 或 RPM 软件包管理器安装新内核时,安装脚本始终会调用 Dracut 实用程序来创建 initramfs (初始 RAM 文件系统映像)。
如果您通过修改 /etc/sysctl.conf 文件或其他
sysctl
配置文件更改内核属性,如果在引导过程早期使用了更改的设置,则可能需要运行 dracut -f
命令来重建初始 RAM 文件系统镜像。例如,如果您已对联网进行了更改,并且从网络连接存储引导。
在 IBM eServer System i 以外的所有构架中(请参阅 “在 IBM eServer System i 上验证初始 RAM 文件系统镜像和内核”一节),您可以通过运行 dracut
命令创建 initramfs
。但是,您通常不需要手动创建 initramfs
:如果从红帽分发的 RPM 软件包安装或升级了内核及其相关软件包,则会自动执行这一步。
您可以按照以下步骤验证与当前内核版本对应的 initramfs
是否存在,并在 grub.cfg
配置文件中正确指定:
验证初始 RAM 文件系统镜像
以
root
身份列出/boot
目录中的内容,并使用最新(最新的)版本号查找内核(vmlinuz
:-kernel_version)和 initramfs- kernel_version
例 5.1. 确保内核和 initramfs 版本匹配
# ls /boot config-3.10.0-67.el7.x86_64 config-3.10.0-78.el7.x86_64 efi grub grub2 initramfs-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c.img initramfs-3.10.0-67.el7.x86_64.img initramfs-3.10.0-67.el7.x86_64kdump.img initramfs-3.10.0-78.el7.x86_64.img initramfs-3.10.0-78.el7.x86_64kdump.img initrd-plymouth.img symvers-3.10.0-67.el7.x86_64.gz symvers-3.10.0-78.el7.x86_64.gz System.map-3.10.0-67.el7.x86_64 System.map-3.10.0-78.el7.x86_64 vmlinuz-0-rescue-07f43f20a54c4ce8ada8b70d33fd001c vmlinuz-3.10.0-67.el7.x86_64 vmlinuz-3.10.0-78.el7.x86_64
例 5.1 “确保内核和 initramfs 版本匹配” 显示:
-
我们已安装三个内核(或者
/boot
目录中存在三个内核文件) -
最新的内核是
vmlinuz-3.10.0-78.el7.x86_64
,并且 与内核版本
initramfs
-3.10.0-78.el7.x86_64kdump.img
相匹配的 initramfs 文件也存在。重要在
/boot
目录中,您可能找到几个initramfs-kernel_versionkdump.img
文件。这些是由 Kdump 机制创建的特殊文件用于内核调试目的,不用于引导系统,可以安全地忽略。有关kdump
的详情请参考 Red Hat Enterprise Linux 7 内核崩溃指南。
-
我们已安装三个内核(或者
如果您的
initramfs-kernel_version
文件与/boot
目录中的最新内核版本不匹配,或者在某些情况下,您可能需要使用 Dracut 实用程序生成initramfs
文件。简单地在不使用选项的情况下以root
身份调用dracut
会导致它在/boot
中为该目录中存在的最新内核生成initramfs
文件:# dracut
如果您希望
dracut
覆盖现有的initramfs
,则必须使用-f
,--force
选项(例如,如果您的initramfs
已损坏)。Othertherdracut
拒绝覆盖现有的initramfs
文件:# dracut Does not override existing initramfs (/boot/initramfs-3.10.0-78.el7.x86_64.img) without --force
您可以通过调用
dracut initramfs _namekernel_version在当前目录中创建 initramfs
:# dracut "initramfs-$(uname -r).img" $(uname -r)
如果您需要指定预加载的特定内核模块,请在
add_dracut
)。您可以使用.
koconf 配置文件的括号中添加这些模块的名称(减去任何文件名后缀,
如.lsinitrd
文件的文件内容:initramfs
_file 命令列出 dracut 创建的 initramfs 镜像# lsinitrd /boot/initramfs-3.10.0-78.el7.x86_64.img Image: /boot/initramfs-3.10.0-78.el7.x86_64.img: 11M ======================================================================== dracut-033-68.el7 ======================================================================== drwxr-xr-x 12 root root 0 Feb 5 06:35 . drwxr-xr-x 2 root root 0 Feb 5 06:35 proc lrwxrwxrwx 1 root root 24 Feb 5 06:35 init -> /usr/lib/systemd/systemd drwxr-xr-x 10 root root 0 Feb 5 06:35 etc drwxr-xr-x 2 root root 0 Feb 5 06:35 usr/lib/modprobe.d [output truncated]
有关选项和用法的更多信息
,请参阅 man
dracut 和 man dracut.conf
。检查
/boot/grub2/grub.cfg
配置文件,以确保您正在引导的内核版本存在initramfs-kernel_version.img
文件。例如:# grep initramfs /boot/grub2/grub.cfg initrd16 /initramfs-3.10.0-123.el7.x86_64.img initrd16 /initramfs-0-rescue-6d547dbfd01c46f6a4c1baa8c4743f57.img
如需更多信息,请参阅 第 5.6 节 “验证引导装载程序”。
在 IBM eServer System i 上验证初始 RAM 文件系统镜像和内核
在 IBM eServer System i 机器上,初始 RAM 文件系统和内核文件合并到一个文件中,该文件通过 addRamDisk
命令创建。如果从红帽分发的 RPM 软件包安装或升级了内核及其相关软件包,则会自动执行此步骤,因此不需要手动执行该步骤。要验证它是否已创建,请以 root 用户身份
运行以下命令,确保 /boot/vmlinitrd-kernel_version
文件已存在:
# ls -l /boot/
kernel_version 需要与刚才安装的内核版本匹配。
取消对初始 RAM 文件系统镜像所做的更改
例如,在某些情形中,如果您错误配置系统且不再引导,则需要按照以下步骤撤销对初始 RAM 文件系统镜像所做的更改:
撤销对初始 RAM 文件系统镜像的更改
- 在 GRUB 菜单中选择救援内核重新引导系统。
-
更改导致
initramfs
出现故障的错误设置。 以 root 用户身份运行以下命令,使用正确的设置重新创建
initramfs
:# dracut --kver kernel_version --force
例如,当您在 sysctl.conf
文件中错误设置了 vm.nr_hugepages
时,上述步骤可能很有用。由于 sysctl.conf
文件包含在 initramfs
中,新的 vm.nr_hugepages
设置会应用到 initramfs
中,并导致重新构建 initramfs
。但是,由于设置不正确,因此新的 initramfs
会中断,且新构建的内核不会引导,因此需要使用上述步骤更正设置。
列出初始 RAM 文件系统镜像的内容
要列出 initramfs
中包含的文件,以 root 用户身份运行以下命令:
# lsinitrd
要只列出 /etc
目录中的文件,请使用以下命令:
# lsinitrd | grep etc/
要输出存储在 initramfs
中为当前内核保存的特定文件的内容,请使用 -f
选项:
# lsinitrd -f filename
例如,要输出 sysctl.conf
的内容,请使用以下命令:
# lsinitrd -f /etc/sysctl.conf
要指定内核版本,请使用 --kver
选项:
# lsinitrd --kver kernel_version -f /etc/sysctl.conf
例如,要列出有关内核版本 3.10.0-327.10.1.el7.x86_64 的信息,请使用以下命令:
# lsinitrd --kver 3.10.0-327.10.1.el7.x86_64 -f /etc/sysctl.conf