本指南记录在已有 Windows 的机器上,通过 Arch Linux livecd 命令行安装 CachyOS 的完整流程。引导器使用 Limine,根文件系统使用 Btrfs,配合 Snapper 实现系统快照回滚,zram 替代传统 swap 分区。
适用场景:AMD Zen 4 平台(如 Ryzen 7 8845H),UEFI 启动,与 Windows 双系统共存。其他平台按文中说明调整即可。
前置准备
Windows 侧操作
安装 Linux 之前,需要在 Windows 里完成几件事:
-
备份重要数据。分区操作有风险,丢了不负责。
-
关闭 BitLocker。如果 Windows 启用了 BitLocker,先暂停或关闭,否则装完 Linux 可能触发恢复密钥。
-
关闭休眠和快速启动。以管理员身份打开 PowerShell:
powercfg /h off快速启动会锁定磁盘,导致 Linux 无法正确挂载 NTFS 分区。
-
压缩 Windows 分区,腾出空间。打开"计算机管理" -> "磁盘管理",右键 Windows 分区选"压缩卷",留出你打算给 Linux 的空间。不要格式化这段未分配空间,后面在 Linux 下处理。
-
不要动 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。
评论区