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. 那么有这些可能:
-
UUID 变更了,但
grub.cfg
还在用旧的。 -
固态硬盘坏了。设备直接消失。
-
固态硬盘盒坏了。
在 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
,我们不得而知。