GRUB,全称 GRand Unified Bootloader(大一统引导加载程序): 一个存在磁盘上的程序,固件做完自检后把控制权交给它;它自带读文件系统的能力, 于是能按名字找到内核文件、必要时弹出一份菜单让你挑一个系统,再把内核与配套的 临时根文件系统 initramfs 一起读进内存,跳过去执行。 像接力的第一棒:固件把机器叫醒,由它决定接下来跑哪个系统 —— 挑好人、送上跑道,它自己就退场了。
刚通上电时内存是空的、操作系统还不存在,能跑的只有焊在主板上的固件 firmware。 它对硬盘的认知少得可怜:老的 BIOS 基本只会读硬盘第一个扇区 (MBR,主引导记录,512 字节);新的 UEFI 也只认 ESP(EFI 系统分区)—— 一个 FAT 格式小分区里的可执行文件。 而内核是一个带版本号的文件,住在某个分区的目录里,还常常要先加载一份临时根文件系统, 才能挂上真正的根分区。
缺的是一个认识文件系统、能按名字找文件、还能画一份菜单的程序。
固件 firmware 自检完,去找下一个能跑的程序 -> GRUB 读自己的配置、弹菜单、把内核读进内存 -> 内核 kernel 接管整台机器,挂上真正的根分区 -> init 内核拉起的第一个用户程序
grubx64.efi。/boot,按名字找到
vmlinuz-<版本号> 这样的内核文件,不需要把位置写死。grub.cfg 里;
这份文件由生成脚本按原料产出,不是手写的。init;再往后(登录、服务,
以及让任务活得比一次连接更久,那是 0011 · tmux 那一层的事)都与它无关。grub> 提示符上;救回来得会手动指定内核,或者用一张 live USB 启动、重装引导程序。/etc/default/grub、
敲 sudo update-grub,生成 /boot/grub/grub.cfg;Fedora 与 RHEL 敲
grub2-mkconfig -o /boot/grub2/grub.cfg;Arch 用 grub-mkconfig -o /boot/grub/grub.cfg。
照抄别人教程里的那一条,经常第一步就报文件不存在。all_video)装进去;
开了 Secure Boot 后,自己编译或改过的内核与模块必须签名,否则直接拒载。grub.cfg 看着生效了,下一次生成就整份盖回去;
得改原料(/etc/default/grub 与 /etc/grub.d/)再重新生成。场景一:装完双系统,开机菜单里挑 Windows 还是 Linux。
sudo grub-install /dev/sda # UEFI 机器改成 --target=x86_64-efi --efi-directory=/boot/efi
那条菜单就是 GRUB 画的,每条对应一个能启动的系统或内核;名字是生成配置那一刻探测出来的, 探测不到就不会出现。
场景二:内核更新后菜单自动多一项,顺手改默认项与等待时间。
# 发行版装新内核时会自动跑一次生成命令,菜单里于是多出一个新版本条目
sudo update-grub # Debian/Ubuntu;Fedora 上是 grub2-mkconfig -o /boot/grub2/grub.cfg
sudo nano /etc/default/grub # 改 GRUB_DEFAULT 与 GRUB_TIMEOUT(默认项、等待秒数)
sudo update-grub # 改完原料必须再生成一次,新配置才生效
场景三:起不来的时候,用一张 live USB 把它修回去。
sudo mount /dev/sda2 /mnt # 先挂上装了系统的根分区
sudo mount /dev/sda1 /mnt/boot/efi # UEFI 机器再挂上 ESP
sudo chroot /mnt grub-install /dev/sda # 进系统环境重装引导程序
sudo chroot /mnt update-grub # 重新生成菜单
GRUB 挂了不等于系统没了:文件都还在盘上,缺的只是那个负责把内核找出来、送上去的程序。
先问一句:这一刻它认不认文件系统、能不能按名字读内核? 再问一句:它住在主板里,还是住在磁盘上?
| 名称 | 它是什么 | 和 GRUB 什么关系 |
|---|---|---|
| GRUB(引导加载程序) | 存在磁盘上、能按名字读内核、可弹多系统菜单的那段程序 | 本课主角:固件与内核之间的那一步 |
| UEFI 固件 | 现在主板上的固件:自检、读 ESP 里的可执行文件、把它交给下一段 | 上一站:它按下电源先跑,再把控制权交给 GRUB |
| 传统 BIOS | 上一代固件:只读硬盘第一个扇区,只认 16 位实模式 | 也是上一站,但不认文件系统,只能把一小段代码搬进内存;新机器普遍已换成 UEFI |
| systemd-boot | 另一种引导加载程序:只跑在 UEFI 上,菜单条目就是一个个普通配置文件 | 同类替代品:更朴素、配置更直白,但没法退到传统 BIOS,菜单能力也更少 |
| rEFInd | 另一款引导加载程序:图形化菜单,偏向自动探测各类系统 | 同类替代品:菜单更花哨,但配置与主题又是一套新东西 |
| Windows 启动管理器 | Windows 自己的引导程序:选完系统就把 Windows 内核交出去 | 同类但只管 Windows:控制权交到它手上之后它才出现;双系统菜单通常由 GRUB 这类程序统一画 |
| initramfs(临时根文件系统) | 内核与真正的根分区之间先顶上的一小份内存里的文件系统 | 下游同一段路:它由 GRUB 连内核一起读进内存,真正挂根分区的是内核 |
一句话分工:固件管「我该把控制权交给谁」,GRUB 管「加载哪个内核」,内核管「怎么把系统跑起来」。例外是树莓派这类单板机:固件自己读 FAT 启动分区里的文件,没有 GRUB 这一站。
grub-install 补上 —— 它属于启动路径,不是系统的一部分。三题自测,每题只有一个正确选项;选完立刻看到解释。
1. 开机后先自检硬件、再按自己保存的清单决定把控制权交给谁,这是谁?
对。自检与「下一个交给谁」都是固件的事;认文件系统、找内核是它交棒之后那一段干的,它自己不看内核。
2. 自带读文件系统的能力、能按名字找到内核,还能弹一份多系统菜单让你挑,这是谁?
对。「认文件系统、按名字找内核、画菜单」正是引导加载程序的定义;固件做不到这些,内核要等交棒之后才登场。
3. 内核与真正的根分区之间,那份先被读进内存的临时根文件系统叫什么?
对。内核与真正的根分区之间需要一份临时根文件系统顶班,它就是 initramfs,由 GRUB 连内核一起读进内存。