Ubuntu 运维系列 | 第 7 天:系统启动流程与 GRUB 引导修复

服务器出问题最让人头疼的场景之一,就是按下电源或重启之后,系统卡在黑屏、报错或者直接进入 grub rescue 提示符。作为运维人员,理解 Ubuntu 从通电到登录提示符的完整启动链路,是快速定位”开机起不来”这类故障的前提。今天这一篇,我们就从 BIOS/UEFI 开始,一路走到 systemd 拉起用户态,并重点讲清楚 GRUB 引导器的作用、配置文件结构,以及引导损坏时如何自救。

Ubuntu 运维 第7天

一、Ubuntu 启动流程全景

Linux 的启动过程可以抽象成一条”接力棒”传递链,每一棒都负责完成一部分初始化,然后把控制权交给下一棒。对 Ubuntu(以现代 UEFI + GPT 磁盘为主)来说,标准流程大致如下:

  1. UEFI/BIOS 固件初始化:上电后主板固件执行 POST 自检,然后根据启动顺序读取 ESP(EFI 系统分区)里的引导程序。
  2. GRUB 引导器加载:GRUB 被固件加载后,读取 /boot/grub/grub.cfg 中的菜单配置,定位内核镜像和 initramfs。
  3. 内核启动:GRUB 把 vmlinuz 内核和 initrd/initramfs 载入内存,内核解压后接管硬件初始化。
  4. initramfs 阶段:在真实根文件系统挂载之前,initramfs 提供驱动和挂载工具,完成磁盘、RAID、LVM、加密卷的初始化。
  5. 根文件系统挂载与 systemd 启动:initramfs 把控制权交给真实的 /sbin/init(Ubuntu 中是 systemd),systemd 作为 PID 1 拉起所有用户态服务。

可以用一条命令查看内核传递给 systemd 之前的完整日志:

sudo dmesg -T | less

二、核心概念:GRUB 是什么

GRUB(GRand Unified Bootloader)是 Ubuntu 默认的引导加载器,当前主流版本是 GRUB 2。它的职责是:在固件把控制权交给操作系统之前,提供一个菜单,让用户选择要启动哪个内核、哪种恢复模式,并把内核与 initramfs 加载到内存。

GRUB 的核心配置文件是 /boot/grub/grub.cfg,但它不建议手工编辑——因为它是由 /etc/default/grub/etc/grub.d/ 目录下的脚本自动生成的。修改引导参数的正确姿势是编辑 /etc/default/grub,然后执行 update-grub 重新生成配置。

查看当前 GRUB 版本与关键配置:

grub-install --version
cat /etc/default/grub

/etc/default/grub 里几个高频修改项:

# 默认启动项(0 为第一个菜单项)
GRUB_DEFAULT=0
# 菜单等待秒数,-1 表示等待用户选择
GRUB_TIMEOUT=5
# 传递给内核的命令行参数
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# 单用户/救援模式常用参数
GRUB_CMDLINE_LINUX=""

三、实战:修改内核启动参数

运维中最常见的需求,就是给内核追加参数,例如关闭某个有问题的驱动、开启内核调试,或者修复因显卡驱动导致的启动黑屏。假设我们要临时把 quiet splash 去掉,以便在启动时看到详细日志,同时加一个 nomodeset 参数解决显示问题:

sudo cp /etc/default/grub /etc/default/grub.bak
sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"/GRUB_CMDLINE_LINUX_DEFAULT="nomodeset"/' /etc/default/grub
sudo update-grub

改完后重启生效。如果想恢复,把备份覆盖回去再 update-grub 即可。

四、实战:GRUB 引导损坏的修复

GRUB 损坏的典型场景包括:误删了 /boot 下的内核文件、重装 Windows 覆盖了引导、磁盘分区表变动导致 GRUB 找不到根分区。症状通常是开机进入 grub rescue> 提示符,或直接提示 error: no such partition

4.1 从 grub rescue 手动引导

如果还能进 grub rescue>,说明 GRUB 的核心模块还能运行,只是找不到配置文件。可以用下面命令手动定位并启动系统:

# 列出所有分区
ls
# 逐个尝试找到根分区(含 /boot/grub 的分区)
ls (hd0,gpt2)/
# 假设根分区为 (hd0,gpt2),设置前缀和根
set prefix=(hd0,gpt2)/boot/grub
set root=(hd0,gpt2)
insmod normal
normal

进入正常 GRUB 菜单后启动系统,登录后再执行 sudo update-grubsudo grub-install /dev/sda 把引导重新写回。

4.2 用 Live 环境(chroot)彻底修复

如果连 grub rescue 都进不去,就需要用 Ubuntu 安装盘/Live USB 启动,进入”试用”环境后 chroot 到原系统进行修复:

# 挂载根分区与相关目录
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot/efi   # 若使用 UEFI
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys

# 进入原系统
sudo chroot /mnt

# 重新安装并生成 GRUB
grub-install /dev/sda
update-grub
exit

最后卸载挂载点并重启,引导即可恢复。

五、常见问题排查

5.1 启动卡在 initramfs 提示符

这说明内核已经加载,但 initramfs 没能正确挂载根文件系统。常见原因是根分区 UUID 变化(例如分区表重建后)。可在 initramfs 里执行:

blkid
exit

确认 /etc/fstab 与 GRUB 配置里的 UUID 是否一致,修复后执行 update-initramfs -u 重建 initramfs。

5.2 内核升级后无法启动

内核升级后旧内核一般会保留在 GRUB 菜单里。开机时在 GRUB 菜单选择”Advanced options for Ubuntu”,进入旧内核启动,然后排查新内核问题,必要时用 apt 卸载有问题的内核包。

查看已安装内核:

dpkg --list | grep linux-image

5.3 修改配置后不生效

记得每次修改 /etc/default/grub 后都要执行 sudo update-grub 才会真正写入 grub.cfg。这是新手最容易遗漏的一步。

六、总结

Ubuntu 的启动是一条从固件、GRUB、内核、initramfs 到 systemd 的接力链路,任何一环出问题都可能导致开机失败。理解这条链路后,处理引导故障就有了清晰的思路:先判断卡在哪一环,再用对应工具修复。GRUB 的配置集中在 /etc/default/grub,改完务必 update-grub;引导损坏时,优先尝试 grub rescue 手动引导,彻底损坏则用 Live 环境 chroot 重装 GRUB。

下期预告:第 8 天我们将进入 systemd 服务管理,讲清楚 Unit 文件怎么写、开机自启怎么配、服务起不来如何诊断,敬请期待。

微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容