记一次ArchLinux升级后开机Warning: xxx/modules.devname not found导致卡在挂载磁盘 进入emergency shell无法开机的问题

文章讲述了作者在新年升级ArchLinux系统时遇到的问题,initramfs损坏导致无法正常启动。作者提供了通过Archisolivecd、挂载损坏分区、修复initramfs配置以及解决模块加载错误的详细步骤,以帮助读者解决类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多人认为是pacman -Syu的时候断电导致的问题。本人新年第一天升级系统的时候啥也没干(除了把几个开发依赖的软件包加入pacman ignore?),升级的过程中不知为何突然锁屏了一下(我猜就是这个导致的)。后面重启开机就寄了直接进入emergency shell模式,键盘也输入不了,只能强制关机,搞得我把开发环境搬到win下去了。

参考了tg群友的意见,是initramfs损坏导致的。需要外界chroot介入的情况下mkinitcpio解决问题,还有一些博主提出了解决方法比如@JoeNahm的文章

1 准备archiso的livecd

因为我很久之前是参考这个教程安装的arch,因此我又翻出来参考了。livecd u盘不是必须的,你只要能有另一个能启动的完整linux满足下面的条件:

  • 必须能独立启动,也就是说不依赖于已经无法启动的linux所在分区
  • 能够访问到已损坏的linux所在分区,不管是拆硬盘还是插u盘

这里提供一个制作archiso的u盘livecd的方法。如果没有archiso怎么办?参考制作winpe的方法两步搞定:

  • 先用ventoy(点此处前往下载)格式化u盘,可以参考网上有大把的教程如何使用ventoy,非常简单。(这样会导致u盘原有文件丢失,所以尽量使用空的/不用的u盘,4GB以上即可)
  • 再去arch官网把镜像下载下来扔到u盘的ventoy目录下就搞定。

2 进入archiso的live系统 挂载已损坏linux的分区

进入live

插上u盘,开机的时候,就像你要进入winpe一样,狂按某个键通过BIOS设置从u盘启动。我的笔记本是F7 F8 F11 F12当中的某一个,不知道是哪个就一起按。
ventoy会给一个界面给你选,选择arch的镜像回车。arch也会给你几个选项,选第一个就可以了。
进入live系统之后,可以参考Archlinux简明教程-基础安装-联网当中的方式连接网络(因为指不定之后还要用网)。

挂载分区 并chroot

可以参考Archlinux简明教程-基础安装-挂载当中的方式挂载磁盘。注意,因为每个人安装arch的选项都不同,这里需要根据自己安装的情况调整命令参数。

# 挂载 / 分区,我的arch文件系统分区(/和/home)类型为btrfs,位于固态的/dev/nvme0n1p4处
mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p4 /mnt 
# 挂载 /home 分区
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p4 /mnt/home
# 挂载交换分区(可选)
swapon /dev/nvme0n1p3

如果忘记了磁盘上哪个分区是干啥用的,可以fdisk -l查看一下再挂载。

可以使用df -h查看是否已经挂载成功(新挂载的分区会显示在末尾)。

挂载完了就可以chroot进入已损坏的linux了:

arch-chroot /mnt

这时候可以看看是否成功chroot进去了,比如ls /home里面是不是之前自己设置的用户。

3!尝试修复系统

再次生成initramfs配置文件.img

尝试直接运行

mkinitcpio -p linux

看看有没有报错(ERROR)。如果没有报错(有Warning不用管)并且最后显示成功生成了.img文件,那么可以进入下一步退出live系统重启试试能否打开原已损坏系统了。

如果中途报一堆的ERROR:xxx module not found,可以参考arch论坛的这个帖子。估计是升级系统的时候哪里崩了(大概率是linux包)导致很多module找不到。此时可以再次更新系统:pacman -Syu

命令运行过程中没有error的话会自动mkinitcpio -p linux(因为一般会更新linux包),为了以防万一,更新完再跑一次mkinitcpio -p linux

我这里遇到了一个问题:pacman -Syu的时候提示 fail to synchronize all databases (unable to lock database)。解决方法也是参考了知乎的这个专栏

rm -f /var/lib/pacman/db.lck

4 退出livecd重启进入系统

此时处于chroot环境。

  • 通过exit命令退出chroot环境
  • umount -R /mnt卸载分区
  • reboot重启系统

别忘记关机后(重启前)把u盘拔了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值