第 26 章 使用 GRUB 2
Red Hat Enterprise Linux 7 带有 GNU GRand Unified Bootloader(GRUB 2)版本 2,允许用户选择在系统启动时载入的操作系统或内核。GRUB 2 还允许用户向内核传递参数。
26.1. GRUB 2 简介
GRUB 2 从基于 BIOS 的传统机器上的 /boot/grub2/grub.cfg
文件中读取其配置,以及 UEFI 计算机上的 /boot/efi/EFI/redhat/grub.cfg
文件。此文件包含菜单信息。
GRUB 2 配置文件 grub.cfg 在安装
期间或通过调用 /usr/sbin/grub2-mkconfig 实用程序生成,每次安装新内核时,RUB by
会自动更新该文件。使用 grub2-mkconfig 手动 生成时,文件会根据 /etc/grub.d/
中的模板文件生成,以及 /etc/default/grub
文件中的自定义设置。当使用 grub2-mkconfig 重新生成文件时,grub.cfg
的编辑都将丢失,因此还必须小心反映 /etc/default/grub
中的任何手动更改。
grub.cfg
上的常规操作(例如删除和添加新内核)应使用 grubby
工具执行;对于脚本,应使用 new-kernel-pkg
工具执行。如果您使用 grubby
修改默认内核,则安装新内核时将继承更改。有关 grubby
的更多信息,请参阅 第 26.4 节 “使用 grubby 工具对 GRUB 2 菜单进行持久更改”。
grub2-mkconfig
工具使用 /etc/default/grub
文件,该工具供 anaconda
在安装过程中创建 grub.cfg
使用;出现故障时,例如需要重新创建启动加载器配置时,可以使用该文件。通常,不建议手动运行 grub
文件,除非作为最后的手段。请注意,对 2-mkconfig 来替换 grub
.cfg/etc/default/grub
的任何手动更改都需要重建 grub.cfg
文件。
grub.cfg 中的菜单条目
在各种代码片段和指令中,grub .cfg
配置文件包含一个或多个 菜单输入
块,各自代表单个 GRUB 2 引导菜单条目。这些块始终以 menuentry
关键字开头,后跟标题、选项列表和打开大括号,最后是右花括号。打开和关闭括号之间的任何内容都应缩进。例如,以下是带有 Linux 内核 3.8.0-0.40.el7.x86_64 的 Red Hat Enterprise Linux 7 的菜单输入
块示例:
menuentry 'Red Hat Enterprise Linux Server' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-c60731dc-9046-4000-9182-64bdcce08616' { load_video set gfxpayload=keep insmod gzio insmod part_msdos insmod xfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 19d9e294-65f8-4e37-8e73-d41d6daa6e58 else search --no-floppy --fs-uuid --set=root 19d9e294-65f8-4e37-8e73-d41d6daa6e58 fi echo 'Loading Linux 3.8.0-0.40.el7.x86_64 ...' linux16 /vmlinuz-3.8.0-0.40.el7.x86_64 root=/dev/mapper/rhel-root ro rd.md=0 rd.dm=0 rd.lvm.lv=rhel/swap crashkernel=auto rd.luks=0 vconsole.keymap=us rd.lvm.lv=rhel/root rhgb quiet echo 'Loading initial ramdisk ...' initrd /initramfs-3.8.0-0.40.el7.x86_64.img }
代表安装的 Linux 内核的每个 菜单输入
块包含 64 位 IBM POWER 系列 中的
linux、x86_64 基于 BIOS 的系统中
。然后,init linux16
,以及基于 UEFI 的系统上的 linuxefird
指令加上到内核的路径和 initramfs
镜像。如果创建了单独的 /boot
分区,到内核和 initramfs 镜像
的路径相对于 /boot
。在上例中,init rd /initramfs-3.8.0-0.40.el7.x86_64.img
行表示 initramfs
映像实际位于 /boot/initramfs-3.8.0-0.40.el7.x86_64.img
(在 根
文件系统挂载时)。
linux16 /vmlinuz-kernel_version
行上提供的内核版本号必须与每个 菜单条目块
的 initrd /initramfs-kernel_version.img
行中给出的 initramfs
映像的版本号匹配。有关如何验证初始 RAM 磁盘镜像的更多信息,请参阅 Red Hat Enterprise 7 内核管理指南。
在 菜单条目
块中,init rd
指令必须指向 initramfs 文件与同一内核版本对应的 initramfs
文件的位置(相对于 /boot/
目录)。此指令称为 initrd
,因为之前的工具创建了初始 RAM 磁盘镜像 mkinitrd
,它创建了所谓的 initrd
文件。grub.cfg
指令保留 initrd
,以保持与其他工具的兼容性。使用 dracut
实用程序创建初始 RAM 磁盘映像的系统文件算法是 initramfs-kernel_version.img
。
有关使用 Dracut 的详情,请参考 Red Hat Enterprise 7 内核管理指南。