Arch Linux 安装实录:Windows 双系统、Btrfs 与 GRUB
起因
Ubuntu 用了几年,想换个滚动更新的系统,顺便试试 AUR 和 Hyprland,于是就有了这次 Arch 安装。
其实这次是第二次装。第一次大概提前两三个月就开始了,来来回回装了好几遍,一直不满意,边装边摸索;7 月 19 日这次才算定下来。
其实拖到现在才写,主要是懒。
机器是 Legion Y9000P IRX9,i9-14900HX + RTX 4060 + 32G 内存,双 1T 硬盘。Windows 11 继续留着,Arch 装另一块盘上,平时用 Arch。
这篇主要参考了 SHORiN_KiWATA 的 Arch Linux 手动安装文档 和 Arch Wiki 的 Installation guide。教程仓库里的 shorin-arch-setup 脚本我下载下来看过,但没跑一键安装,系统是手动装的。
没有 LUKS,也没开 Secure Boot,就是普通的 Windows + Linux 双系统。下面出现的设备名和分区号都是我机器上的,你照抄之前先 lsblk -f 看一眼自己的。
准备
机器
| 项目 | 配置 |
|---|---|
| 机型 | Legion Y9000P IRX9(83DF) |
| CPU | Intel Core i9-14900HX |
| 显卡 | NVIDIA GeForce RTX 4060 Laptop 8GB |
| 内存 | 32GB DDR5 |
| 硬盘 | 1TB NVMe(Windows + Arch)+ 1TB NVMe(游戏 + ESP) |
| 屏幕 | 16” 2560×1600 240Hz + 27” 2560×1440 144Hz + 便携屏 2560×1600 160Hz |
备份和 BIOS
动手前就三件事:
- 把 Windows 里的重要数据备份到移动硬盘;
- 关掉 Windows 快速启动,BitLocker 先 suspend 或关闭(不然 Linux 读不了 NTFS);
- 进 BIOS 关 Secure Boot,确认启动模式是 UEFI。
ISO 去 archlinux.org 下,顺手校验一下 sha256sum。写盘工具用 Ventoy 或者 Rufus 都行,U 盘启动后先进 live 环境。
联网之后先对时,不然后面 TLS 和密钥环容易出问题:
1 | timedatectl set-ntp true |
分区
分区之前先 lsblk -f 看清楚磁盘。我这台机器最后是这样:
| 设备 | 大小 | 文件系统 | 挂载点 | 用途 |
|---|---|---|---|---|
/dev/nvme0n1p1 |
260M | vfat | — | Windows 的 SYSTEM_DRV(没动) |
/dev/nvme0n1p2 |
16M | — | — | Windows MSR |
/dev/nvme0n1p3 |
200G | ntfs | — | Windows 系统盘 |
/dev/nvme0n1p4 |
150G | ntfs | — | Windows 软件盘 |
/dev/nvme0n1p5 |
32G | swap | [SWAP] |
交换分区 |
/dev/nvme0n1p6 |
571.6G | btrfs | /、/home |
Arch 根分区,@ + @home |
/dev/nvme1n1p1 |
952.9G | ntfs | /mnt/games |
游戏盘 |
/dev/nvme1n1p3 |
1007M | vfat | /efi |
Arch 的 ESP |
几个当时的想法:
- ESP 单独放第二块盘,没复用 Windows 那个 260M 的 SYSTEM_DRV。好处是两套系统的 EFI 文件互不干扰,1G 空间也宽裕;坏处是第二块盘如果不在,Arch 就起不来。
- swap 给了 32G,和内存一样大,但我没配休眠(cmdline 里没有
resume=),实际主要用来兜底。 - 装系统时 Btrfs 只建了
@和@home两个子卷,没单独拆/boot、/var、/opt。后来 snapper 又建了/.snapshots和/home/.snapshots放快照。 - 游戏盘用内核自带的
ntfs3挂载,nofail,避免盘不在时卡开机。
分区和挂载
分区用 cfdisk。要动的是 nvme0n1 上腾出来的 p5、p6,还有 nvme1n1 上给 Arch 的 p3;Windows 分区一个都别碰。
1 | # 下面是关键命令,cfdisk 里的交互过程略过 |
Btrfs 先建子卷,再按子卷挂:
1 | mount /dev/nvme0n1p6 /mnt |
挂载参数我是这么定的:
| 参数 | 原因 |
|---|---|
compress=zstd:3 |
压缩率和速度比较平衡,日常够用 |
ssd |
告诉 Btrfs 这是 SSD |
discard=async |
异步 TRIM,比开机 fstrim 平滑,所以 fstrim.timer 没开 |
space_cache=v2 |
新版空间缓存,挂载快一点 |
relatime |
默认访问时间策略,没必要折腾 |
确认没问题再继续:
1 | findmnt /mnt /mnt/home /mnt/efi |
装基础系统
基础包直接按手册来:
1 | pacstrap -K /mnt base linux linux-firmware btrfs-progs networkmanager vim sudo intel-ucode |
装的是这些:
| 包 | 作用 |
|---|---|
base |
最小系统 |
linux / linux-firmware |
内核和固件 |
btrfs-progs |
Btrfs 工具 |
networkmanager |
网络管理,后面用 nmcli / nmtui |
vim / sudo |
编辑器和提权 |
intel-ucode |
Intel CPU 微码,GRUB / initramfs 会自动加载 |
生成 fstab,看一眼没问题就进 chroot:
1 | genfstab -U /mnt >> /mnt/etc/fstab |
时区、locale、主机名:
1 | ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
用户和 sudo,常规操作:
1 | passwd |
visudo 里把 %wheel ALL=(ALL:ALL) ALL 那一行取消注释就行。
然后装引导器。我的 EFI 分区挂在 /efi,UEFI 启动项名字用了 Bronya:
1 | pacman -S --needed grub efibootmgr os-prober |
--bootloader-id 只是 UEFI 启动项的名字,efibootmgr 里会显示成 Bronya。os-prober 负责后面把 Windows 找出来,所以 /etc/default/grub 里要留:
1 | GRUB_DISABLE_OS_PROBER=false |
最后退出、卸载、重启:
1 | exit |
拔 U 盘,等 GRUB 菜单。
第一次开机就翻车了
第一次重启没直接进系统。当时在 live 环境里反复 arch-chroot,核心就是 --efi-directory 和 --boot-directory 没分清:
1 | arch-chroot /mnt |
--efi-directory 指的是 ESP(/efi),--boot-directory 是 GRUB 放模块和配置的目录。两个都指到 /efi 之后,/boot/grub 和 /efi/grub 就开始打架,于是又有了 ln -sf 这种补丁操作。
八月底干脆重做了一遍:
1 | sudo rm -rf /efi/EFI/Bronya /efi/grub /boot/grub |
现在的结构是这样:
1 | /efi/EFI/Bronya/grubx64.efi # UEFI 实际启动的文件,约 336KB |
说人话就是:ESP 只负责把 GRUB 拉起来,真正的菜单、主题、字体、模块和快照入口都放在 btrfs 上的 /boot/grub。以后改配置只需要动 btrfs,不用反复挂 ESP。我按 SHORiN 的文档 里的做法试过,快照回滚换的只是子卷内容,文件系统 UUID 不变,所以不会因为内容变化把 GRUB 搞坏。真正要留意的是换盘或者重建文件系统,那时候才需要同步改 /efi/grub/grub.cfg 里的 UUID。
efibootmgr 现在能看到两个关键启动项:
1 | Boot0000* Bronya EFI\Bronya\grubx64.efi |
顺序上 Bronya 在前,Windows 在 GRUB 菜单里选。/etc/default/grub 里还做了这些事:
1 | GRUB_DEFAULT=saved |
saved+SAVEDEFAULT:记住上次启动的系统,双系统来回切很舒服;bilibili主题:八月初换的。换主题的时候还顺手犯了个错,sudo update-grub在 Arch 上没有,得用grub-mkconfig -o /boot/grub/grub.cfg;GRUB_DISABLE_BOOTNEXT=true:新版 GRUB 的31_efi_bootnext会自动生成 BootNext 菜单项,我不需要,就关了;iTCO_wdt黑名单 +nowatchdog:减少 watchdog 相关的噪音。
服务名和用户名的坑
网络服务名拼错了一次:
1 | systemctl enable NatworkManager # 错 |
用户是在 chroot 里补的。后来有一次连续输错密码,被 faillock 锁住,root 下重置:
1 | faillock --user <user> --reset |
第一次进系统大概是 2026-07-19 14:21,离装完基础系统不到一小时。中间先用了一段时间 niri,但不太喜欢,7 月 30 日才换成 Hyprland——现在想想也挺有意思,先有一个能跑命令的系统,再慢慢把它变成桌面。
装完系统还得配
镜像和源
国内环境先换镜像。我用 reflector 生成列表,参数大概是:
1 | # With: reflector --protocol https --sort rate --verbose --age 12 --fastest 10 --country China |
对应命令:
1 | reflector --protocol https --sort rate --age 12 --fastest 10 --country China \ |
然后加 archlinuxcn 源,装 keyring,开 multilib,装 AUR 助手:
1 | # /etc/pacman.conf |
archlinuxcn-keyring 当时反复装了几次才稳定,经典环节:先 pacman -Syu 把官方 keyring 更新,再装 cn 的 keyring,别在数据库半新半旧的时候装新包。
字体、声音、蓝牙
1 | pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji ttf-jetbrains-mono-nerd |
笔记本音频这套是必须的:sof-firmware + alsa-ucm-conf 管声卡固件和路由,PipeWire 管日常播放。装完用 wpctl status 或者 pactl info 看服务正常就行。
显卡
这台机器 lspci 里只看得到 RTX 4060(核显没启用/没暴露),所以没折腾 PRIME 双显卡切换,直接走 NVIDIA 开源内核模块:
1 | pacman -S linux-headers |
nvidia-open-dkms 的好处是内核升级后 DKMS 自动重编,坏处是必须装 linux-headers,而且大版本内核更新后最好确认一下:
1 | dkms status |
nvidia-container-toolkit 是给 Docker 里的 CUDA 用的,和桌面无关,后面配置篇再提。
快照
Btrfs 最舒服的地方是快照。装完系统后给 / 和 /home 都建了 snapper 配置:
1 | pacman -S snapper btrfs-assistant grub-btrfs inotify-tools |
grub-btrfs 会把快照写进 GRUB 菜单,开机可以直接从某个快照启动。这里有个和前面 GRUB 结构相关的细节:因为真正的 /boot/grub 在 btrfs 的 /@ 子卷里,所以 /etc/default/grub-btrfs/config 里要把搜索目录指对:
1 | GRUB_BTRFS_GBTRFS_SEARCH_DIRNAME="/@/boot/grub" |
现在快照编号已经到 #488,/boot/grub/grub-btrfs.cfg 里能看到最近的一批 timeline 快照。装完当天我还在几个关键节点打了检查点快照(装桌面之前、配置之前),后面折腾桌面时心里有底。
教程仓库里的脚本我下载下来读过,尤其是 snapper 和 GRUB 这几段;但系统里这些命令是手动执行的,没跑一键安装。sysup 是 UP主 SHORiN 的脚本,用法放到配置篇讲。
内核和 initramfs
内核用的是 linux + linux-headers,当前是 7.2.11。initramfs 用的是 systemd 钩子:
1 | HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck) |
时间线
| 日期 | 发生了什么 |
|---|---|
| 2026-07-19 13:33 | 开始装基础包;14:21 第一次进入系统 |
| 2026-07-19 17:10–17:37 | 装桌面前的几个检查点快照 |
| 2026-07-19~07-29 | 中间用了一段时间 niri,但不太喜欢 |
| 2026-07-30 | 换成 Hyprland + Noctalia,装 zsh、fcitx5 |
| 2026-08-02 | 换上 bilibili 的 GRUB 主题 |
| 2026-08-29 | 重做 GRUB:ESP 只留 stub,配置放回 btrfs |
| 2026-10-11 | 登录器从 greetd + noctalia-greeter 换成 SDDM |
| 2026-10-25 | 写这篇记录:系统 97 天,864 个 pacman 包 |
踩坑总结
| 坑 | 现象 | 解决 |
|---|---|---|
/boot/grub 与 /efi/grub 混淆 |
GRUB 找不到配置、进不了系统 | 分清 --efi-directory 和 --boot-directory;最后用 stub 转发到 /@/boot/grub/grub.cfg |
sudo update-grub |
命令不存在 | Arch 用 grub-mkconfig -o /boot/grub/grub.cfg |
NatworkManager |
服务不存在,开机没网 | systemctl enable --now NetworkManager |
faillock 锁用户 |
密码正确也登不进去 | root 下 faillock --user <user> --reset |
| 包名手滑 | noevim、pipwire、sof-firware、-needed |
先 pacman -Ss 确认包名,Arch 的包名是精确匹配 |
| archlinuxcn keyring | 签名错误、反复重装 | 先更新官方 keyring,再装 cn keyring;避免部分升级 |
| 玲珑 / linyaps | 反复装删后 ll-cli 状态不对 |
跟玲珑官方开发者反馈过,最新玲珑商店前端已经加了自动检测修复;遇到问题先更新前端,再按官方文档清缓存 |
参考
- SHORiN_KiWATA / ShorinArchExperience-ArchlinuxGuide(手动安装部分)
- Arch Wiki: Installation guide
- Arch Wiki: Btrfs
- Arch Wiki: GRUB
- Arch Wiki: Snapper
- Arch Wiki: NetworkManager
- Arch Wiki: NVIDIA
- Arch Linux News
安装篇到这里。桌面怎么从 TTY 变成现在这套 Hyprland + Noctalia,见下一篇:Arch Linux 桌面配置:Hyprland、Noctalia 与我的日常环境。



