
服务器出问题最让人头疼的场景之一就是按下电源或重启之后系统卡在黑屏、报错或者直接进入 grub rescue 提示符。作为运维人员理解 Ubuntu 从通电到登录提示符的完整启动链路是快速定位”开机起不来”这类故障的前提。今天这一篇我们就从 BIOS/UEFI 开始一路走到 systemd 拉起用户态并重点讲清楚 GRUB 引导器的作用、配置文件结构以及引导损坏时如何自救。一、Ubuntu 启动流程全景Linux 的启动过程可以抽象成一条”接力棒”传递链每一棒都负责完成一部分初始化然后把控制权交给下一棒。对 Ubuntu以现代 UEFI GPT 磁盘为主来说标准流程大致如下UEFI/BIOS 固件初始化上电后主板固件执行 POST 自检然后根据启动顺序读取 ESPEFI 系统分区里的引导程序。GRUB 引导器加载GRUB 被固件加载后读取/boot/grub/grub.cfg中的菜单配置定位内核镜像和 initramfs。内核启动GRUB 把vmlinuz内核和initrd/initramfs载入内存内核解压后接管硬件初始化。initramfs 阶段在真实根文件系统挂载之前initramfs 提供驱动和挂载工具完成磁盘、RAID、LVM、加密卷的初始化。根文件系统挂载与 systemd 启动initramfs 把控制权交给真实的/sbin/initUbuntu 中是 systemdsystemd 作为 PID 1 拉起所有用户态服务。可以用一条命令查看内核传递给 systemd 之前的完整日志sudodmesg-T|less二、核心概念GRUB 是什么GRUBGRand 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--versioncat/etc/default/grub/etc/default/grub里几个高频修改项# 默认启动项0 为第一个菜单项GRUB_DEFAULT0# 菜单等待秒数-1 表示等待用户选择GRUB_TIMEOUT5# 传递给内核的命令行参数GRUB_CMDLINE_LINUX_DEFAULTquiet splash# 单用户/救援模式常用参数GRUB_CMDLINE_LINUX三、实战修改内核启动参数运维中最常见的需求就是给内核追加参数例如关闭某个有问题的驱动、开启内核调试或者修复因显卡驱动导致的启动黑屏。假设我们要临时把quiet splash去掉以便在启动时看到详细日志同时加一个nomodeset参数解决显示问题sudocp/etc/default/grub /etc/default/grub.baksudosed-is/GRUB_CMDLINE_LINUX_DEFAULTquiet splash/GRUB_CMDLINE_LINUX_DEFAULTnomodeset//etc/default/grubsudoupdate-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)设置前缀和根setprefix(hd0,gpt2)/boot/grubsetroot(hd0,gpt2)insmod normal normal进入正常 GRUB 菜单后启动系统登录后再执行sudo update-grub和sudo grub-install /dev/sda把引导重新写回。4.2 用 Live 环境chroot彻底修复如果连 grub rescue 都进不去就需要用 Ubuntu 安装盘/Live USB 启动进入”试用”环境后 chroot 到原系统进行修复# 挂载根分区与相关目录sudomount/dev/sda2 /mntsudomount/dev/sda1 /mnt/boot/efi# 若使用 UEFIsudomount--bind/dev /mnt/devsudomount--bind/proc /mnt/procsudomount--bind/sys /mnt/sys# 进入原系统sudochroot/mnt# 重新安装并生成 GRUBgrub-install /dev/sdaupdate-grubexit最后卸载挂载点并重启引导即可恢复。五、常见问题排查5.1 启动卡在 initramfs 提示符这说明内核已经加载但 initramfs 没能正确挂载根文件系统。常见原因是根分区 UUID 变化例如分区表重建后。可在 initramfs 里执行blkidexit确认/etc/fstab与 GRUB 配置里的 UUID 是否一致修复后执行update-initramfs -u重建 initramfs。5.2 内核升级后无法启动内核升级后旧内核一般会保留在 GRUB 菜单里。开机时在 GRUB 菜单选择”Advanced options for Ubuntu”进入旧内核启动然后排查新内核问题必要时用apt卸载有问题的内核包。查看已安装内核dpkg--list|greplinux-image5.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 文件怎么写、开机自启怎么配、服务起不来如何诊断敬请期待。Fight for the things you love no matter what you may face, it will be worth it.不管你面对的是什么为你所爱的而奋斗都会是值得的