
终于等来了国庆长假!宅在家折腾自己的 HomeLab、 K8s、 NAS 服务器集群的感觉真爽!这次长假真的是折腾了好多东西,感兴趣的读者请期待后续的爆更,等不及的话也可以直接看我的 repo - east4ming/homelab2 的 PR 和 Commits。
国庆长假,别人在景区人挤人,我在家给 HomeLab 集群做系统升级——把几个节点从 Ubuntu 24.04 升到 26.04.1。
说实话,前几台升得异常顺利,do-release-upgrade 一路回车,重启,SSH 秒连,干净利落。连着成功几台之后,人就飘了。😆
飘的代价是:升级 n100-cheshi-0 的时候,我点了确认就出门了。结果回来后发现升级出现问题,卡住了。🧠一热+一急直接断电,直接 GG😭,一躺就是好几个小时。
接下来的画面就很熟悉了:反复重启,卡在 GRUB、黑屏、或者掉进 initramfs 的 (initramfs) 提示符,SSH 更是想都别想。一台本来只是"升个级"的机器,硬生生变砖。😑
好在最后还是修复了。
Ubuntu 的大版本升级本质上是一个多阶段事务,大致要经过:下载包 → 解包 → 配置 → 重建 initramfs → 更新 GRUB 引导。断电发生在哪一步,坏法完全不一样:
断在哪一步 | 典型症状 |
|---|---|
包已解包、未配置 | dpkg 数据库处于 half-configured 状态,apt 各种报错 |
initramfs 生成到一半 | 内核找不到根文件系统,掉进 |
GRUB 写入中途 | 引导记录损坏,开机直接进 BIOS 或黑屏 |
ext4 journal 未落盘 | 文件系统损坏,只读挂载甚至无法挂载 |
麻烦的地方在于:这几层很可能是同时坏的。你先修好文件系统,它又卡在包没配完;包配完了,GRUB 又是坏的。一环扣一环,让人遭不住。
📝Notes: 好消息是:这些绝大多数都是可修复的,不像硬盘物理损坏那样直接宣判死刑。核心思路只有一个:用 Ubuntu Live USB 启动一个临时的"救援系统",再 chroot 进原系统去修。
在另一台电脑上下载 Ubuntu 26.04 桌面版 ISO,用 Rufus 或 balenaEtcher 写入一个 ≥4GB 的 U 盘,然后在 BIOS/UEFI 里把 USB 设为第一启动项。
📝Notes: 用桌面版而不是 Server 版,因为我们需要
Try Ubuntu那个临时图形环境,操作起来方便很多。
开机按 F12/F11/Del 进启动菜单,选 U 盘。进安装界面后,不要点安装,选 Try Ubuntu,进入临时桌面。后面所有操作都在这个环境里完成。
先确认分区布局:
lsblk -f看清楚哪个是根分区(通常是 ext4,比如 /dev/sda2),哪个是 EFI 分区(通常是 vfat,比如 /dev/sda1)。
意外断电极易损坏文件系统,这是无法启动的最常见原因。先修它:
sudo fsck -y /dev/sda2📝Notes: 如果提示 "device is mounted",说明它已被自动挂载,先
sudo umount /dev/sda2再执行。EFI 分区一般不用 fsck。
sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do
sudo mount --bind $i /mnt$i
done
sudo chroot /mnt这一步的意义是:让原系统"借"当前 Live 环境的内核跑起来,/dev、/proc、/sys 这些虚拟文件系统必须 bind 进去,否则 apt/dpkg 会因为缺少设备节点而报错。
进 chroot 后,先把断电中断的软件包事务收尾:
apt --fix-broken install
dpkg --configure -a这两条命令能解决 80% 的 "half-configured" 问题。
UEFI 系统:
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu
update-grub
update-initramfs -u -k all如果 grub-install 因为包损坏失败,强制重装一遍:
apt install --reinstall grub-efi-amd64 grub-efi-amd64-signed shim-signedexit
sudo umount -R /mnt
sudo reboot拔掉 U 盘,见证奇迹的时刻。🎉
同一台机器,其实有不止一种救法。按"侵入性从低到高"排一下:
方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| GRUB 能进,只是系统起不来 | 最快,10 秒进 root shell | 只有最小环境,网络/服务都没有 |
Recovery Mode | GRUB 菜单还能显示 | 图形菜单,fsck/dpkg 一键点 | 修不了 GRUB 本身 |
Live USB + chroot | 引导/包/文件系统同时坏 | 能力最全,基本都能修 | 步骤多,要 U 盘 |
boot-repair | GRUB 问题复杂、不想手动折腾 | 自动化程度高 | 有时"聪明反被聪明误" |
备份 + 重装 | 所有方法都失败 | 一了百了 | 配置全丢,最后兜底 |
init=/bin/bash 的玩法:在 GRUB 菜单里按 e 编辑启动项,在 linux 那行末尾加上 init=/bin/bash,按 F10 启动,直接掉进 root shell。适合"文件系统没坏,就是服务起不来"的情况。
📝Notes: boot-repair 可以在 Live 环境里装:
sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt install boot-repair。我个人的偏好是:能手动 chroot 修就手动修,把每一步都看清楚,比一键工具更让人安心。
这次翻车,技术上没什么新鲜的,真正的问题出在流程上:
etckeeper 或关键配置的 tar 包。📝Notes: 第 4 条才是核心。千里之堤,溃于蚁穴。升级本身不难,难的是连续成功之后还保持第一次的谨慎。
这次救援的完整链路是:Live USB 启动 → lsblk -f 认盘 → fsck 修文件系统 → 挂载 + bind 虚拟文件系统 → chroot → apt/dpkg 修包 → 重装 GRUB + update-initramfs → umount -R → reboot。
关键认知有两条:
至于那台 n100-cheshi-0,最后是满血复活了。代价是国庆少玩了一天,换来一篇博客,倒也不算亏。😆
慎终如始,则无败事。
以上。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。