Linux系统开机过程的第一个关键环节就是引导加载器。在RHEL 7及其之后的版本中,Grub2全面取代了老旧的Grub(GRUB Legacy),成为默认的引导程序。相比第一代Grub,Grub2采用模块化设计,配置文件由脚本自动生成,支持更多的文件系统、更灵活的启动项管理以及更强大的脚本能力。很多运维人员在日常工作中只知道改配置后执行grub2-mkconfig,却并不清楚背后到底发生了什么,一旦遇到引导损坏、忘记root密码等问题就手足无措。这篇文章就从原理到实操,把Grub2的配置体系完整梳理一遍。

一、Grub2的配置文件体系:直接编辑grub.cfg为什么是错误做法
Grub2的配置体系与传统认知有很大差异。很多初学者接手RHEL后第一件事就是打开/boot/grub2/grub.cfg准备修改,结果发现文件头部赫然写着一行警告:不要编辑这个文件,它由/etc/grub.d/中的模板和/etc/default/grub自动生成。这是Grub2与Grub Legacy最本质的区别之一。
整个配置体系分为三层。第一层是/etc/default/grub,这是管理员主要打交道的文件,存放GRUB_TIMEOUT、GRUB_CMDLINE_LINUX等全局变量;第二层是/etc/grub.d/目录,里面是一组可执行脚本,比如10_linux负责生成当前系统的内核启动项,30_os-prober负责探测其他操作系统,40_custom用于添加自定义启动项;第三层才是最终产物/boot/grub2/grub.cfg。执行grub2-mkconfig时,系统会依次运行/etc/grub.d/下的脚本,把输出汇总写入grub.cfg。如果手工编辑grub.cfg,下次内核升级或执行生成命令后,你的修改会被无提示地覆盖掉。
看一个典型的/etc/default/grub内容:
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_SAVEDEFAULT=true GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rhel/root rhgb quiet" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true
其中几个参数需要重点理解。GRUB_TIMEOUT控制引导菜单的等待秒数,设为-1表示无限等待;GRUB_DEFAULT=saved配合GRUB_SAVEDEFAULT=true可以实现记忆上次启动项的功能;GRUB_CMDLINE_LINUX则是传给内核的启动参数,修改后必须重新生成配置。值得一提的是,在较新的RHEL版本中引入了BLS(Boot Loader Specification),启动项信息被拆分到/boot/loader/entries/目录下,由GRUB_ENABLE_BLSCFG=true控制是否启用,这也是很多人发现grub.cfg里内核条目变少的原因。
二、修改配置的正确流程与常用实战操作
理解了配置体系,实际操作就变得清晰了。标准流程是:编辑/etc/default/grub,然后执行生成命令。在UEFI系统上,输出路径要精确指定:
# BIOS 系统执行
grub2-mkconfig -o /boot/grub2/grub.cfg
# UEFI 系统执行(注意路径不同)
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
# 修改默认启动内核(先列出所有启动项)
awk -F\' '$1=="menuentry " || $1=="submenu " {print i++ " : "$2}' /boot/grub2/grub.cfg
# 设置第0项为默认启动项
grub2-set-default 0
grub-editenv list日常运维中有几个高频需求。第一个是调整内核参数,比如临时关闭SELinux测试、开启调试级别的日志,都可以在GRUB_CMDLINE_LINUX里追加参数后重新生成配置。第二个是删除多余内核后清理启动菜单,RHEL默认保留多个旧内核,清理/boot下的旧内核文件后再执行grub2-mkconfig,菜单项会自动减少。第三个是添加自定义启动项,正确做法是在/etc/grub.d/40_custom中追加menuentry块,而不是直接改grub.cfg。
密码保护是另一个实用场景。服务器如果不希望任何人都能进入单用户模式,可以给Grub2菜单设置密码。注意Grub2使用的是PBKDF2加密口令,先生成加密串再写入配置:
# 生成加密口令,记录输出的 pbkdf2 串 grub2-mkpasswd-pbkdf2 # 写入自定义配置文件(不要直接写入 /etc/grub.d/01_users 以外的地方) cat >> /etc/grub.d/01_users <<'EOF' set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.xxxxx EOF # 重新生成配置使其生效 grub2-mkconfig -o /boot/grub2/grub.cfg
设置完成后,进入编辑模式或引导任意启动项都需要验证身份。需要注意的是,密码文件/etc/grub.d/01_users权限应收紧,避免加密串泄露。
三、引导故障救援:忘记root密码与grub.cfg损坏的恢复
Grub2知识最考验人的时刻是引导出问题的时候。最常见的两个场景:忘记root密码,以及误删或损坏grub.cfg导致系统无法启动。
忘记root密码的恢复流程如下:重启系统,在Grub2菜单界面按e键进入编辑模式,找到以linux开头的行,将ro rhgb quiet替换为rw rd.break,按Ctrl+x以修改后的参数启动。进入紧急shell后执行如下操作:
# /sysroot 此时以只读挂载,已通过 rw 参数切换,重新以可写方式挂载 switch_root:/# mount -o remount,rw /sysroot switch_root:/# chroot /sysroot sh-4.4# passwd root sh-4.4# touch /.autorelabel sh-4.4# exit switch_root:/# exit
这里有两个细节容易踩坑。一是如果SELinux处于Enforcing模式,改完密码必须创建/.autorelabel标记文件,否则重启后无法登录;二是使用rd.break时初始挂载是只读的,务必先remount为rw。
如果grub.cfg本身损坏甚至整个引导分区丢失,就需要借助RHEL安装介质救援。用安装光盘或ISO启动后选择Troubleshooting,进入Rescue模式,系统会尝试把根文件系统挂载到/mnt/sysimage。之后执行chroot并重建引导:
# 进入救援环境后的恢复步骤 chroot /mnt/sysimage # 重建 grub.cfg 配置文件 grub2-mkconfig -o /boot/grub2/grub.cfg # BIOS 系统重装引导代码到磁盘 grub2-install /dev/sda # UEFI 系统没有 grub2-install,重新安装 EFI 引导相关包即可 rpm -Uvh --force /mnt/install/BaseOS/Packages/grub2-efi-*.rpm /mnt/install/BaseOS/Packages/shim-*.rpm
重建过程中要注意磁盘设备名的确认,用lsblk核对引导所在的磁盘,grub2-install必须指向整块磁盘(如/dev/sda)而不是具体分区。对于使用LVM的系统,rescue环境下可能需要先执行vgchange -ay激活逻辑卷才能找到根分区。
总结来看,Grub2的管理核心思想就是配置与产物分离:所有改动都落在/etc/default/grub和/etc/grub.d/,通过grub2-mkconfig统一生成,而不是直接触碰grub.cfg。掌握这套机制,再加上密码重置和引导重建两套救援流程,日常遇到的绝大多数引导问题都能从容应对。建议在生产环境改动前,先用grub2-mkconfig -o /tmp/test-grub.cfg把结果输出到临时文件检查一遍,确认无误再覆盖正式配置,这是最稳妥的操作习惯。
Grub2配置RHEL引导加载器grub2-mkconfig修改时间:2026-09-05 22:02:57