记第二次滚挂

4.1 晚上在滚系统的时候界面突然卡死,无奈只能强制重启,发现整个 pacman 全部崩了,内核也没编译成功……真是个不错的愚人节惊喜呢……

那两天面试多,只能先用 Windows 顶一顶了,在 Windows 里面用 WSL 挂载 Linux 分区,把数据都拷贝下来,到了 4.3 面试完了开始修复。

滚崩描述

原因

在使用 yay -Syyu 更新系统时,系统界面突然卡住,鼠标也无法使用,风扇狂转,等待一会后常按电源键强制关闭重启。

重启后发现 Linux 启动报错:

现象

使用 Arch 安装介质启动系统,挂载 Arch 分区,使用 arch-chroot /mnt /bin/bash 进入系统,发现 pacmanyay 无法使用,甚至 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

步骤:

  1. 按 F12 使用 Arch installation medium 启动系统;
  2. 连接 WiFI
    1
    2
    3
    4
    5
    6
    rfkill unblock all
    iwctl
    station wlan0 get-networks
    station wlan0 connect WIFI_NAME
    exit
    ping baidu.com
  3. Mount Arch 分区
    1
    2
    mount /dev/nvme1n1p2 /mnt
    mount /dev/nvme0n1p1 /mnt/boot
  4. touch systemd 文件
    1
    touch /etc/systemd/do-not-udevadm-trigger-on-update
  5. 查看受损包
    1
    LC_ALL=C pacman -Qkk | grep -v ', 0 altered files' > output.txt 2>&1
  6. re-install with dboption
    将所有显示 no mtree file 的包和 non-zero altered files 的包,使用 dboption 选项重新安装,以重建 mtree,清理冲突文件。
    1
    2
    3
    4
    pacman --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
  7. re-install without dboption
    将步骤 6 中的包,不使用 dbonly 选项重新安装,以更新正确的 /usr/lib/xxx.so 文件。
    最终要确保所有包都有 mtree,以及没有在 /usr/lib/ 下的 alter file。
  8. 全面升级
    chroot 到 Arch 系统中,更新整个系统。
    1
    2
    arch-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

总结

  1. 随身携带 Arch 安装介质