CachyOS 双系统安装指南 (Limine + Btrfs + Snapper)

在已有 Windows 的机器上,通过 Arch Linux livecd 命令行安装 CachyOS 的完整流程。引导器 Limine,根文件系统 Btrfs,配合 Snapper 实现系统快照回滚,zram 替代传统 swap。

本指南记录在已有 Windows 的机器上,通过 Arch Linux livecd 命令行安装 CachyOS 的完整流程。引导器使用 Limine,根文件系统使用 Btrfs,配合 Snapper 实现系统快照回滚,zram 替代传统 swap 分区。

适用场景:AMD Zen 4 平台(如 Ryzen 7 8845H),UEFI 启动,与 Windows 双系统共存。其他平台按文中说明调整即可。


前置准备

Windows 侧操作

安装 Linux 之前,需要在 Windows 里完成几件事:

  1. 备份重要数据。分区操作有风险,丢了不负责。

  2. 关闭 BitLocker。如果 Windows 启用了 BitLocker,先暂停或关闭,否则装完 Linux 可能触发恢复密钥。

  3. 关闭休眠和快速启动。以管理员身份打开 PowerShell:

    powercfg /h off
    

    快速启动会锁定磁盘,导致 Linux 无法正确挂载 NTFS 分区。

  4. 压缩 Windows 分区,腾出空间。打开"计算机管理" -> "磁盘管理",右键 Windows 分区选"压缩卷",留出你打算给 Linux 的空间。不要格式化这段未分配空间,后面在 Linux 下处理。

  5. 不要动 Windows 的 EFI、MSR、Recovery 分区

UEFI 固件设置

进入 BIOS/UEFI(开机按 Del/F2/F12,不同品牌不一样),确认:

  • 启动模式为 UEFI,不用 Legacy/CSM。
  • Secure Boot 关闭。后续如果需要开启,得单独处理 Limine 签名。
  • 保留 Windows Boot Manager 启动项。
  • 用一次性启动菜单选择 U 盘启动。

制作启动盘

推荐 Ventoy:下载安装到 U 盘,然后把 Arch Linux ISO 直接丢进 U 盘根目录就行,不用反复格式化。

本方案从 Arch Linux livecd 手动安装 CachyOS,不使用 CachyOS 图形安装器。


第一步:Live 环境配置

U 盘启动后选第一项进入 livecd,你将看到一个 root shell。

基础设置

放大字体(可选,高分屏有用):

setfont ter-132b

同步系统时钟:

timedatectl set-ntp true
timedatectl status

连接网络

有线网络一般自动连上。无线网络用 iwctl

iwctl
device list
station wlan0 scan
station wlan0 get-networks
station wlan0 connect "你的WiFi名称"
exit

验证一下:

ping -c 3 archlinux.org

SSH 远程操作(强烈推荐)

在 livecd 里敲命令很痛苦——没有剪贴板,字体丑,窗口小。建议开 SSH,用另一台电脑远程操作:

passwd                    # 给 root 设个临时密码
systemctl start sshd      # 启动 SSH 服务
ip -brief addr            # 查看 IP 地址

然后在另一台电脑:

ssh root@<livecd的IP地址>

配置国内镜像源

官方镜像在国内很慢,换成中科大/清华/南大:

cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak

cat >/etc/pacman.d/mirrorlist <<'EOF'
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.nju.edu.cn/archlinux/$repo/os/$arch
EOF

pacman -Syy

确认你的 CPU 适合哪个 CachyOS 仓库

CachyOS 针对不同 CPU 微架构提供优化仓库,选错不影响运行,但选对了性能更好。

/lib/ld-linux-x86-64.so.2 --help | grep -E 'x86-64-v[234].*supported'
lscpu | grep -E 'Vendor ID|Model name'

判定规则:

CPU 情况 仓库选择
只支持 x86-64-v2 或更低 用默认仓库,不加 v3/v4
支持 x86-64-v3 cachyos-v3
AMD Zen 4/Zen 5 优先 cachyos-znver4

Intel 12 代及以后的混合架构 CPU 即使报告 v4,也建议按 v3 处理,因为大小核混用 AVX-512 不稳定。

如需确认 AMD Zen 4 的 GCC 目标:

pacman -S --needed gcc
gcc -march=native -Q --help=target 2>&1 | grep -Po '^\s+-march=\s+\K(\w+)$'

输出 znver4 就对了。

确认磁盘布局

lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINTS
blkid

记下你要操作的磁盘设备名。假设你的磁盘是 /dev/nvme0n1,Windows 已经占用了前几个分区,你要在空闲空间上装 Linux。


第二步:分区

这是高危操作,搞错磁盘会丢数据。确认三次再动手。

用 cfdisk 创建分区

cfdisk /dev/nvme0n1

在空闲空间上创建两个新分区:

分区 大小 类型 用途
EFI 1G EFI System Linux 独立 EFI 分区
Root 剩余全部 Linux filesystem Btrfs 根分区

为什么要单独建 EFI 分区? Windows 的 EFI 分区只给 Windows 用,Linux 单独一个,互不干扰。Windows 更新不会覆盖 Limine,Linux 内核更新也不会碰 Windows 引导文件。

写入分区表后退出,刷新内核分区表:

partprobe /dev/nvme0n1

格式化

只格式化新建的两个分区,不要碰 Windows 的分区

mkfs.fat -F32 -n CACHYEFI /dev/nvme0n1p5    # EFI 分区,设备号按实际调整
mkfs.btrfs -f -L CACHYOS /dev/nvme0n1p6     # Btrfs 根分区

创建 Btrfs 子卷

Btrfs 子卷的作用是让快照管理更精细。每个子卷可以独立做快照、独立回滚。

先挂载 Btrfs 顶层,创建子卷:

mount /dev/nvme0n1p6 /mnt

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@root
btrfs subvolume create /mnt/@srv
btrfs subvolume create /mnt/@cache
btrfs subvolume create /mnt/@tmp
btrfs subvolume create /mnt/@log
btrfs subvolume create /mnt/@snapshots

umount /mnt

各子卷的分工:

子卷 挂载点 说明
@ / 系统根目录
@home /home 用户数据,独立快照
@root /root root 用户的 home
@srv /srv 服务数据
@cache /var/cache 系统缓存
@tmp /var/tmp 临时文件
@log /var/log 系统日志
@snapshots /.snapshots Snapper 快照存储

不需要 swap 子卷,因为本方案用 zram(内存压缩)代替传统 swap 分区。

挂载目标系统

mount -o subvol=@,compress=zstd:1,noatime /dev/nvme0n1p6 /mnt

mkdir -p /mnt/{home,root,srv,var/cache,var/tmp,var/log,.snapshots,efi}

mount -o subvol=@home,compress=zstd:1,noatime /dev/nvme0n1p6 /mnt/home
mount -o subvol=@root,compress=zstd:1,noatime /dev/nvme0n1p6 /mnt/root
mount -o subvol=@srv,compress=zstd:1,noatime /dev/nvme0n1p6 /mnt/srv
mount -o subvol=@cache,compress=zstd:1,noatime /dev/nvme0n1p6 /mnt/var/cache
mount -o subvol=@tmp,compress=zstd:1,noatime /dev/nvme0n1p6 /mnt/var/tmp
mount -o subvol=@log,compress=zstd:1,noatime /dev/nvme0n1p6 /mnt/var/log
mount -o subvol=@snapshots,compress=zstd:1,noatime /dev/nvme0n1p6 /mnt/.snapshots

mount /dev/nvme0n1p5 /mnt/efi

挂载选项说明:

  • compress=zstd:1 — zstd 压缩,级别 1,读写性能接近无压缩,但能省磁盘空间。
  • noatime — 不记录文件访问时间,减少写入量,SSD 友好。

验证挂载:

findmnt -R /mnt

第三步:安装基础系统

pacstrap 安装

pacman -Sy --needed archlinux-keyring

确认 CPU 厂商,选择微码:

lscpu | grep 'Vendor ID'
# AuthenticAMD -> MICROCODE=amd-ucode
# GenuineIntel -> MICROCODE=intel-ucode

安装基础包:

pacstrap -K /mnt \
  base base-devel linux-firmware $MICROCODE \
  btrfs-progs dosfstools ntfs-3g \
  networkmanager sudo vim nano git curl wget \
  efibootmgr mkinitcpio

生成 fstab

genfstab -U /mnt > /mnt/etc/fstab

检查一下生成的文件,确保所有子卷和 EFI 分区都在:

cat /mnt/etc/fstab

应该能看到 //home/root/srv/var/cache/var/tmp/var/log/.snapshots/efi 的挂载条目。


第四步:Chroot 基础配置

进入新系统:

arch-chroot /mnt

以下命令都在 chroot 环境中执行。

时区和语言

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc

生成 locale:

sed -i 's/^#\(en_US.UTF-8 UTF-8\)/\1/' /etc/locale.gen
sed -i 's/^#\(zh_CN.UTF-8 UTF-8\)/\1/' /etc/locale.gen
locale-gen

默认语言建议用英文,避免 TTY 下中文乱码:

cat >/etc/locale.conf <<'EOF'
LANG=en_US.UTF-8
EOF

如果桌面环境用中文,在桌面环境的 locale 设置里单独调就行,不用改系统默认。

主机名和用户

echo cachyos >/etc/hostname

cat >/etc/hosts <<'EOF'
127.0.0.1 localhost
::1       localhost
127.0.1.1 cachyos.localdomain cachyos
EOF

设置 root 密码,创建日常用户:

passwd

useradd -m -G wheel -s /bin/bash snemc   # 换成你的用户名
passwd snemc

启用 sudo:

EDITOR=vim visudo

取消这行的注释:

%wheel ALL=(ALL:ALL) ALL

启用网络:

systemctl enable NetworkManager

配置镜像源(chroot 内)

cat >/etc/pacman.d/mirrorlist <<'EOF'
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.nju.edu.cn/archlinux/$repo/os/$arch
EOF

pacman -Syy

第五步:安装 CachyOS 仓库

CachyOS 的优化仓库需要单独配置。这一步把标准 Arch 仓库替换为 CachyOS 的优化版本。

下载仓库配置脚本

cd /tmp
rm -rf cachyos-repo cachyos-repo.tar.xz

curl -L https://mirrors.ustc.edu.cn/cachyos/cachyos-repo.tar.xz -o cachyos-repo.tar.xz
tar xvf cachyos-repo.tar.xz
cd cachyos-repo

修改脚本使用国内镜像

脚本默认从 CachyOS 官方镜像下载文件,在国内可能很慢。替换为 USTC:

cp cachyos-repo.sh cachyos-repo.sh.orig

sed -i 's#https://mirror.cachyos.org/repo/x86_64/cachyos#https://mirrors.ustc.edu.cn/cachyos/repo/x86_64/cachyos#g' cachyos-repo.sh

脚本末尾会自动执行 pacman -Syu,但此时 CachyOS 镜像还没配好国内源,先禁用:

sed -i 's|^    pacman -Syu$|    true|' cachyos-repo.sh

执行脚本

./cachyos-repo.sh

脚本会安装 CachyOS keyring、mirrorlist 和 CachyOS 版 pacman。根据你的 CPU,它会自动写入对应的优化仓库。

检查结果:

grep -nE '^\[cachyos|Include = /etc/pacman.d/cachyos' /etc/pacman.conf

如果你的 CPU 是 Zen 4,应该看到 [cachyos-znver4] 相关条目。

配置 CachyOS 国内镜像

cat >/etc/pacman.d/cachyos-mirrorlist <<'EOF'
Server = https://mirrors.ustc.edu.cn/cachyos/repo/$arch/$repo
Server = https://mirror.nju.edu.cn/cachyos/repo/$arch/$repo
EOF

cat >/etc/pacman.d/cachyos-v4-mirrorlist <<'EOF'
Server = https://mirrors.ustc.edu.cn/cachyos/repo/$arch_v4/$repo
Server = https://mirror.nju.edu.cn/cachyos/repo/$arch_v4/$repo
EOF

首次同步:

pacman -Syyu

第六步:内核与系统组件

安装 CachyOS 内核

pacman -S --needed linux-cachyos linux-cachyos-headers

配置 mkinitcpio

Btrfs 根分区需要在 initramfs 阶段就可用,显式加入模块。如果你用 AMD 核显,也加上 amdgpu

sed -i 's/^MODULES=.*/MODULES=(btrfs amdgpu)/' /etc/mkinitcpio.conf

重新生成 initramfs:

mkinitcpio -P

安装 zram、Snapper、Limine

pacman -S --needed \
  zram-generator \
  snapper snap-pac \
  limine limine-mkinitcpio-hook limine-snapper-sync

安装过程中 snap-pac 可能报 fatal library error,这是 chroot 环境下 D-Bus 不可用导致的,不影响包安装,忽略即可。

如果后续 chroot 内的 pacman 操作持续报错,可以临时移走 snap-pac 的 hook:

mkdir -p /root/disabled-pacman-hooks
mv /usr/share/libalpm/hooks/*snap-pac*.hook /root/disabled-pacman-hooks/ 2>/dev/null || true

配置 zram

zram 用内存压缩模拟 swap,比 swap 分区快,不浪费磁盘空间:

mkdir -p /etc/systemd

cat >/etc/systemd/zram-generator.conf <<'EOF'
[zram0]
zram-size = ram / 2
compression-algorithm = zstd
swap-priority = 100
fs-type = swap
EOF

配置含义:用内存的一半创建 zram 设备,zstd 压缩算法,优先级 100(比任何磁盘 swap 高)。

配置内核命令行

Limine 需要 /etc/kernel/cmdline 来知道从哪里启动:

ROOT_UUID=$(blkid -s UUID -o value /dev/nvme0n1p6)

cat >/etc/kernel/cmdline <<EOF
root=UUID=${ROOT_UUID} rootflags=subvol=@ rw quiet
EOF

rootflags=subvol=@ 告诉内核使用 @ 子卷作为根目录。


第七步:Limine 引导器

配置 Limine 使用独立 EFI 分区

mkdir -p /etc/default

grep -q '^ESP_PATH=' /etc/default/limine \
  && sed -i 's#^ESP_PATH=.*#ESP_PATH=/efi#' /etc/default/limine \
  || echo 'ESP_PATH=/efi' >> /etc/default/limine

安装 Limine

limine-mkinitcpio    # 把内核和 initramfs 同步到 EFI 分区
limine-install       # 安装 Limine EFI 文件

添加 Windows 启动项

先扫描已有的 EFI 启动项:

limine-scan

由于 Windows 和 Linux 使用不同的 EFI 分区,需要通过 Windows EFI 分区的 GPT UUID 来链式启动。找到 Windows EFI 分区的 UUID:

blkid /dev/nvme0n1p1    # Windows EFI 分区,设备号按实际调整

记下 UUID,追加 Windows 启动项:

cp /efi/limine.conf /efi/limine.conf.bak

cat >>/efi/limine.conf <<'EOF'

/Windows Boot Manager
  protocol: efi
  path: guid(你的Windows-EFI分区UUID):/EFI/Microsoft/Boot/bootmgfw.efi
EOF

验证启动顺序:

efibootmgr -v

确保 Limine 排在第一位,Windows Boot Manager 保留。


第八步:配置 Snapper 快照

Snapper 是 Btrfs 快照管理工具,配合 snap-pac 可以在每次 pacman 操作前后自动创建快照,出问题可以随时回滚。

配置 root 快照

因为我们提前创建了 @snapshots 子卷并挂载到了 /.snapshots,需要先处理掉 Snapper 的默认行为:

umount /.snapshots
rmdir /.snapshots

snapper --no-dbus -c root create-config /

# 删除 Snapper 自动创建的 .snapshots 子卷,恢复我们的 @snapshots
btrfs subvolume delete /.snapshots
mkdir /.snapshots
mount -a
chmod 750 /.snapshots

调整快照策略:

# 关闭时间线快照(只保留 pacman 操作前后的快照)
sed -i 's/^TIMELINE_CREATE=.*/TIMELINE_CREATE="no"/' /etc/snapper/configs/root

# 最多保留 10 个普通快照、5 个重要快照
sed -i 's/^NUMBER_LIMIT=.*/NUMBER_LIMIT="10"/' /etc/snapper/configs/root
sed -i 's/^NUMBER_LIMIT_IMPORTANT=.*/NUMBER_LIMIT_IMPORTANT="5"/' /etc/snapper/configs/root
sed -i 's/^EMPTY_PRE_POST_CLEANUP=.*/EMPTY_PRE_POST_CLEANUP="yes"/' /etc/snapper/configs/root

创建初始快照:

snapper --no-dbus -c root create --type single --description "initial install"

配置 home 快照(可选)

如果你希望 /home 也能独立快照:

snapper --no-dbus -c home create-config /home
chmod 750 /home/.snapshots

sed -i 's/^TIMELINE_CREATE=.*/TIMELINE_CREATE="no"/' /etc/snapper/configs/home
sed -i 's/^NUMBER_LIMIT=.*/NUMBER_LIMIT="10"/' /etc/snapper/configs/home
sed -i 's/^NUMBER_LIMIT_IMPORTANT=.*/NUMBER_LIMIT_IMPORTANT="5"/' /etc/snapper/configs/home

snapper --no-dbus -c home create --type single --description "initial home"

配置 Limine 快照菜单

limine-snapper-sync 让你在启动时可以从快照列表中选择启动,相当于 GRUB 的快照回滚功能:

grep -q '^ROOT_SNAPSHOTS_PATH=' /etc/default/limine \
  && sed -i 's#^ROOT_SNAPSHOTS_PATH=.*#ROOT_SNAPSHOTS_PATH=/@snapshots#' /etc/default/limine \
  || echo 'ROOT_SNAPSHOTS_PATH=/@snapshots' >> /etc/default/limine

grep -q '^ESP_PATH=' /etc/default/limine \
  && sed -i 's#^ESP_PATH=.*#ESP_PATH=/efi#' /etc/default/limine \
  || echo 'ESP_PATH=/efi' >> /etc/default/limine

同步快照菜单:

limine-snapper-sync

启用相关服务:

systemctl enable snapper-cleanup.timer
systemctl enable limine-snapper-sync.service

第九步:EFI 分区备份

EFI 分区是 FAT32,不在 Btrfs 快照的管理范围内。本方案通过 rsync 把 /efi 同步到 Btrfs 根子卷中的备份目录,让 root 快照能间接记录 EFI 状态。

创建同步脚本

mkdir -p /var/lib/efi-backup
chmod 700 /var/lib/efi-backup

cat >/usr/local/sbin/sync-efi-backup <<'EOF'
#!/bin/bash
set -euo pipefail

src=/efi
dst=/var/lib/efi-backup/current

if ! findmnt -rno FSTYPE "$src" | grep -qx vfat; then
  echo "EFI partition is not mounted at $src" >&2
  exit 1
fi

mkdir -p "$dst"
rsync -aH --delete \
  --exclude 'System Volume Information' \
  "$src"/ "$dst"/
EOF

chmod 755 /usr/local/sbin/sync-efi-backup

首次同步:

pacman -S --needed rsync
/usr/local/sbin/sync-efi-backup

自动化:systemd service + pacman hook

让 EFI 备份在内核或引导器更新时自动执行:

cat >/etc/systemd/system/efi-backup.service <<'EOF'
[Unit]
Description=Backup EFI system partition into Btrfs root
After=local-fs.target
ConditionPathIsMountPoint=/efi

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/sync-efi-backup
EOF
mkdir -p /etc/pacman.d/hooks

cat >/etc/pacman.d/hooks/95-efi-backup.hook <<'EOF'
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Package
Target = linux-cachyos
Target = limine
Target = limine-mkinitcpio-hook
Target = limine-snapper-sync
Target = amd-ucode

[Action]
Description = Backing up EFI partition into Btrfs root...
When = PostTransaction
Exec = /usr/local/sbin/sync-efi-backup
EOF

第十步:收尾与重启

重启前最后操作

snapper --no-dbus -c root create --type single --description "before first reboot"
snapper --no-dbus -c home create --type single --description "before first reboot home"
limine-snapper-sync
/usr/local/sbin/sync-efi-backup

退出并重启

exit
umount -R /mnt
reboot

记得拔掉 U 盘,否则又会进 livecd。


首次启动验证

进入新系统后,用你创建的普通用户登录。

连接网络

nmcli dev status
nmcli radio wifi on
sudo nmcli --ask dev wifi connect "你的WiFi名称"

验证 zram

swapon --show

应该看到 /dev/zram0,大小约为物理内存的一半。

验证 NetworkManager

systemctl status NetworkManager

应该是 active (running)

验证 Limine 快照同步

systemctl status limine-snapper-sync.service

状态显示 inactive (dead) 是正常的——服务执行完就退出了。如果提示缺少 inotifywait

sudo pacman -S --needed inotify-tools
sudo systemctl restart limine-snapper-sync.service

验证 Snapper

sudo snapper list

应该能看到之前创建的快照。如果报 xterm-kitty: unknown terminal type,安装 terminfo:

sudo pacman -S --needed kitty-terminfo

验证挂载

findmnt /.snapshots
findmnt /efi

确认 /.snapshots 指向 @snapshots 子卷,/efi 指向独立的 EFI 分区。

最终同步

sudo limine-snapper-sync
sudo /usr/local/sbin/sync-efi-backup
sudo snapper create --type single --description "post first boot verified"

后续步骤

系统装好了,接下来按需安装:

  • 桌面环境(KDE/GNOME/Hyprland 等)
  • 显卡驱动
  • 中文输入法(fcitx5-rime 等)
  • 常用软件

Arch Linux CN 社区源有很多国内常用软件,可以加上:

sudo vim /etc/pacman.conf
# 末尾添加:
# [archlinuxcn]
# Server = https://mirrors.bfsu.edu.cn/archlinuxcn/$arch

sudo pacman -Syyu
sudo pacman -S archlinuxcn-keyring
sudo pacman -S paru   # AUR 助手

常见问题

Q: snap-pac 在 chroot 里报 fatal library error A: 正常现象,chroot 内没有 D-Bus。包安装不受影响,后续操作可以临时移走 hook。

Q: Windows 更新后 Limine 启动项消失了 A: 进 BIOS 手动调整启动顺序,把 Limine 排回第一位。Windows 不会删除 Limine 文件,只是可能改 NVRAM 顺序。

Q: 如何从快照回滚系统 A: 重启时在 Limine 快照菜单中选择一个快照启动。进入系统后确认没问题,用 snapper rollback 设为默认。

Q: 为什么不用 swap 分区? A: zram 用内存压缩模拟 swap,速度比磁盘 swap 快一个数量级,且不浪费 SSD 写入寿命。现代 Linux 发行版普遍推荐 zram。

Interaction

读完之后

分享海报
Interaction

评论区