GRUB 是 Linux 系统最常用的启动引导程序,负责:
| 阶段 | 功能 | 存储位置 |
|---|---|---|
| Stage 1 | BIOS/UEFI 加载 GRUB 核心 | MBR(主引导记录)或 EFI 分区 |
| Stage 1.5 | 文件系统驱动,加载 Stage 2 | /boot/grub 附近 |
| Stage 2 | 完整功能:菜单、命令行、加载内核 | /boot/grub/ |
| 特性 | GRUB Legacy (GRUB 0.97) | GRUB 2 (推荐) |
|---|---|---|
| 配置文件 | /boot/grub/menu.lst | /boot/grub/grub.cfg(自动生成) |
| 配置源 | 直接编辑 | /etc/default/grub + /etc/grub.d/ |
| 脚本支持 | 有限 | 完整 Bash-like 语法 |
| UEFI 支持 | ❌ | ✅ |
| 模块化 | 弱 | 强(按需加载驱动) |
现代发行版(Ubuntu 20.04+、RHEL 8+、Debian 11+)全部使用 GRUB 2。
展开代码┌─────────────────────────────────────────────────────────┐ │ GNU GRUB version 2.06 │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ * Ubuntu │ │ │ │ Advanced options for Ubuntu │ │ │ │ Windows Boot Manager (on /dev/nvme0n1p1) │ │ │ │ UEFI Firmware Settings │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ Use the ↑ and ↓ keys to select which entry is │ │ highlighted. Press enter to boot the selected OS, │ │ 'e' to edit the commands before booting or 'c' for │ │ a command-line. │ │ │ │ The highlighted entry will be executed automatically │ │ in 10s. │ │ │ └─────────────────────────────────────────────────────────┘
按键功能:
| 按键 | 功能 |
|---|---|
↑ / ↓ | 选择启动项 |
Enter | 启动选中项 |
e | 编辑当前启动项(临时修改,不保存) |
c | 进入命令行模式(GRUB Shell) |
Esc | 返回上一级菜单 |
F10 / Ctrl+X | 编辑后启动(在编辑界面) |
e 进入)展开代码┌─────────────────────────────────────────────────────────┐ │ setparams 'Ubuntu' │ │ │ │ recordfail │ │ load_video │ │ gfxmode $linux_gfx_mode │ │ insmod gzio │ │ if [ x$grub_platform = xxen ]; then insmod xzio; fi │ │ insmod part_gpt │ │ insmod ext2 │ │ search --no-floppy --fs-uuid --set=root 1234-5678 │ │ linux /vmlinuz-5.15.0-76-generic root=UUID=xxx ro │ │ initrd /initrd.img-5.15.0-76-generic │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ Ctrl+X or F10: boot Ctrl+C or F2: command │ │ │ │ ESC: discard edits │ │ │ └─────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘
关键行解析:
| 行 | 作用 |
|---|---|
linux /vmlinuz-... | 指定内核镜像路径和启动参数 |
root=UUID=xxx | 根文件系统位置 |
ro | 以只读方式挂载根(后续 initramfs 会 remount rw) |
initrd /initrd.img-... | 指定初始化内存盘 |
quiet splash | 静默启动+显示动画(删除可看到详细启动日志) |
c 进入)展开代码grub> ls # 列出所有设备和分区 grub> ls (hd0,gpt1)/ # 查看 (hd0,gpt1) 分区的根目录 grub> ls (hd0,gpt1)/boot/ # 查看 /boot 目录 grub> set root=(hd0,gpt2) # 设置根分区 grub> linux /vmlinuz-5.15.0-76-generic root=/dev/nvme0n1p2 ro grub> initrd /initrd.img-5.15.0-76-generic grub> boot # 启动
常用命令:
| 命令 | 功能 |
|---|---|
ls | 列出设备、分区、文件 |
set root=(hdX,gptY) | 设置根分区 |
linux /path/to/vmlinuz ... | 加载内核 |
initrd /path/to/initrd | 加载初始化内存盘 |
boot | 启动系统 |
cat /etc/fstab | 查看文件内容 |
help | 查看帮助 |
reboot | 重启 |
halt | 关机 |
展开代码/etc/grub.d/ # 配置脚本目录(按数字顺序执行) ├── 00_header # 头部信息、环境设置 ├── 05_debian_theme # 主题/背景图(Ubuntu) ├── 10_linux # Linux 内核启动项(自动生成) ├── 20_linux_xen # Xen 虚拟化支持 ├── 30_os-prober # 探测其他操作系统(Windows) ├── 30_uefi-firmware # UEFI 固件设置入口 ├── 40_custom # 用户自定义项(推荐在此添加) └── 41_custom # 自定义项备份 /etc/default/grub # 主配置文件(修改后需 update-grub) /boot/grub/grub.cfg # 生成的最终配置(不要直接编辑!)
/etc/default/grub展开代码sudo nano /etc/default/grub # 关键配置项: GRUB_DEFAULT=0 # 默认启动项(0=第一个) GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-76-generic" # 指定内核 GRUB_TIMEOUT=10 # 菜单显示时间(秒),-1=无限等待 GRUB_TIMEOUT_STYLE=menu # menu/countdown/hidden GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" # 默认启动参数 GRUB_CMDLINE_LINUX="" # 附加到所有启动项的参数 # 显示/隐藏菜单 GRUB_HIDDEN_TIMEOUT=0 # 隐藏菜单,直接启动 GRUB_HIDDEN_TIMEOUT_QUIET=true # 图形界面 GRUB_GFXMODE=1920x1080 # 分辨率 GRUB_GFXPAYLOAD_LINUX=keep # 保持图形模式 # 主题 GRUB_THEME="/boot/grub/themes/starfield/theme.txt" # 密码保护(生产环境推荐) GRUB_PASSWORD="grub.pbkdf2.sha512.10000.xxx"
展开代码# Debian/Ubuntu sudo update-grub # 或完整命令 sudo grub-mkconfig -o /boot/grub/grub.cfg # RHEL/CentOS/Fedora sudo grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI 系统 sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
编辑 /etc/grub.d/40_custom:
展开代码#!/bin/sh exec tail -n +3 $0 # 启动 Windows(手动指定) menuentry "Windows 10" { insmod part_gpt insmod fat insmod chain search --fs-uuid --set=root 1234-5678 chainloader /EFI/Microsoft/Boot/bootmgfw.efi } # 启动 ISO 镜像(Live CD) menuentry "Ubuntu Live ISO" { set isofile="/iso/ubuntu-22.04.iso" loopback loop (hd0,1)$isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet initrd (loop)/casper/initrd } # 内存测试 menuentry "Memory Test (Memtest86+)" { linux16 /boot/memtest86+.bin }
然后执行 sudo update-grub。
展开代码# 安装主题 sudo add-apt-repository ppa:daniruiz/flat-remix sudo apt install flat-remix-grub # 或手动安装 sudo git clone https://github.com/vinceliuice/grub2-themes.git /tmp/grub2-themes cd /tmp/grub2-themes sudo ./install.sh -t vimix -s 1080p # 修改配置启用 sudo nano /etc/default/grub GRUB_THEME="/boot/grub/themes/vimix/theme.txt" sudo update-grub
| 现象 | 原因 | 修复方法 |
|---|---|---|
error: file not found | 内核文件被删除或移动 | GRUB 命令行手动指定正确路径 |
error: unknown filesystem | GRUB 不支持该文件系统 | 安装对应 fs 模块,或重建 GRUB |
grub> 提示符(无菜单) | grub.cfg 损坏或丢失 | 命令行手动启动,或 Live CD 修复 |
grub rescue> 提示符 | Stage 1.5/2 损坏 | 使用 Live CD 完整重装 GRUB |
| 直接进入 Windows,无 Linux | UEFI 启动顺序被覆盖 | 调整 UEFI 启动项,或修复 GRUB |
| 启动后黑屏 | 显卡驱动问题 | 编辑启动参数添加 nomodeset |
当 GRUB 菜单损坏,只剩 grub> 提示符时:
展开代码# 步骤 1:找到根分区 grub> ls (hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3) grub> ls (hd0,gpt2)/ # 看到 vmlinuz 和 initrd.img = 找到根分区 # 步骤 2:设置变量 grub> set root=(hd0,gpt2) grub> set prefix=(hd0,gpt2)/boot/grub # 步骤 3:加载内核(根据实际版本调整) grub> linux /vmlinuz-5.15.0-76-generic root=/dev/nvme0n1p2 ro # 或先用 UUID(更可靠) grub> linux /vmlinuz-5.15.0-76-generic root=UUID=xxxxx ro # 步骤 4:加载初始化内存盘 grub> initrd /initrd.img-5.15.0-76-generic # 步骤 5:启动 grub> boot
进入系统后,立即修复 GRUB:
展开代码sudo update-grub sudo grub-install /dev/nvme0n1 # 安装到磁盘,不是分区!
展开代码# 1. 从 Ubuntu Live USB 启动,选择 "Try Ubuntu" # 2. 打开终端,查看磁盘 sudo fdisk -l # 找到 Linux 根分区,如 /dev/nvme0n1p2 # 3. 挂载根分区 sudo mount /dev/nvme0n1p2 /mnt # 4. 挂载其他必要文件系统 sudo mount /dev/nvme0n1p1 /mnt/boot/efi # UEFI 系统 sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys # 5. chroot 进入系统 sudo chroot /mnt # 6. 重新安装 GRUB grub-install /dev/nvme0n1 update-grub # 7. 退出并重启 exit sudo reboot
展开代码# 在 GRUB 菜单按 'e' 编辑启动项 # 找到 linux 开头的那行,在行末添加: init=/bin/bash # 按 Ctrl+X 或 F10 启动 # 进入 root shell(无密码!) # 根分区是只读的,重新挂载 mount -o remount,rw / # 修改密码 passwd root # 重启 exec /sbin/init
| 特性 | Legacy BIOS | UEFI |
|---|---|---|
| 分区表 | MBR | GPT |
| 启动文件位置 | MBR 前 446 字节 | EFI 系统分区(ESP) |
| GRUB 安装目标 | /dev/sda(磁盘) | /dev/sda1(ESP 分区) |
| 安装命令 | grub-install /dev/sda | grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu |
| 配置文件路径 | /boot/grub/grub.cfg | /boot/efi/EFI/ubuntu/grub.cfg |
| 安全启动 | 不支持 | 支持(可能需关闭或 shim) |
UEFI 专用修复:
展开代码# 重新安装 UEFI 版本的 GRUB sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck # 更新 NVRAM 启动项 sudo efibootmgr -v # 查看当前项 sudo update-grub
展开代码# 生成密码哈希 grub-mkpasswd-pbkdf2 # 输入密码,复制生成的哈希 sudo nano /etc/grub.d/40_custom set superusers="admin" password_pbkdf2 admin grub.pbkdf2.sha512.10000.xxxxxx # 限制普通用户编辑 sudo nano /etc/grub.d/10_linux # 在 menuentry 块中添加 --users '' 表示需要密码 menuentry 'Ubuntu' --users '' { ... } sudo update-grub
展开代码sudo nano /etc/default/grub GRUB_DISABLE_RECOVERY="true" sudo update-grub
本文作者:zzz
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!