Linux:一起离奇的启动故障

我现在用的 Manjaro 一直装在移动固态硬盘里,之前用的是 UGREEN 的 USB3.0 固态硬盘盒,为了解决散热导致的固态硬盘读写速度下降,进而卡顿的问题,花重金购置了 ORICO M2 固态硬盘盒,直接风扇加鳍片,效果拉满。今天到货之后立马安装。

然后开机。发现卡在 Manjaro 的省略号启动界面。这时候完全不知道是什么的问题,所以第一反应是看日志。

错误信息

重启并狂按 Ctrl+Alt+F2 以及上下左右,进入一个 SHELL 界面。看到报错如下:

1ERROR: device "UUID-33334463-99be-467f-bf7d-8c514fa7ef25° not found. Skipping fsck.
2mount: /new_root: can't find UUID-33334463-99be-467f-bf7d-8c514fa7ef25.
3You are now being dropped into an energency shell.
4sh. can't access tty. job control turned off

显然,找不到 UUID. 那么有这些可能:

  1. UUID 变更了,但 grub.cfg 还在用旧的。

  2. 固态硬盘坏了。设备直接消失。

  3. 固态硬盘盒坏了。

在 energency shell 下尝试了 fdisk -l,发现压根就没有这个命令。然后尝试了 lsblk,也没有这个命令。总之就是要啥缺啥。

排除硬件问题

为了排除硬件问题,我把固态硬盘拿出来,使用之前的硬盘盒,发现仍然不能启动。那么只能认为固态硬盘盒大概率没有坏。

固态硬盘自身也应该没有坏,因为在进入 Manjaro 之前,是可以看到 UEFI 的引导菜单的,而那个菜单的分区就在固态硬盘中。

胡乱尝试

然后我尝试进入各个引导菜单,最终发现 Manjaro 的 fallback initramfs 可以进去,并且正常登录系统。

GRUB 修复的尝试

既然能进系统,那么就可以尝试修复 GRUB 了。

首先通过如下命令查看文件系统,可知系统位于 /dev/sda

1sudo fdisk -l

运行下列命令安装 GRUB 到 /dev/sda,并更新配置文件。

1sudo grub-install /dev/sda
2sudo grub-update

这样如果 UUID 变更了,就能够纠正过来。

重启,进正常模式启动。启动失败。说明 UUID 没问题。而且实际上在 energency shell 中,我还尝试了 blkid

1bikid
2/dev/nvme0n0p3: TYPE-"BItLocker* PARTLABEL- "Basic data partition" PARTUUID-"988d8723-c481-475b-912a-3e3c59987897"
3/dev/nvme0n0p1: UUID-*8062-1E21° BLOCK_SIZE- "512" TVPE-"vfat" PARTLABEL- "EFI sustem partition" PARTUUID-"37ec4857-76db-4b18-96cb-442de717f676"
4/dev/nvme0n0p4: BLOCK/SIZE-*512° WUID--4BDE2DDGDE2DCACE* TYPE-*ntre° PARTUUID *35271007-3785- 45e7-8812-61e4d199 216*
5/dev/nvme0n0p2: PARTLABEL-"Microsoft reserved partition" PARTUUID-"2894FfbI-846b-4fe5-bfcf-30722821d74b*

诡异的是没有出现 /dev/sda。上面的 /dev/nvme 设备显然不是我的固态,而是主板上的硬盘。(因为我的移动 SSD 没有安装 Windows)

这个时候我怀疑是 BIOS 设置的问题,导致引导的时候 USB 设备没有加载。看了一下笔记本的 BIOS 设置,比较简陋,也没找到相关的配置项。另外转念一想,既然都能进入 UEFI 的引导菜单,那么引导的时候肯定是能够加载 USB 设备的。所以排除。

然后在 fallback 模式我还尝试了 lsblk,发现 /dev/sda 确实是存在的。并且还能够看到 UUID。另外学习了一下相关知识,原来 UUID 是分区的时候分配的,而不是硬盘的。所以即使硬盘换了,或者硬盘的驱动板子坏了,UUID 也不会变的。

控制变量

上面唯一正常进入系统的尝试是进入 fallback initramfs。而观察他俩的 GRUB 启动配置,唯一的区别就是 initramfs 镜像路径。所以还有一种可能,就是 Manjaro 的 initramfs 损坏。

造成这个的原因一般是系统升级滚挂了。我上次升级之后,好像确实就没有关过机。

因此我直接进 fallback 模式,运行:

1sudo mkinitcpio -P

重启,问题解决。

悬念

至于 initramfs 到底是何处损坏,导致恰好不能识别 /dev/sda,我们不得而知。