Arch Linux 启动修复实录:从 “UUID not found” 到 “No space left on device” 的终极排查之旅

这是一篇关于 Arch Linux 系统崩溃后如何一步步排查并最终修复的完整记录。如果你某天也遇到了那个令人心悸的 emergency shell 界面,希望这篇文章能为你提供一份清晰的路线图。

序章:噩梦的开始

一切都从这个熟悉的黑屏白字开始。我的 Arch Linux 在一次重启后,拒绝进入桌面环境,而是无情地将我抛入了紧急 Shell,屏幕上赫然显示着:

ERROR: device ‘UUID=d2e7782c-…’ not found. Skipping fsck.
:: mounting ‘UUID=d2e7782c-…’ on real root
mount: /new_root: can’t find UUID=d2e7782c-…
You are now being dropped into an emergency shell.

熟悉 Linux 的朋友都知道,UUID not found 通常意味着硬盘分区信息错误或丢失。于是,我拿出了 Arch Linux Live U盘,开始了我的修复之旅。

第一章:线索的迷惑性 – UUID 疑云

进入 Live 环境后,我的首要任务是确认那个报错的 UUID 是否真的错了。

# 查看所有块设备及其文件系统信息
lsblk -f

然而,结果令我大吃一惊:
lsblk -f 的输出明确显示,我的 Btrfs 根分区 /dev/nvme0n1p3 的 UUID 正是 d2e7782c-...

结论:问题并非 UUID 错误,而是系统在引导的早期阶段(initramfs 环境)无法识别或加载这个设备。最大的嫌疑人指向了 initramfs 镜像本身——它可能在上次内核更新时损坏了。

第二章:峰回路转 – fstab 与消失的内核

修复 initramfs 的标准操作是在 chroot 环境下运行 mkinitcpio

# 1. 挂载 Btrfs 根子卷
mount -o subvol=@ /dev/nvme0n1p3 /mnt

# 2. 挂载 EFI 分区(我当时的错误操作)
# mount /dev/nvme0n1p1 /mnt/boot  <-- 错误的挂载点!

# 3. 进入 chroot
arch-chroot /mnt

# 4. 尝试重新生成 initramfs
mkinitcpio -P

然而,一个新的错误出现了:

ERROR: specified kernel image does not exist: ‘/boot/vmlinuz-linux’

内核去哪了?我 ls /boot 一看,里面空空如也。这时我才恍然大悟,检查了我的 /etc/fstab 文件,发现了问题的根源:

我错误地将 EFI 分区挂载到了 /boot,而不是正确的 /boot/efi。这导致空荡荡的 EFI 分区“覆盖”了 Btrfs 子卷里存放着内核的 /boot 目录。

正确的操作应该是:

# 退出 chroot,重新挂载
exit
umount -R /mnt

# 正确挂载
mount -o subvol=@ /dev/nvme0n1p3 /mnt
mkdir -p /mnt/boot/efi
mount /dev/nvme0n1p1 /mnt/boot/efi

# 重新进入 chroot
arch-chroot /mnt

# 修改 /etc/fstab,将 /boot 改为 /boot/efi
nano /etc/fstab

修复 fstab 后,我再次运行 mkinitcpio -P,但错误依旧!ls /boot 发现内核文件 vmlinuz-linux 确实不存在。

结论:内核文件不只是被隐藏了,它是真的丢失了!可能是某次失败的更新导致的。

解决方案:强制重装内核。

pacman -S linux

第三章:最终的真相 – 损坏的镜像与爆满的空间

重装内核后,mkinitcpio 终于成功执行。我满怀希望地重启,却再次看到了最初的 UUID not found 错误!但这次,我注意到了一个之前被忽略的关键信息:

Initramfs unpacking failed: ZSTD-compressed data is truncated

真相大白:生成的 initramfs 镜像本身是损坏的!这可能是由于 Btrfs 文件系统有轻微错误,或 systemd 等核心组件文件损坏导致的。

于是,我决定进行一次终极修复。

1. 检查并修复 Btrfs 文件系统
在 Live 环境下,挂载前先执行:

btrfs scrub start /dev/nvme0n1p3

2. Chroot 并重装所有核心组件
正确挂载分区后,进入 chroot:

arch-chroot /mnt
pacman -S linux mkinitcpio systemd btrfs-progs

3. 彻底重装 GRUB
为了排除一切可能,我决定彻底重装 GRUB。

grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Arch

然而,最后的 Boss 出现了:

grub-install: error: cannot copy …: No space left on device.

我的 EFI 分区居然满了!这通常是旧的引导文件(比如 Windows 或其他 Linux 的残留)造成的。

解决方案:清理 EFI 分区。

# 查看 EFI/ 目录下的内容
ls /boot/efi/EFI

# 删除旧的、不需要的引导文件夹(千万不要删 Windows 的 'Microsoft' 文件夹!)
rm -rf /boot/efi/EFI/Arch_old
rm -rf /boot/efi/EFI/Boot

# 再次运行 grub-install 和 grub-mkconfig
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Arch
grub-mkconfig -o /boot/grub/grub.cfg

尾声:胜利的曙光

在清空了 EFI 分区,并成功重装 GRUB 后,我执行了最后的 reboot 命令。

这一次,熟悉的 GRUB 菜单出现了,系统顺利启动,久违的桌面环境终于展现在眼前。

总结与反思

这次漫长的修复过程让我学到了几点:

  1. 错误信息要看全UUID not found 只是表象,Initramfs unpacking failed 才是根本原因。
  2. 基础配置是魔鬼:一个错误的 fstab 挂载点 (/boot vs /boot/efi) 就能引发一连串的“灵异事件”。
  3. EFI 分区虽小,五脏俱全:不要忽略这个小分区的健康状况,定期清理不再使用的引导项是好习惯。
  4. 大胆假设,小心求证:当标准流程走不通时,就要怀疑更深层的问题,比如文件系统本身或核心软件包的完整性。

Arch Linux 的魅力就在于此,它让你直面系统的每一个细节,虽然过程痛苦,但成功修复后的成就感无与伦比。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇