Arch Linux 重装记录

上周三晚上备份 dotfiles 的时候，btrfs scrub 报了一堆 csum error。开始以为是文件系统问题，smartctl -a /dev/nvme0 跑了一下——Media and Data Integrity Errors: 0x0004，NVMe 寿命快到头了。这台机器是 2022 年初装的 Intel 660p，4 年下来健康度掉到 73%。也该换了。换硬盘是个由头，正好把半年没滚的系统、装到一半的配置、散乱的 dotfiles 全部整一遍。为什么又选 Arch 这个问题每次都有人问。简短回答：滚动升级，避免大版本升级的痛苦（Ubuntu 22.04 → 24.04 那种我已经受够了） AUR，几乎所有小众软件都有，不用自己打 deb/rpm Wiki 是最好的 Linux 文档，没有之一精简，装出来是什么就是什么，没有预装 30 个我用不到的 snap 缺点也有：偶尔滚挂了自己修；systemd 升级偶尔 breaking change。但对我来说收益大于成本。硬件 CPU: AMD Ryzen 5 5600X 主板: B550M Mortar 内存: 32 GB DDR4-3600 新硬盘: WD SN770 1TB（之前是 660p 1TB）老硬盘（保留为数据盘）: Samsung 870 EVO 2TB 显卡: GTX 1660 Super（不玩游戏，但偶尔跑点 CUDA 验证）分区方案这次坚持 Btrfs，subvolume 切分。理由： snapshot 真的能救命（snapper 自动 timeline）压缩透明（zstd:3 几乎无感知，节约 20%+ 空间） subvolume 可以独立挂载，恢复数据方便 # 这次没用 LVM，直接 Btrfs subvolume # 设备: /dev/nvme0n1 # EFI 分区 fdisk /dev/nvme0n1 # n → p → 1 → 2048 → +512M (EFI) # n → p → 2 → 继续 (Btrfs) # t → 1 → uefi # t → 2 → linux filesystem mkfs.fat -F32 /dev/nvme0n1p1 mkfs.btrfs -f /dev/nvme0n1p2 mount /dev/nvme0n1p2 /mnt # subvolume 切分 btrfs subvolume create /mnt/@ btrfs subvolume create /mnt/@home btrfs subvolume create /mnt/@var-log btrfs subvolume create /mnt/@var-cache btrfs subvolume create /mnt/@snapshots # 卸载重挂，每个 subvolume 单独挂载 umount /mnt mount -o subvol=@,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt mkdir -p /mnt/{home,var/log,var/cache,.snapshots} mount -o subvol=@home,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt/home mount -o subvol=@var-log,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt/var/log mount -o subvol=@var-cache,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt/var/cache mount -o subvol=@snapshots,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt/.snapshots mount /dev/nvme0n1p1 /mnt/boot/efi 坑 1： 一定要在装系统前就建好所有 subvolume 并挂载，之后再调整会很麻烦。我第一遍手抖漏了 @var-log，导致 pacman 装日志写到了 @，重做了一遍。坑 2： @snapshots 不要放在 @ 下面，否则 snapper 创建 snapshot 时会把当前 @ 里的内容也卷进去。独立 top-level 是正解。安装基础系统 # 装包（精简，只装后续会用的） pacstrap -K /mnt \ base linux linux-firmware \ linux-headers \ btrfs-progs \ intel-ucode \ networkmanager \ vim \ git \ sudo \ base-devel \ reflector \ snapper \ snap-pac # fstab genfstab -U /mnt >> /mnt/etc/fstab # 验证 fstab cat /mnt/etc/fstab # 看到 UUID 不是 /dev/nvme0n1pX 这样的设备名，就对了 chroot 进去之后： arch-chroot /mnt # 时区 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime hwclock --systohc # locale sed -i 's/^#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen sed -i 's/^#zh_CN.UTF-8/zh_CN.UTF-8/' /etc/locale.gen locale-gen echo "LANG=en_US.UTF-8" > /etc/locale.conf echo "KEYMAP=us" > /etc/vconsole.conf # hostname echo "kvasir" > /etc/hostname # hosts cat > /etc/hosts < /boot/loader/loader.conf < /etc/sddm.conf.d/wayland.conf <