系统故障排查总纲
本章汇总新手最常遇到的"系统坏了"场景与自救方法。核心原则:永远先冷静,不要急着重装。大部分故障 30 分钟内可修复。具体案例可对照 /wiki/archlinux/issues.html 的实战档案,本章提供方法论速查。
一、系统升级自救(pacman -Syu 翻车)
1.1 升级后进不去系统 / 卡在黑屏
先在 GRUB 界面按 e 编辑启动项,找到 linux 行,在行尾追加:
systemd.unit=multi-user.target
按 Ctrl+X 启动进入纯命令行模式(不加载桌面环境),再继续排查。
如果怀疑是显卡驱动问题,追加 nomodeset 或 nvidia-drm.modeset=1。
1.2 PGP 签名失效(最常见的升级报错)
error: failed to commit transaction (invalid or corrupted package (PGP signature))
原因:archlinux-keyring 包过期,无法验证新密钥。修复:
sudo pacman -Sy archlinux-keyring
sudo pacman-key --refresh-keys
如果 -Sy archlinux-keyring 也报签名错误,使用:
sudo pacman-key --init
sudo pacman-key --populate archlinux
1.3 partial upgrade 警告(部分升级)
:: Partially upgrading the system is not recommended. Make sure all of the packages in
:: your system are up to date.
含义:你之前用 pacman -Sy 装了新包(只同步了数据库没升级全系统),现在系统处于"部分升级"状态。正确做法:
sudo pacman -Syu
把系统完全升级。永远不要忽略这个警告强制安装。
1.4 依赖冲突 / 文件冲突
error: failed to prepare transaction (could not satisfy dependencies)
先完整同步:
sudo pacman -Syu
仍冲突时查看被什么包占用:
sudo pacman -Syu --overwrite /path/to/file
--overwrite 只在你清楚自己在做什么时使用。不确定时把完整报错发到交流群或 Arch Wiki 搜索。
二、chroot 救援总纲(进不去系统的万能钥匙)
只要硬盘没坏、文件还在,chroot 基本都能救。
2.1 进入 live 环境
用安装 U 盘启动(与安装时同一操作),然后:
# 查看磁盘布局
lsblk
# 挂载根分区(以 /dev/nvme0n1p2 为例,替换成你自己的)
# 本教程使用 btrfs 的 @ / @home 子卷布局,必须挂载 @ 子卷而不是顶层卷(顶层卷是空目录,chroot 进去会是空系统)
mount -o subvol=/@ /dev/nvme0n1p2 /mnt
# 挂载 @home 子卷(如安装时按本教程建了 @home 则执行,没有则跳过)
mount -o subvol=/@home /dev/nvme0n1p2 /mnt/home
# 挂载 EFI 分区(以 /dev/nvme0n1p1 为例)
mount --mkdir /dev/nvme0n1p1 /mnt/efi
# 如果使用 snapper 快照布局(快照在 @/.snapshots),救援时不需要单独挂载;进入系统后由 snapper 读取
# (仅当你是"快照单独子卷"的旧式布局时才需要:mount -o subvol=@snapshots /dev/nvme0n1p2 /mnt/.snapshots)
# 绑定系统目录
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run
# 进入系统
chroot /mnt /bin/bash
提示:btrfs 子卷布局的挂载顺序很关键(先根后子卷)。用 snapper 的布局可参考快照和系统维护章节,逐条确认
lsblk显示的挂载点;本教程布局下根分区必须带subvol=/@挂载。
2.2 chroot 内常用救援操作
# 重新生成引导
grub-mkconfig -o /boot/grub/grub.cfg
# 重新安装 GRUB 到 EFI(以 /dev/nvme0n1p1 为例)
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB
# 修复 pacman 数据库损坏
pacman-key --init
pacman-key --populate archlinux
# 修复内核(以 linux 包为例)
pacman -S linux linux-headers
# 修复显卡驱动(N 卡)
pacman -S nvidia nvidia-utils
# 查看引导日志
journalctl -xb | tail -50
修复完执行 exit 退出 chroot,reboot 重启。
三、双系统引导救援
3.1 Windows 更新把 GRUB 吃掉了
现象:开机直接进 Windows,看不到 Linux 引导菜单。
用 live U 盘启动,chroot 后(见上文):
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg
重启即可恢复。
3.2 手动添加 Windows 启动项(efibootmgr)
Linux 引导里没有 Windows 时,先确认 Windows 的 EFI 分区位置:
lsblk -o NAME,SIZE,LABEL,PARTTYPE
Windows 的 EFI 分区通常是 FAT32 格式(LABEL 为 ESP 或 SYSTEM)。然后:
# 查看现有启动项
efibootmgr
# 添加 Windows 启动项(/dev/nvme0n1p1 换成你的 ESP 分区)
sudo efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Windows Boot Manager" \
--loader '\EFI\Microsoft\Boot\bootmgfw.efi'
3.3 删除 Windows 后的引导修复
删除 Windows 分区后,GRUB 可能仍显示 Windows 条目但无法启动。更新引导菜单:
sudo grub-mkconfig -o /boot/grub/grub.cfg
如果 OS-prober 还检测到残留,检查 /etc/default/grub 中 GRUB_DISABLE_OS_PROBER 是否被设为 false(正常情况 Windows 已删除可保持 true)。
四、常见启动故障速查
| 现象 | 排查方向 |
|---|---|
| 卡在 "A start job is running for..." | 磁盘挂载失败,systemctl status 查看具体单元,常见是 fstab 写错,chroot 修复 fstab |
| 黑屏只有光标闪烁 | 显卡驱动问题,GRUB 加 nomodeset 试试;N 卡用 nvidia-drm.modeset=1 |
| 启动到一半重启 | 内核问题,chroot 后重新安装 linux 包 |
| initramfs 报错 | pacman -S linux 重新生成 initramfs(mkinitcpio) |
| 时间显示错误 | 双系统时区冲突,Linux 用 UTC、Windows 用本地时间,看安装ArchLinux章节的时间设置 |
五、日志排查入门
journalctl 与 systemctl 的详细用法见systemd与日志排查,这里只记最常用的:
journalctl -xb # 本次启动的全部日志
journalctl -p 3 -xb # 只看错误
journalctl -xb | tail -50 # 看最后部分
实在救不回来时:进 live 环境把 /home、/etc 等关键数据备份出来再重装,你的数据永远比系统重要。
SHORiNのARCH