记第一次滚挂

前一天晚上走之前滚了一次系统,然后就开开心心地关机回宿舍了,今天一来发现系统无法启动。终于,经过了大半年的使用,我成功滚挂了。

报错信息

从 GRUB 界面选择 Arch Linux 后,启动内核报错:

排查原因

从报错信息可以看到是 Initramfs 有问题,联想到昨天更新了一次,直接去 pacman.log 里面找对应的信息。

可以发现是 mkinitcpio 这个包更新时出错了,在生成 /boot/initramfs-linux.img 时,文件过大导致无法写入。

Arch Linux 和 Windows 11 两个系统使用了同一个启动分区,也就是我们将 Windows 11 的 EFI 启动分区挂载在了 /boot 目录下,大小为 260MB。

查看生成的 initramfs-linux.img 文件有 160MB,查看备份文件发现,之前的该文件仅有 16MB。说明是 mkinitcpio 更新导致生成的 initramfs-linux.img 过大而无法写入,使得内核启动失败。

使用的工具

工具:Arch Linux installation medium(安装 Arch Linux 时制作的安装介质)

  1. 连接网络
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 解除无线网卡的禁用
    rfkill unblock all

    # 进入 iwctl
    iwctl

    # 查看无线网卡列表
    device list

    # 查看无线网络列表
    station wlan0 get-networks

    # 连接无线网络
    station wlan0 connect WIFI_NAME

    # 退出 iwctl
    exit

    # 检测是否连接成功
    ping baidu.com
  2. 挂载分区
    1
    2
    mount /dev/nvme1n1p2 /mnt
    mount /dev/nvme0n1p1 /mnt/boot/
  3. 进入系统
    1
    arch-chroot /mnt /bin/bash
  4. 查看 pacman.log
    1
    vim /var/log/pacman.log

解决方案

方案一:EFI 分区扩容(失败)

最直接的方式是扩容 EFI 分区,下面是目前的分区:

1
2
3
4
5
6
7
8
9
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
nvme1n1 259:0 0 953.9G 0 disk Windows 11 硬盘
├─nvme1n1p1 259:2 0 260M 0 part /boot EFI 启动分区、/boot 挂载分区(双系统共用)
├─nvme1n1p2 259:3 0 16M 0 part MSR 分区
├─nvme1n1p3 259:4 0 951.6G 0 part Windows 11 数据分区
└─nvme1n1p4 259:5 0 2G 0 part Windows 恢复分区
nvme0n1 259:1 0 931.5G 0 disk Arch Linux 硬盘
├─nvme0n1p1 259:6 0 16M 0 part 不知道哪里来的分区
└─nvme0n1p2 259:7 0 931.5G 0 part / Arch Linux 数据分区,/ 挂载分区

可以看到 EFI 分区后面为 MSR 分区,MSR 似乎不太能删掉,因此 EFI 分区后面没有直接可扩展的空间,方案 PASS。

方案二:修改 mkinitcpio 配置(成功)

扩容失败后想到要降级回原本的包版本,于是运行命令:

1
pacman -U https://arch-archive.tuna.tsinghua.edu.cn/2024/01-08/core/os/x86_64/mkinitcpio-37.1-2-any.pkg.tar.zst

但还是出现相同的错误。之后在 Arch 论坛中发现有人有同样的问题:https://bbs.archlinux.org/viewtopic.php?id=291900

根据帖子,修改了 mkinitcpio 的配置 /etc/mkinitcpio.conf,将 kms 从 HOOKS 中去除,重新安装 mkinitcpio,问题解决。

Generates initial ramdisk environments for booting the Linux kernel based on the specified preset(s).
mkinitcpio -p linux

为啥这个帖子不在官网的首页?!

Another workaround:
https://bbs.archlinux.org/viewtopic.php?id=291900 #15

总结

要及时备份,随身携带启动盘。