Linux
ID: MDARCHLI

archlinux配置教程

March 21, 2026
13 min read
AsniyaAsniya

Arch Linux 从零复刻「我当前这套系统」的超详细配置教程(niri + Wayland + NVIDIA 混合显卡 + 风格美化)

我把你当成第一次装 Arch,但又想一步到位做成“能用、好看、稳定、可维护”的人。

目标:把一台全新电脑从 Arch ISO 装到和我当前机器类似的最终效果:

  • 系统基底:Arch Linux(可选用 CachyOS 获得同款优化)
  • 会话:Wayland
  • 桌面/窗口管理器:niri(scrollable-tiling)
  • 登录管理器:LightDM(Wayland 会话)
  • 终端:kitty
  • 应用启动器:fuzzel(含主题色与键位)
  • 输入法:fcitx5(中文)
  • 音频:PipeWire + WirePlumber
  • NVIDIA + Intel 混合显卡:按需用独显(prime-run)
  • 美化:圆角/阴影/主题色、Breeze 光标、合理 DPI 缩放
  • 可维护:Btrfs 子卷 + Snapper 快照(更新翻车可回滚)

注意:我这台机器是 CachyOS + niri + dms-shell(AUR 包)组合;本教程以“原生 Arch 可复刻”为核心,同时给出“如果你想更像 CachyOS”的可选分支。

[0x]
目录

[0xA-]
A. 你需要准备什么

  1. 一个 U 盘(>= 8GB)

  2. Arch Linux ISO

  1. 能上网的环境
  • 最理想:有线网
  • 也可以 Wi‑Fi(在安装环境里用 iwctl/nmcli 连接)
  1. 你要明确你想要的磁盘布局
  • 本教程采用:UEFI + GPT + Btrfs(子卷) + swapfile(可选)
  • 这是 Arch 上最“长期省心”的方案之一。

[0xB-BI]
B. 安装前的 BIOS/UEFI 设置(非常关键)

进入 BIOS/UEFI(通常开机按 F2/Del):

  1. Boot Mode:UEFI(必须)
  2. 关闭 CSM/Legacy(如果有)
  3. Secure Boot:建议先关
  • 你熟练后可以再开 Secure Boot 并自己签名模块(高级玩法)。
  1. SATA/NVMe 模式默认即可(多数是 AHCI/NVMe)
  2. 如果是 NVIDIA 笔记本混合显卡:
  • 保持 Hybrid/Optimus 模式即可,不要强行 dGPU only(除非你清楚功耗代价)。

[0xC-AR]
C. 用 Arch ISO 安装:分区、格式化、挂载(Btrfs 子卷布局)

C.1 进 Arch ISO 后先确认你在 UEFI 模式

BASH
  1. ls /sys/firmware/efi/efivars
  • 如果这个目录存在且有内容 → 你是 UEFI 启动
  • 如果没有 → 你用 legacy 启动了,回 BIOS 调整

C.2 联网(有线通常自动)

检查网络:

BASH
  1. ping -c 3 archlinux.org

Wi‑Fi(推荐 iwd 的 iwctl):

BASH
  1. iwctl
  2. # 进入交互后:
  3. # device list
  4. # station wlan0 scan
  5. # station wlan0 get-networks
  6. # station wlan0 connect "你的WiFi"

C.3 同步时间(安装中证书/镜像会用到)

BASH
  1. timedatectl set-ntp true

C.4 分区(示例:一块磁盘 /dev/nvme0n1)

先看磁盘:

BASH
  1. lsblk

cgdisk/fdisk 分区都可以。我用 cgdisk 举例(更直观)。

你需要至少两个分区:

  • EFI System Partition(ESP):512MB~1GB,FAT32
  • Linux filesystem:剩余全部,Btrfs
BASH
  1. cgdisk /dev/nvme0n1

建议分区方案:

  • /dev/nvme0n1p1:EFI System Partition
    • Size:1G
    • Type:EF00
  • /dev/nvme0n1p2:Linux filesystem(Btrfs)
    • Size:剩余全部
    • Type:8300

写入并退出。

C.5 格式化

EFI 分区:

BASH
  1. mkfs.fat -F32 /dev/nvme0n1p1

Btrfs 分区:

BASH
  1. mkfs.btrfs -f -L ArchRoot /dev/nvme0n1p2

C.6 创建 Btrfs 子卷(推荐布局)

先临时挂载根分区:

BASH
  1. mount /dev/nvme0n1p2 /mnt

创建子卷:

BASH
  1. btrfs subvolume create /mnt/@
  2. btrfs subvolume create /mnt/@home
  3. btrfs subvolume create /mnt/@var
  4. btrfs subvolume create /mnt/@snapshots

卸载:

BASH
  1. umount /mnt

C.7 以子卷方式重新挂载(带常用参数)

挂载根:

BASH
  1. mount -o subvol=@,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt

创建目录并挂载其他子卷:

BASH
  1. mkdir -p /mnt/{home,var,.snapshots,boot}
  2. mount -o subvol=@home,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt/home
  3. mount -o subvol=@var,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt/var
  4. mount -o subvol=@snapshots,compress=zstd:3,noatime /dev/nvme0n1p2 /mnt/.snapshots

挂载 EFI:

BASH
  1. mount /dev/nvme0n1p1 /mnt/boot

确认:

BASH
  1. findmnt -R /mnt

[0xD-PA]
D. pacstrap 安装系统(内核、固件、基础工具)

D.1 选内核

  • 想稳定:linux(官方)
  • 想更激进:linux-zen(延迟更低一些)

我建议先 linux,后面想换再换。

D.2 安装基本包

BASH
  1. pacstrap -K /mnt \
  2. base linux linux-firmware \
  3. btrfs-progs \
  4. nano vim \
  5. sudo \
  6. networkmanager \
  7. man-db man-pages \
  8. git curl wget \
  9. reflector \
  10. intel-ucode \
  11. base-devel

说明:

  • btrfs-progs:Btrfs 管理命令
  • networkmanager:图形环境/笔记本最省心
  • intel-ucode:Intel CPU 微码(AMD 则用 amd-ucode

D.3 生成 fstab

BASH
  1. genfstab -U /mnt >> /mnt/etc/fstab

检查一下:

BASH
  1. sed -n '1,200p' /mnt/etc/fstab

[0xE-CH]
E. chroot 内系统初始化(时区、locale、用户、sudo、网络)

进入新系统:

BASH
  1. arch-chroot /mnt

E.1 时区与时间同步

BASH
  1. ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  2. hwclock --systohc

E.2 语言与 locale(建议:系统中文 + 保留英文 LC_CTYPE 可选)

编辑 /etc/locale.gen

BASH
  1. nano /etc/locale.gen

取消注释(至少这两个):

SYSTEM_BUFFER
  1. en_US.UTF-8 UTF-8
  2. zh_CN.UTF-8 UTF-8

生成:

BASH
  1. locale-gen

设置默认语言:

BASH
  1. echo 'LANG=zh_CN.UTF-8' > /etc/locale.conf

我当前系统还会在 niri 的环境里单独设置 LC_CTYPE=en_US.UTF-8,这是为了避免部分程序在中文 locale 下字符分类/输入法行为怪异(可选)。

E.3 主机名与 hosts

BASH
  1. echo 'arch-niri' > /etc/hostname

编辑 /etc/hosts

BASH
  1. nano /etc/hosts

写入:

SYSTEM_BUFFER
  1. 127.0.0.1 localhost
  2. ::1 localhost
  3. 127.0.1.1 arch-niri.localdomain arch-niri

E.4 设置 root 密码

BASH
  1. passwd

E.5 创建普通用户(强烈建议)

BASH
  1. useradd -m -G wheel -s /bin/bash yourname
  2. passwd yourname

安装后你也可以换 fish,这里先别急。

E.6 sudo(让 wheel 组可 sudo)

BASH
  1. EDITOR=nano visudo

找到并取消注释:

SYSTEM_BUFFER
  1. %wheel ALL=(ALL:ALL) ALL

E.7 启用 NetworkManager

BASH
  1. systemctl enable NetworkManager

[0xF-SY]
F. 引导(systemd-boot)与微码(Intel/AMD)

F.1 安装引导

BASH
  1. bootctl install

F.2 配置 systemd-boot 条目

找到你的根分区 UUID:

BASH
  1. blkid | grep ArchRoot -n || true
  2. blkid /dev/nvme0n1p2

编辑 /boot/loader/entries/arch.conf

BASH
  1. nano /boot/loader/entries/arch.conf

写入(把 UUID 换成你自己的):

INI
  1. title Arch Linux (niri)
  2. linux /vmlinuz-linux
  3. initrd /intel-ucode.img
  4. initrd /initramfs-linux.img
  5. options root=UUID=YOUR-ROOT-UUID rootflags=subvol=@ rw quiet loglevel=3

再编辑 /boot/loader/loader.conf

BASH
  1. nano /boot/loader/loader.conf

建议:

INI
  1. default arch.conf
  2. timeout 3
  3. console-mode max
  4. editor no

[0xG-WA]
G. 图形栈:Wayland + niri + LightDM(可登录)

G.1 安装 niri 与 Wayland 必备组件

BASH
  1. pacman -S --needed \
  2. niri \
  3. xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-gnome \
  4. xwayland-satellite \
  5. qt5-wayland qt6-wayland \
  6. polkit-gnome

解释(你必须理解这些,不然以后会卡):

  • xdg-desktop-portal-*屏幕共享、截图 API、文件选择器、权限门户 的核心。没有它你会发现:OBS/浏览器共享屏幕失败。
  • xdg-desktop-portal-gnome:niri 在 Wayland 下录屏/共享屏幕常见选择。
  • xwayland-satellite:让 X11 应用在 Wayland 下跑(兼容层)。
  • polkit-gnome:GUI 提权认证代理(比如改网络、挂载等会弹窗)。

G.2 安装 LightDM + greeter

BASH
  1. pacman -S --needed lightdm lightdm-gtk-greeter
  2. systemctl enable lightdm

你也可以用 lightdm-slick-greeter,但先用 gtk greeter 最稳。

G.3 让 LightDM 显示 niri 会话

通常 niri-session 会安装一个桌面条目。如果没有,你可以手工创建。

检查:

BASH
  1. ls -la /usr/share/wayland-sessions | head

如果没有 niri:创建 /usr/share/wayland-sessions/niri.desktop

BASH
  1. nano /usr/share/wayland-sessions/niri.desktop

内容:

INI
  1. [Desktop Entry]
  2. Name=niri
  3. Comment=niri Wayland session
  4. Exec=niri-session
  5. Type=Application

[0xH-NV]
H. NVIDIA + Intel 混合显卡:驱动、prime-run、常见坑

这一节是笔记本/混合显卡的重点。目标是:

  • 桌面默认用核显(省电、安静)
  • 需要性能时再用独显(prime-run 启动特定程序)

H.1 安装驱动(两条路线)

路线 1:原生 Arch(推荐先走这条)

BASH
  1. pacman -S --needed nvidia nvidia-utils nvidia-settings
  2. pacman -S --needed nvidia-prime

说明:

  • nvidia-prime 提供 prime-run,最适合“按需独显”

路线 2:类似我当前系统(CachyOS 用的 nvidia-open)

在 CachyOS 上常见为 nvidia-open。原生 Arch 也能装,但策略/包名可能不同。

你如果明确要 nvidia-open按你发行版仓库为准(CachyOS 的包名就是 nvidia-open)。

H.2 基础验证

进入系统后(装完重启):

BASH
  1. nvidia-smi

能看到 GPU 型号、驱动版本、显存等即 OK。

H.3 用独显启动某个程序(核心用法)

例如:

BASH
  1. prime-run glxinfo | grep -i "OpenGL renderer"
  2. prime-run steam
  3. prime-run blender
  4. prime-run obs

你也可以边开程序边看:

BASH
  1. watch -n 1 nvidia-smi

H.4 Wayland 下的常见坑(你提前知道会省命)

  1. Portal 没装/没起来 → 共享屏幕失败
  • 解决:确保装了 xdg-desktop-portal-gnome,并且用户服务运行正常:
    BASH
    1. systemctl --user status xdg-desktop-portal --no-pager
  1. Xwayland 应用黑屏/输入异常
  • 解决:装 xwayland-satellite
  1. 独显常驻唤醒导致高功耗
  • 你如果不需要独显:别把所有程序都 prime-run。

[0xI-PI]
I. 音频:PipeWire 全家桶(含蓝牙音频)

BASH
  1. pacman -S --needed \
  2. pipewire pipewire-pulse pipewire-alsa \
  3. wireplumber \
  4. pavucontrol

启用一般自动(用户服务),验证:

BASH
  1. wpctl status
  2. pavucontrol

蓝牙(可选):

BASH
  1. pacman -S --needed bluez bluez-utils blueman
  2. systemctl enable --now bluetooth

[0xJ-FC]
J. 中文体验:字体、fcitx5、环境变量(Wayland 可靠方案)

J.1 安装字体(避免方块字 + emoji)

BASH
  1. pacman -S --needed \
  2. noto-fonts noto-fonts-cjk noto-fonts-emoji \
  3. ttf-jetbrains-mono-nerd

J.2 安装 fcitx5(中文)

BASH
  1. pacman -S --needed \
  2. fcitx5 fcitx5-gtk fcitx5-qt \
  3. fcitx5-chinese-addons fcitx5-configtool

J.3 环境变量(最关键,不设置会出现:部分软件没输入法)

建议写到 ~/.profile(Wayland 会话也会读):

BASH
  1. nano ~/.profile

加入:

BASH
  1. export GTK_IM_MODULE=fcitx
  2. export QT_IM_MODULE=fcitx
  3. export XMODIFIERS=@im=fcitx
  4. export INPUT_METHOD=fcitx
  5. export SDL_IM_MODULE=fcitx

重新登录后验证:

BASH
  1. echo $GTK_IM_MODULE
  2. fcitx5-diagnose | head -n 40

[0xK-FU]
K. 桌面生态:fuzzel、portal、截图、剪贴板、文件管理器

K.1 fuzzel(启动器)

BASH
  1. pacman -S --needed fuzzel
  2. mkdir -p ~/.config/fuzzel

我当前同款配置在后面会完整贴出(包含颜色主题 colors.ini)。

K.2 截图与剪贴板(常用组合)

BASH
  1. pacman -S --needed \
  2. grim slurp \
  3. wl-clipboard

截图到文件:

BASH
  1. grim ~/Pictures/Screenshots/test.png

截图到剪贴板(示例):

BASH
  1. grim -g "$(slurp)" - | wl-copy

K.3 文件管理器(Thunar + GVFS)

BASH
  1. pacman -S --needed thunar gvfs gvfs-mtp file-roller

[0xL-NI]
L. niri 配置:直接贴出我当前同款 config(可复制即用)

这一节是“复刻效果”的灵魂。你复制之后,重登 niri 就能获得:

  • 触摸板自然滚动/轻触
  • 鼠标禁加速(flat)
  • 动画参数
  • 圆角/裁剪
  • 自定义快捷键(包含:启动器、终端、截图、工作区管理等)
  • 光标主题
  • 输出(分辨率、缩放、双屏坐标)

L.1 准备目录

BASH
  1. mkdir -p ~/.config/niri/dms
  2. mkdir -p ~/.config/niri/shorin-niri

L.2 写入主配置 ~/.config/niri/config.kdl

说明:下面内容就是我当前系统同款(来自我机器的配置)。 你可以先原样粘贴跑起来,再按你的习惯改。

把下面整段保存到:~/.config/niri/config.kdl

KDL
  1. // This config is in the KDL format: https://kdl.dev
  2. // Check the wiki for a full description of the configuration:
  3. // https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction
  4. config-notification {
  5. disable-failed
  6. }
  7. gestures {
  8. hot-corners {
  9. off
  10. }
  11. }
  12. input {
  13. keyboard {
  14. xkb {
  15. // 留空时,niri 会从系统的 localectl 设置读取
  16. }
  17. }
  18. touchpad {
  19. tap
  20. natural-scroll
  21. }
  22. mouse {
  23. accel-profile "flat" // 关闭鼠标加速:使用“平坦”曲线(无加速度)
  24. }
  25. }
  26. layout {
  27. background-color "transparent"
  28. center-focused-column "never"
  29. preset-column-widths {
  30. proportion 0.33333
  31. proportion 0.5
  32. proportion 0.66667
  33. }
  34. default-column-width { proportion 0.5; }
  35. border {
  36. off
  37. width 4
  38. active-color "#707070"
  39. inactive-color "#d0d0d0"
  40. urgent-color "#cc4444"
  41. }
  42. shadow {
  43. softness 30
  44. spread 5
  45. offset x=0 y=5
  46. color "#0007"
  47. }
  48. struts {
  49. }
  50. }
  51. layer-rule {
  52. match namespace="^quickshell$"
  53. place-within-backdrop false
  54. }
  55. overview {
  56. workspace-shadow {
  57. off
  58. }
  59. }
  60. environment {
  61. // Qt theme
  62. QT_QPA_PLATFORMTHEME "gtk3"
  63. QT_QPA_PLATFORMTHEME_QT6 "gtk3"
  64. // fix quickshell icon theme missing
  65. QS_ICON_THEME "Adwaita"
  66. // locale / ime
  67. LC_CTYPE "en_US.UTF-8"
  68. XMODIFIERS "@im=fcitx"
  69. LANG "zh_CN.UTF-8"
  70. XDG_CURRENT_DESKTOP "niri"
  71. }
  72. hotkey-overlay {
  73. skip-at-startup
  74. }
  75. prefer-no-csd
  76. screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
  77. animations {
  78. workspace-switch {
  79. spring damping-ratio=0.80 stiffness=523 epsilon=0.0001
  80. }
  81. window-open {
  82. duration-ms 150
  83. curve "ease-out-expo"
  84. }
  85. window-close {
  86. duration-ms 150
  87. curve "ease-out-quad"
  88. }
  89. horizontal-view-movement {
  90. spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
  91. }
  92. window-movement {
  93. spring damping-ratio=0.75 stiffness=323 epsilon=0.0001
  94. }
  95. window-resize {
  96. spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
  97. }
  98. config-notification-open-close {
  99. spring damping-ratio=0.65 stiffness=923 epsilon=0.001
  100. }
  101. screenshot-ui-open {
  102. duration-ms 200
  103. curve "ease-out-quad"
  104. }
  105. overview-open-close {
  106. spring damping-ratio=0.85 stiffness=800 epsilon=0.0001
  107. }
  108. }
  109. window-rule {
  110. match app-id=r#"^org\.wezfurlong\.wezterm$"#
  111. default-column-width {}
  112. }
  113. window-rule {
  114. match app-id=r#"^org\.gnome\."#
  115. draw-border-with-background false
  116. geometry-corner-radius 12
  117. clip-to-geometry true
  118. }
  119. window-rule {
  120. match app-id=r#"^gnome-control-center$"#
  121. match app-id=r#"^pavucontrol$"#
  122. match app-id=r#"^nm-connection-editor$"#
  123. default-column-width { proportion 0.5; }
  124. open-floating false
  125. }
  126. window-rule {
  127. match app-id=r#"^gnome-calculator$"#
  128. match app-id=r#"^galculator$"#
  129. match app-id=r#"^blueman-manager$"#
  130. match app-id=r#"^org\.gnome\.Nautilus$"#
  131. match app-id=r#"^xdg-desktop-portal$"#
  132. open-floating true
  133. }
  134. window-rule {
  135. match app-id=r#"^steam$"# title=r#"^notificationtoasts_\d+_desktop$"#
  136. default-floating-position x=10 y=10 relative-to="bottom-right"
  137. open-focused false
  138. }
  139. window-rule {
  140. match app-id=r#"^org\.wezfurlong\.wezterm$"#
  141. match app-id="Alacritty"
  142. match app-id="zen"
  143. match app-id="com.mitchellh.ghostty"
  144. match app-id="kitty"
  145. draw-border-with-background false
  146. }
  147. window-rule {
  148. match app-id=r#"firefox$"# title="^Picture-in-Picture$"
  149. match app-id="zoom"
  150. open-floating true
  151. }
  152. window-rule {
  153. match app-id=r#"org.quickshell$"#
  154. open-floating true
  155. }
  156. debug {
  157. honor-xdg-activation-with-invalid-serial
  158. }
  159. recent-windows {
  160. binds {
  161. Alt+Tab { next-window scope="output"; }
  162. Alt+Shift+Tab { previous-window scope="output"; }
  163. Alt+grave { next-window filter="app-id"; }
  164. Alt+Shift+grave { previous-window filter="app-id"; }
  165. }
  166. }
  167. // Include DMS / Shorin modules
  168. include "dms/colors.kdl"
  169. include "dms/layout.kdl"
  170. include "dms/alttab.kdl"
  171. include "dms/binds.kdl"
  172. include "dms/outputs.kdl"
  173. include "dms/cursor.kdl"
  174. spawn-at-startup "dms" "run"
  175. spawn-at-startup "xhost" "+si:localuser:root"
  176. spawn-at-startup "fcitx5" "-d"
  177. spawn-sh-at-startup "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=niri & /usr/lib/xdg-desktop-portal-gnome"
  178. spawn-at-startup "~/.config/niri/shorin-niri/scripts/screenshot-sound.sh"
  179. include "shorin-niri/rule.kdl"
  180. include "shorin-niri/supertab.kdl"
  181. cursor {
  182. xcursor-theme "breeze_cursors"
  183. xcursor-size 30
  184. hide-after-inactive-ms 15000
  185. }
  186. include "dms/windowrules.kdl"

L.3 写入 DMS 相关 KDL(我当前同款)

注意:这些文件在我当前系统是 DMS 自动生成的。 你在 Arch 复刻时也可以先手工放进去,效果是一样的。

  1. ~/.config/niri/dms/outputs.kdl
KDL
  1. output "eDP-1" {
  2. mode "2560x1600@180.000"
  3. scale 1.25
  4. position x=0 y=0
  5. }
  6. output "DP-3" {
  7. mode "3440x1440@164.999"
  8. scale 1
  9. position x=2048 y=0
  10. }
  • eDP-1 是笔记本内屏常见名称,你可以在 niri 里执行:
    BASH
    1. niri msg outputs
    来确认你机器的实际名称。
  1. ~/.config/niri/dms/colors.kdl
KDL
  1. layout {
  2. background-color "transparent"
  3. focus-ring {
  4. active-color "#bcc2ff"
  5. inactive-color "#90909a"
  6. urgent-color "#ffb4ab"
  7. }
  8. border {
  9. active-color "#bcc2ff"
  10. inactive-color "#90909a"
  11. urgent-color "#ffb4ab"
  12. }
  13. shadow {
  14. color "#00000070"
  15. }
  16. tab-indicator {
  17. active-color "#bcc2ff"
  18. inactive-color "#90909a"
  19. urgent-color "#ffb4ab"
  20. }
  21. insert-hint {
  22. color "#bcc2ff80"
  23. }
  24. }
  25. recent-windows {
  26. highlight {
  27. active-color "#3b4279"
  28. urgent-color "#ffb4ab"
  29. }
  30. }
  1. ~/.config/niri/dms/layout.kdl
KDL
  1. layout {
  2. gaps 4
  3. border {
  4. width 2
  5. }
  6. focus-ring {
  7. width 2
  8. }
  9. }
  10. window-rule {
  11. geometry-corner-radius 12
  12. clip-to-geometry true
  13. tiled-state true
  14. draw-border-with-background false
  15. }
  1. ~/.config/niri/dms/alttab.kdl
KDL
  1. recent-windows {
  2. debounce-ms 750
  3. open-delay-ms 150
  4. highlight {
  5. padding 30
  6. corner-radius 12
  7. }
  8. previews {
  9. max-height 480
  10. max-scale 0.2
  11. }
  12. binds {
  13. Mod+Tab { next-window scope="workspace"; }
  14. Mod+Shift+Tab { previous-window scope="workspace"; }
  15. Mod+grave { next-window filter="app-id"; }
  16. Mod+Shift+grave { previous-window filter="app-id"; }
  17. }
  18. }
  1. ~/.config/niri/dms/cursor.kdl
KDL
  1. cursor {
  2. xcursor-theme "breeze_cursors"
  3. xcursor-size 24
  4. }
  1. ~/.config/niri/dms/windowrules.kdl
KDL
  1. layer-rule{
  2. match namespace="dms:blurwallpaper"
  3. place-within-backdrop true
  4. }
  5. window-rule {
  6. match app-id="imv"
  7. open-focused false
  8. open-floating true
  9. }
  10. window-rule{
  11. match app-id="shorinclip"
  12. default-column-width { fixed 625; }
  13. default-window-height { fixed 700; }
  14. open-floating true
  15. default-floating-position x=0 y=18 relative-to="top"
  16. }
  17. window-rule {
  18. match app-id="com.gabm.satty"
  19. match app-id="nm-connection-editor"
  20. match app-id=r#"google-chrome-stable$"# title="^Picture-in-Picture$"
  21. match app-id="steam" title="Friends List"
  22. match app-id="blueman-manager"
  23. match app-id="org.pulseaudio.pavucontrol" title="音量控制"
  24. match app-id="org.gnome.FileRoller"
  25. match app-id="thunar" title="文件操作进度"
  26. match title="聊天记录"
  27. match title="日历"
  28. match title="重命名"
  29. match title="另存为"
  30. open-floating true
  31. }
  32. window-rule {
  33. match app-id="quickterminal"
  34. open-floating true
  35. default-floating-position x=20 y=20 relative-to="top"
  36. }
  37. window-rule {
  38. match title="图片查看器"
  39. match title="画中画"
  40. match title="视频播放器"
  41. open-floating true
  42. opacity 1.0
  43. }
  44. window-rule {
  45. match app-id="mpv"
  46. match app-id="celluloid"
  47. opacity 1.0
  48. }
  49. window-rule {
  50. match app-id=r#"^org\.wezfurlong\.wezterm$"#
  51. default-column-width {}
  52. }
  1. ~/.config/niri/dms/binds.kdl

这个文件很长,我建议你先复制我这份,再慢慢删减成自己的。

把下面内容保存到:~/.config/niri/dms/binds.kdl

KDL
  1. binds {
  2. Mod+Shift+Slash hotkey-overlay-title="快捷键教程 Keybind tutorial" { show-hotkey-overlay; }
  3. Mod+F1 hotkey-overlay-title="开关输入法 Toggle fcitx" {spawn-sh "pkill fcitx5 || fcitx5 ";}
  4. Mod+Slash hotkey-overlay-title="临时终端 Quick Terminal" {spawn "kitty" "--single-instance" "--class" "quickterminal";}
  5. Mod+B hotkey-overlay-title="浏览器 Browser" { spawn "google-chrome-stable"; }
  6. Mod+T hotkey-overlay-title="终端 Terminal" { spawn "kitty" "--single-instance"; }
  7. Mod+E hotkey-overlay-title="文档管理器 Filemanager" { spawn-sh "thunar || env GSK_RENDERER=gl GTK_IM_MODULE=fcitx nautilus"; }
  8. Mod+Z hotkey-overlay-title="程序菜单 Applauncher" { spawn-sh "dms ipc call spotlight toggle || fuzzel"; }
  9. Mod+O hotkey-overlay-title="切换总览界面 toggle overview" repeat=false { toggle-overview; }
  10. Mod+Q hotkey-overlay-title="关闭聚焦窗口 Close focus window" repeat=false { close-window; }
  11. Alt+F4 repeat=false { close-window; }
  12. Mod+Left { focus-column-left; }
  13. Mod+Down { focus-window-down; }
  14. Mod+Up { focus-window-up; }
  15. Mod+Right { focus-column-right; }
  16. Mod+H { focus-column-left; }
  17. Mod+J { focus-window-down; }
  18. Mod+K { focus-window-up; }
  19. Mod+L { focus-column-right; }
  20. Mod+R hotkey-overlay-title="按预设切换宽度 Switch width" { switch-preset-column-width; }
  21. Mod+V hotkey-overlay-title="切换浮动 Toggle floating" { toggle-window-floating; }
  22. Print {spawn-sh "niri msg action screenshot --show-pointer false";}
  23. Mod+Shift+E hotkey-overlay-title="退出niri Quit niri" { quit; }
  24. // 工作区 1-9
  25. Mod+1 { focus-workspace 1; }
  26. Mod+2 { focus-workspace 2; }
  27. Mod+3 { focus-workspace 3; }
  28. Mod+4 { focus-workspace 4; }
  29. Mod+5 { focus-workspace 5; }
  30. Mod+6 { focus-workspace 6; }
  31. Mod+7 { focus-workspace 7; }
  32. Mod+8 { focus-workspace 8; }
  33. Mod+9 { focus-workspace 9; }
  34. Mod+Ctrl+1 { move-column-to-workspace 1; }
  35. Mod+Ctrl+2 { move-column-to-workspace 2; }
  36. Mod+Ctrl+3 { move-column-to-workspace 3; }
  37. Mod+Ctrl+4 { move-column-to-workspace 4; }
  38. Mod+Ctrl+5 { move-column-to-workspace 5; }
  39. Mod+Ctrl+6 { move-column-to-workspace 6; }
  40. Mod+Ctrl+7 { move-column-to-workspace 7; }
  41. Mod+Ctrl+8 { move-column-to-workspace 8; }
  42. Mod+Ctrl+9 { move-column-to-workspace 9; }
  43. }

说明:我当前系统的 binds 还有 DMS 的媒体键、亮度键、电源菜单、壁纸切换、剪贴板等整套绑定。 你如果也装了 DMS(见后文),可以把完整版本加回去。

L.4 写入 Shorin 模块(supertab)

~/.config/niri/shorin-niri/supertab.kdl

KDL
  1. recent-windows {
  2. debounce-ms 750
  3. open-delay-ms 150
  4. highlight {
  5. padding 30
  6. corner-radius 12
  7. }
  8. previews {
  9. max-height 480
  10. max-scale 0.2
  11. }
  12. binds {
  13. Mod+Tab { next-window scope="workspace"; }
  14. Mod+Shift+Tab { previous-window scope="workspace"; }
  15. Mod+grave { next-window filter="app-id"; }
  16. Mod+Shift+grave { previous-window filter="app-id"; }
  17. }
  18. }

~/.config/niri/shorin-niri/rule.kdl 你可以先留空(不影响启动),后续再加规则。

[0xM-DP]
M. 美化细节:DPI、圆角、阴影、光标、GTK 主题、图标

M.1 DPI/缩放(非常影响“像不像高级桌面”)

你会发现同样的桌面:

  • 不做缩放 → 字体太小/太大
  • 乱做缩放 → 模糊/比例怪

niri 输出缩放在 outputs.kdl 里:

  • 内屏 2K/2.5K:常见 scale 1.25
  • 外接 3440×1440:常见 scale 1

你一定要用 niri msg outputs 看你真实输出名,然后改对。

M.2 光标主题(我当前用 Breeze)

安装:

BASH
  1. pacman -S --needed breeze

niri 里已设置:

KDL
  1. cursor {
  2. xcursor-theme "breeze_cursors"
  3. xcursor-size 30
  4. }

M.3 GTK 主题与图标(让应用统一)

建议:

BASH
  1. pacman -S --needed \
  2. nwg-look \
  3. adw-gtk3 \
  4. papirus-icon-theme

打开 nwg-look

  • GTK theme:adw-gtk3-dark
  • Icons:Papirus-Dark
  • Font:Noto Sans CJK SC

这是我认为“少折腾但很体面”的组合。

[0xN-BT]
N. Btrfs + Snapper:自动快照、更新前后快照、清理策略

N.1 安装 snapper + 自动与 pacman 联动

BASH
  1. pacman -S --needed snapper snap-pac

N.2 创建 root 配置(如果你还没有)

BASH
  1. snapper list-configs

没有 root 就创建:

BASH
  1. snapper -c root create-config /

N.3 启用时间线快照与清理

BASH
  1. systemctl enable --now snapper-timeline.timer
  2. systemctl enable --now snapper-cleanup.timer

N.4 养成习惯:大更新前手动拍一张

BASH
  1. sudo snapper -c root create --description "before update"

[0xO-]
O. 常用软件清单(稳定优先)

BASH
  1. pacman -S --needed \
  2. firefox \
  3. mpv \
  4. obs-studio \
  5. unzip p7zip unrar \
  6. btop fastfetch \
  7. ripgrep fd

游戏(可选):

BASH
  1. pacman -S --needed steam

用独显启动:

BASH
  1. prime-run steam

[0xP-SO]
P. 故障排查:你遇到问题时按这个 SOP 走

P.1 进不去桌面/黑屏

  1. 先在 TTY(Ctrl+Alt+F2)登录
  2. 看显示管理器:
BASH
  1. systemctl status lightdm --no-pager
  2. journalctl -u lightdm -b --no-pager | tail -n 200
  1. 看 niri 自身日志(如果有):
BASH
  1. journalctl --user -b --no-pager | grep -i niri | tail -n 200

P.2 共享屏幕/录屏不工作

99% 是 portal。

BASH
  1. systemctl --user status xdg-desktop-portal --no-pager
  2. systemctl --user status xdg-desktop-portal-gnome --no-pager

P.3 NVIDIA 驱动异常

BASH
  1. nvidia-smi
  2. journalctl -b | grep -iE 'nvidia|drm' | tail -n 200

Status

VERIFIED_ARCHIVE

Integrity

ECC_CHECK_PASS

Checksum

ADDR_A16EBB69DE32

Helpful?

Give it a star!