4.1 晚上在滚系统的时候界面突然卡死,无奈只能强制重启,发现整个 pacman 全部崩了,内核也没编译成功……真是个不错的愚人节惊喜呢……
那两天面试多,只能先用 Windows 顶一顶了,在 Windows 里面用 WSL 挂载 Linux 分区,把数据都拷贝下来,到了 4.3 面试完了开始修复。
滚崩描述
原因
在使用 yay -Syyu
更新系统时,系统界面突然卡住,鼠标也无法使用,风扇狂转,等待一会后常按电源键强制关闭重启。
重启后发现 Linux 启动报错:
现象
使用 Arch 安装介质启动系统,挂载 Arch 分区,使用 arch-chroot /mnt /bin/bash
进入系统,发现 pacman
和 yay
无法使用,甚至 ls
也无法输出。
键入 pacman
命令会有报错:error while loading shared libraries: /usr/lib/xxx.so: file too short
系统修复
无效的尝试
在 Wiki 上查到一种修复的方式,但是无效。Wiki: Pacman crashed during an upgrade
- 使用
--sysroot
无法从远程仓库同步数据库; - 使用
--root
显示没有什么要更新的。
解决方案
最终在 Forum 上看到有人遇到了跟我一模一样的问题,根据上面的步骤一步步修复,终于 Arch 重见天日。
Forum: System not bootable after borked upgrade
步骤:
- 按 F12 使用 Arch installation medium 启动系统;
- 连接 WiFI
1
2
3
4
5
6rfkill unblock all
iwctl
station wlan0 get-networks
station wlan0 connect WIFI_NAME
exit
ping baidu.com - Mount Arch 分区
1
2mount /dev/nvme1n1p2 /mnt
mount /dev/nvme0n1p1 /mnt/boot - touch systemd 文件
1
touch /etc/systemd/do-not-udevadm-trigger-on-update
- 查看受损包
1
LC_ALL=C pacman -Qkk | grep -v ', 0 altered files' > output.txt 2>&1
- re-install with dboption
将所有显示no mtree file
的包和non-zero altered files
的包,使用dboption
选项重新安装,以重建 mtree,清理冲突文件。1
2
3
4pacman --root /mnt --cachedir /mnt/var/cache/pacman/pkg -S <package> --dbonly
# 如果显示文件已存在,使用 overwrite 命令
pacman --root /mnt --cachedir /mnt/var/cache/pacman/pkg -S <package> --overwrite \* --dbonly - re-install without dboption
将步骤 6 中的包,不使用dbonly
选项重新安装,以更新正确的/usr/lib/xxx.so
文件。
最终要确保所有包都有mtree
,以及没有在/usr/lib/
下的 alter file。 - 全面升级
chroot 到 Arch 系统中,更新整个系统。1
2arch-chroot /mnt /bin/bash
pacman -Syu
问题原因
Arch 的一个 bug:Bug: FS#77789 - [systemd] updating resets keyboard layout / udev reload
解决方案:
1 | sudo touch /etc/systemd/do-not-udevadm-trigger-on-update |
总结
- 随身携带 Arch 安装介质