如题,一次意外停电,导致一台笔者的Linux桌面系统的计算机无法正常启动了。
故障现象
这次遇到的故障现象是,停电恢复上电后,系统可以正常启动和显示启动Grub菜单,但默认菜单显示时间到时后,加载系统时,出现以下错误信息:
error: file '/boot/initramfs-linux.img' not found
错误: 文件 /boot/initramfs-linux.img' 无法找到
然后启动界面挂起,不响应任何键盘操作。 使用另外一个菜单选项Advenced Bootup启动,也是相同的错误。反复尝试重启了几次,都是同样的问题。
系统配置和分析
这个系统的软硬件配置是:
- 硬件: Intel I3-7100T/ 16G RAM / 256G NVME
- 操作系统:EndeavourOS 20230528
- 内核版本: 6.5.2-arch1-1 #1 SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
这个操作系统的基础是ArchLinux,所以相关操作和配置都是这一体系的。如包管理工具是 pacman等等。
从故障现象分析,系统硬件本体应该是好的,但意外断电导致了某些操作系统的配置信息或者文件损坏。导致不能正常启动。初步判断和初始内存文件系统(initramfs)的初始化操作和配置有关。
简单问了一下claude,了解了一下initramfs:
initramfs是一种预先载入ramdisk中的文件系统镜像,在系统引导过程中作为根文件系统挂载使用。可以包含系统引导所需的模块、程序等。initramfs在引导时预先加载到ramdisk,然后引导后会被卸载,数据不会持久化,用于提供引导时最基本的文件环境。
修复操作
经过相关问题的研究和资料查找,基本确定可以尝试使用mkinitcpio工具来进行修复,具体的修复方案和过程如下:
1 使用一个新的USB盘,制作了相同操作系统的LiveCD
2 使用此U盘,正常启动,进入LiveOS的操作界面
3 启动命令行界面,进入sudo
4 执行命令 fdisk -l,查看和确认原来的操作系统分区和位置, 为 /dev/nvme0n1p1
5 挂载原系统分区: mount /dev/nvme0n1p1 /mnt
6 修改root到挂载点: arch-chroot /mnt
7 重建 initramfs: mkinitcpio -p linux
8 重新启动系统
前面的步骤都很顺利,但到最后的第7步出了问题,系统提示找不到 mkinitcpio命令。 搜索 /sbin和/use/sbin 确实没有相关的文件存在。
这是,尝试使用pacman安装这个软件:
pacman -S mkinitcpio
竟然可以安装,要知道我们现在是liveOS环境,并不是真实的系统环境。
软件安装完成之后,重新尝试重建命令,这时候又出现了新的错误,提示无法找到这个文件:
/etc/mkinitcpio.d/linux.preset
确实这个文件并不存在,但突然发现在同一文件夹下存在一个linux.preset.save文件,就将其用linux.preset为名复制了一个文件。然后重新执行重建命令,应该是成功了。
系统重启后,基本回到了原来的系统,这个问题应该算是解决了。
小结
在正常的情况下,linux系统的工作是非常稳定的,但如果遇到突然断电这种情况,还是有一定风险影响到系统,导致无法正常启动的。当然这也有可能是这次运气不太好,其他很多系统也是这种情况也没有问题,所以应该是一个概率问题。
Windows系统的用户量巨大,桌面系统的使用和维护时间也很长,所以微软相对这种异常状态和修复和恢复的机制做的就比较完善。比如提供了安全模式、修复模式,中文语言界面、客户服务和社区等等,遇到问题相对而言比较容易解决。Linux毕竟相对小众,出了问题很多要靠国际社区或者自己摸索,特别是语言的问题,本地化的有效支持信息相对少一些。对使用者的信息技术水平的要求也比较高。
但其实过了初始的学习曲线后,Linux的系统的稳定、健壮和简洁就会体现出它的优势。很多系统的问题,当你了解了其基本架构、逻辑和原理后,解决起来其实并不是那么麻烦。很多工具和流程其实都已经在那里,只不过一般人在一般的场景下也接触不到,需要一个现场自我学习和查找解决方案的过程。