起因

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

动手前就三件事:

  1. 把 Windows 里的重要数据备份到移动硬盘;
  2. 关掉 Windows 快速启动,BitLocker 先 suspend 或关闭(不然 Linux 读不了 NTFS);
  3. 进 BIOS 关 Secure Boot,确认启动模式是 UEFI。

ISO 去 archlinux.org 下,顺手校验一下 sha256sum。写盘工具用 Ventoy 或者 Rufus 都行,U 盘启动后先进 live 环境。

联网之后先对时,不然后面 TLS 和密钥环容易出问题:

1
2
timedatectl set-ntp true
ping -c 3 archlinux.org

分区

分区之前先 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
2
3
4
5
6
7
# 下面是关键命令,cfdisk 里的交互过程略过
cfdisk /dev/nvme0n1
cfdisk /dev/nvme1n1

mkfs.fat -F 32 /dev/nvme1n1p3
mkswap /dev/nvme0n1p5
mkfs.btrfs -L ARCH /dev/nvme0n1p6

Btrfs 先建子卷,再按子卷挂:

1
2
3
4
5
6
7
8
9
10
11
mount /dev/nvme0n1p6 /mnt
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
umount /mnt

OPTS="compress=zstd:3,ssd,discard=async,space_cache=v2"
mount -o "$OPTS",subvol=@ /dev/nvme0n1p6 /mnt
mkdir -p /mnt/home /mnt/efi
mount -o "$OPTS",subvol=@home /dev/nvme0n1p6 /mnt/home
mount /dev/nvme1n1p3 /mnt/efi
swapon /dev/nvme0n1p5

挂载参数我是这么定的:

参数 原因
compress=zstd:3 压缩率和速度比较平衡,日常够用
ssd 告诉 Btrfs 这是 SSD
discard=async 异步 TRIM,比开机 fstrim 平滑,所以 fstrim.timer 没开
space_cache=v2 新版空间缓存,挂载快一点
relatime 默认访问时间策略,没必要折腾

确认没问题再继续:

1
2
findmnt /mnt /mnt/home /mnt/efi
lsblk -f

装基础系统

基础包直接按手册来:

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
2
3
genfstab -U /mnt >> /mnt/etc/fstab
cat /mnt/etc/fstab
arch-chroot /mnt

时区、locale、主机名:

1
2
3
4
5
6
7
8
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc

sed -i 's/^#en_US.UTF-8/en_US.UTF-8/; s/^#zh_CN.UTF-8/zh_CN.UTF-8/' /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf

echo '<hostname>' > /etc/hostname

用户和 sudo,常规操作:

1
2
3
4
passwd
useradd -mG wheel <user>
passwd <user>
EDITOR=vim visudo

visudo 里把 %wheel ALL=(ALL:ALL) ALL 那一行取消注释就行。

然后装引导器。我的 EFI 分区挂在 /efi,UEFI 启动项名字用了 Bronya:

1
2
3
4
5
pacman -S --needed grub efibootmgr os-prober
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=Bronya
grub-mkconfig -o /boot/grub/grub.cfg

systemctl enable NetworkManager

--bootloader-id 只是 UEFI 启动项的名字,efibootmgr 里会显示成 Bronya。os-prober 负责后面把 Windows 找出来,所以 /etc/default/grub 里要留:

1
GRUB_DISABLE_OS_PROBER=false

最后退出、卸载、重启:

1
2
3
exit
umount -R /mnt
reboot

拔 U 盘,等 GRUB 菜单。

第一次开机就翻车了

第一次重启没直接进系统。当时在 live 环境里反复 arch-chroot,核心就是 --efi-directory 和 --boot-directory 没分清:

1
2
3
4
arch-chroot /mnt
grub-install --target=x86_64-efi --efi-directory=/efi --boot-directory=/efi --bootloader-id=Bronya
ln -sf /efi/grub /boot/grub
grub-mkconfig -o /boot/grub/grub.cfg

--efi-directory 指的是 ESP(/efi),--boot-directory 是 GRUB 放模块和配置的目录。两个都指到 /efi 之后,/boot/grub 和 /efi/grub 就开始打架,于是又有了 ln -sf 这种补丁操作。

八月底干脆重做了一遍:

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo rm -rf /efi/EFI/Bronya /efi/grub /boot/grub
sudo pacman -S grub efibootmgr os-prober fuse3
sudo mkdir -p /boot/grub
sudo grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=Bronya

sudo mkdir -p /efi/grub
UUID=$(sudo findmnt / -n -o UUID)
sudo tee /efi/grub/grub.cfg <<EOF
search --fs-uuid --no-floppy --set=root $UUID
configfile /@/boot/grub/grub.cfg
EOF

sudo grub-mkconfig -o /boot/grub/grub.cfg

现在的结构是这样:

1
2
3
4
/efi/EFI/Bronya/grubx64.efi   # UEFI 实际启动的文件,约 336KB
/efi/grub/grub.cfg # 110 字节的转发配置
/boot/grub/grub.cfg # 真正的菜单,在 btrfs 的 @ 子卷里
/boot/grub/grub-btrfs.cfg # grub-btrfs 生成的快照菜单

说人话就是:ESP 只负责把 GRUB 拉起来,真正的菜单、主题、字体、模块和快照入口都放在 btrfs 上的 /boot/grub。以后改配置只需要动 btrfs,不用反复挂 ESP。我按 SHORiN 的文档 里的做法试过,快照回滚换的只是子卷内容,文件系统 UUID 不变,所以不会因为内容变化把 GRUB 搞坏。真正要留意的是换盘或者重建文件系统,那时候才需要同步改 /efi/grub/grub.cfg 里的 UUID。

efibootmgr 现在能看到两个关键启动项:

1
2
Boot0000* Bronya            EFI\Bronya\grubx64.efi
Boot0003* Windows Boot Manager

顺序上 Bronya 在前,Windows 在 GRUB 菜单里选。/etc/default/grub 里还做了这些事:

1
2
3
4
5
6
7
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT=5
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=5 nowatchdog modprobe.blacklist=iTCO_wdt"
GRUB_THEME="/usr/share/grub/themes/bilibili/theme.txt"
GRUB_DISABLE_OS_PROBER=false
GRUB_DISABLE_BOOTNEXT=true
  • 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
2
systemctl enable NatworkManager   # 错
systemctl enable NetworkManager # 对

用户是在 chroot 里补的。后来有一次连续输错密码,被 faillock 锁住,root 下重置:

1
faillock --user <user> --reset

第一次进系统大概是 2026-07-19 14:21,离装完基础系统不到一小时。中间先用了一段时间 niri,但不太喜欢,7 月 30 日才换成 Hyprland——现在想想也挺有意思,先有一个能跑命令的系统,再慢慢把它变成桌面。

装完系统还得配

镜像和源

国内环境先换镜像。我用 reflector 生成列表,参数大概是:

1
2
# With: reflector --protocol https --sort rate --verbose --age 12 --fastest 10 --country China
# When: 2026-10-17 10:13:22 UTC

对应命令:

1
2
reflector --protocol https --sort rate --age 12 --fastest 10 --country China \
--save /etc/pacman.d/mirrorlist --verbose

然后加 archlinuxcn 源,装 keyring,开 multilib,装 AUR 助手:

1
2
3
4
5
6
7
# /etc/pacman.conf
[archlinuxcn]
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch
Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch

pacman -Sy archlinuxcn-keyring
pacman -S --needed base-devel yay

archlinuxcn-keyring 当时反复装了几次才稳定,经典环节:先 pacman -Syu 把官方 keyring 更新,再装 cn 的 keyring,别在数据库半新半旧的时候装新包。

字体、声音、蓝牙

1
2
3
4
5
6
7
8
pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji ttf-jetbrains-mono-nerd

pacman -S sof-firmware alsa-ucm-conf alsa-firmware \
pipewire wireplumber pipewire-pulse pipewire-alsa pipewire-jack

pacman -S bluez power-profiles-daemon flatpak
systemctl enable --now bluetooth
systemctl enable --now power-profiles-daemon

笔记本音频这套是必须的:sof-firmware + alsa-ucm-conf 管声卡固件和路由,PipeWire 管日常播放。装完用 wpctl status 或者 pactl info 看服务正常就行。

显卡

这台机器 lspci 里只看得到 RTX 4060(核显没启用/没暴露),所以没折腾 PRIME 双显卡切换,直接走 NVIDIA 开源内核模块:

1
2
3
4
5
pacman -S linux-headers
pacman -S nvidia-open-dkms nvidia-utils lib32-nvidia-utils
pacman -S mesa lib32-mesa vulkan-intel lib32-vulkan-intel
pacman -S libva-nvidia-driver
pacman -S nvidia-container-toolkit

nvidia-open-dkms 的好处是内核升级后 DKMS 自动重编,坏处是必须装 linux-headers,而且大版本内核更新后最好确认一下:

1
2
dkms status
cat /sys/module/nvidia_drm/parameters/modeset # Y

nvidia-container-toolkit 是给 Docker 里的 CUDA 用的,和桌面无关,后面配置篇再提。

快照

Btrfs 最舒服的地方是快照。装完系统后给 / 和 /home 都建了 snapper 配置:

1
2
3
4
5
6
pacman -S snapper btrfs-assistant grub-btrfs inotify-tools
snapper -c root create-config /
snapper -c home create-config /home
systemctl enable --now grub-btrfsd
systemctl enable --now snapper-timeline.timer
systemctl enable --now snapper-cleanup.timer

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 状态不对 跟玲珑官方开发者反馈过,最新玲珑商店前端已经加了自动检测修复;遇到问题先更新前端,再按官方文档清缓存

参考

安装篇到这里。桌面怎么从 TTY 变成现在这套 Hyprland + Noctalia,见下一篇:Arch Linux 桌面配置:Hyprland、Noctalia 与我的日常环境。