在Linux系统中,GRUB(Grand Unified Bootloader)是广泛使用的引导加载程序,负责在系统启动时加载内核并初始化系统,修改GRUB配置文件可以自定义启动选项、默认启动项、超时时间等,满足个性化或故障排查需求,本文将详细介绍Linux中修改GRUB配置文件的完整流程,包括配置文件位置、关键参数解析、修改步骤及注意事项。
GRUB配置文件的位置与作用
GRUB的配置文件分为两类:用户可编辑的配置源文件和GRUB实际加载的配置文件。
- 用户配置源文件:
/etc/default/grub
,这是主要的配置文件,用于设置全局启动参数(如超时时间、默认启动项、内核参数等)。 - 自动生成的配置文件:
/boot/grub2/grub.cfg
(CentOS/RHEL/Rocky Linux等)或/boot/grub/grub.cfg
(Ubuntu/Debian等),该文件由grub2-mkconfig
(或update-grub
)命令根据/etc/default/grub
和/etc/grub.d/
目录下的脚本自动生成,不建议直接修改,否则会被覆盖。
修改GRUB配置前的准备工作
- 备份配置文件
为防止修改错误导致系统无法启动,需先备份/etc/default/grub
:sudo cp /etc/default/grub /etc/default/grub.bak
- 确认GRUB版本
现代Linux系统普遍使用GRUB 2,可通过以下命令确认:grub-install --version # 输出类似 "grub-install (GRUB) 2.06"
修改/etc/default/grub
文件的核心参数
/etc/default/grub
是文本文件,使用sudo nano /etc/default/grub
或sudo vim /etc/default/grub
打开后,可修改以下关键参数(以下参数以CentOS/RHEL为例,Ubuntu/Debian路径略有不同但参数一致):
关键参数说明(表格形式)
参数名 | 作用 | 示例值 | 取值范围/说明 |
---|---|---|---|
GRUB_DEFAULT |
设置默认启动项 | saved 或 0 |
saved :使用上次选择的启动项;0 :第一个菜单项;也可指定菜单标题(如”Ubuntu”)。 |
GRUB_TIMEOUT |
菜单显示超时时间(秒),超时后自动启动默认项 | 5 |
0-999,0表示不显示菜单直接启动默认项(需配合GRUB_HIDDEN_TIMEOUT )。 |
GRUB_HIDDEN_TIMEOUT |
隐藏菜单的等待时间(秒),按ESC可显示完整菜单 | 0 |
0-999,若设置为非0且GRUB_TIMEOUT=0 ,则启动时隐藏菜单,按ESC后显示。 |
GRUB_CMDLINE_LINUX |
传递给Linux内核的启动参数(如硬件驱动、调试模式等) | console=ttyS0,115200 nomodeset |
多个参数用空格分隔,常见参数:quiet (减少启动日志)、nomodeset (禁用显卡驱动)、resume=/dev/sda2 (指定交换分区)。 |
GRUB_TERMINAL_OUTPUT |
指定GRUB菜单的输出终端 | console 或 gfxterm |
console :纯文本终端;gfxterm :图形终端(需主题支持)。 |
GRUB_THEME |
设置GRUB菜单主题(需自定义主题文件) | "/boot/grub2/themes/system/theme.txt" |
主题文件需位于/boot/grub2/themes/ 目录下,且.txt 文件包含主题配置。 |
修改后的配置更新与生效
修改/etc/default/grub
后,需通过命令生成新的grub.cfg
文件,否则修改不会生效,不同发行版的命令不同:
CentOS/RHEL/Rocky Linux/Fedora
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Ubuntu/Debian/Mint
sudo update-grub
执行后,终端会显示类似“Generating grub configuration done”的提示,表示配置已更新,重启系统(sudo reboot
)即可看到修改后的GRUB菜单。
高级配置:添加自定义启动项
若需添加自定义启动项(如进入救援模式、使用不同内核版本),可通过修改/etc/grub.d/40_custom
文件实现(该文件专门用于用户自定义菜单项)。
示例:添加一个“Rescue Mode”启动项
- 编辑
/etc/grub.d/40_custom
:sudo nano /etc/grub.d/40_custom
- 添加以下内容(以Ubuntu为例,路径需根据实际系统调整):
menuentry "Rescue Mode" { insmod part_gpt # 加载GPT分区模块(若为MBR则用part_msdos) insmod ext2 # 加载根分区文件系统模块(如ext4、xfs等) set root='hd0,gpt2' # 根分区设备(可通过`ls`命令在GRUB菜单中查看) linux /boot/vmlinuz-5.15.0-78-generic root=/dev/sda2 ro single initrd /boot/initrd.img-5.15.0-78-generic }
- 保存文件后,执行
sudo update-grub
(Ubuntu)或sudo grub2-mkconfig -o /boot/grub2/grub.cfg
(CentOS),重启即可在GRUB菜单中看到“Rescue Mode”选项。
注意事项
- 避免直接修改
grub.cfg
:该文件由系统自动生成,手动修改会被覆盖,导致配置丢失。 - 内核参数谨慎修改:错误的内核参数(如
root=
指定的分区错误)可能导致系统无法启动,建议先查阅文档或测试。 - 多系统启动顺序:若安装多系统(如Windows+Linux),GRUB会自动检测并添加菜单项,可通过
GRUB_DEFAULT
设置默认启动的系统。
相关问答FAQs
Q1:修改GRUB配置后重启发现无法进入系统,如何解决?
解答:
- 恢复备份:若提前备份了
/etc/default/grub
,可通过sudo cp /etc/default/grub.bak /etc/default/grub
恢复,然后重新生成配置并重启。 - 救援模式:启动时按ESC键进入GRUB菜单,选择“Advanced options”中的“Recovery mode”,进入后选择“root”终端,手动恢复配置文件。
- 重置GRUB:若无法进入系统,可使用Live USB启动,挂载系统根分区(如
sudo mount /dev/sda2 /mnt
),然后sudo chroot /mnt
,执行grub2-mkconfig -o /boot/grub2/grub.cfg
(CentOS)或update-grub
(Ubuntu)重新生成配置。
Q2:如何为不同Linux发行版设置不同的内核启动参数?
解答:
可通过GRUB_CMDLINE_LINUX_DEFAULT
和GRUB_CMDLINE_LINUX
组合实现:
- 公共参数:在
GRUB_CMDLINE_LINUX
中设置所有系统共用的参数(如console=tty1
)。 - 默认参数:在
GRUB_CMDLINE_LINUX_DEFAULT
中设置默认启动项的参数(如quiet
)。 - 自定义参数:在
/etc/grub.d/40_custom
中为不同系统添加独立菜单项,指定各自的GRUB_CMDLINE_LINUX
。
为Ubuntu设置quiet
,为CentOS设置nomodeset
,可在/etc/grub.d/40_custom
中添加:
menuentry "Ubuntu" { linux /boot/vmlinuz-5.15.0-78-generic root=/dev/sda1 quiet initrd /boot/initrd.img-5.15.0-78-generic } menuentry "CentOS" { linux /boot/vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/sda2 nomodeset initrd /initramfs-3.10.0-1160.el7.x86_64.img }
执行更新命令后,两个系统将使用各自的内核参数启动。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/27728.html