NixOS 上首次配置 Clash 系客户端:flake、home-manager 与 systemd 用户自启分步(2026)
在 NixOS 这类声明式、可复现的系统上,用户常希望用 flake 与 home-manager 管理桌面与守护进程,而不是在 /etc 里随手改完就忘。与此同时,Mihomo(Clash Meta 系核心)与各类 Clash 兼容图形客户端仍要处理订阅导入、可写配置目录与开机/登录自启。站内已有 Ubuntu、Debian、Arch 等传统发行版分步文,但缺少专门命中「NixOS 代理、Nix 包、immutable」检索意图的条目。本文按「flake 骨架 → home-manager 装包与落盘配置 → systemd --user 用户单元 → 订阅与更新工作流 → 常见坑」写一版可对照实施的路线图。
本文适合谁、读完能做什么
适合已经能编辑 flake.nix、用 nixos-rebuild 或 home-manager switch 切换一代配置,但还没把 Clash 系组件完全纳入声明式管理的读者。读完你可以:在 nixpkgs 中选用 mihomo 等核心包或图形前端(若频道提供);用 home-manager 把二进制路径与用户级 systemd写进同一代推导;把订阅与本地 YAML放在家目录下可写路径,避免误把可变数据塞进只读的 /nix/store;理解为何 ExecStart 必须指向当前代际的 store 路径或由包装脚本固定入口。
若你更关心「订阅链接为什么失效、如何更新」这类共性问题,可先读订阅链接那些事;需要对比 Meta 与 Premium 内核取舍,可对照内核对比文。图形客户端的日常安装包仍建议优先从本站下载页获取,与「用 Nix 管理上游制品」两条路径可以并存。
为什么 NixOS 场景要单独拆一篇
传统发行版教程默认「下载 deb/AppImage → 路径在 /usr 或家目录 → systemd 写死某一绝对路径」即可。NixOS 上可执行文件通常在带哈希的 /nix/store/… 路径下,升级一代 nixpkgs 后路径会变;若把旧路径硬编码进单元文件却不随配置重载,就会出现「升级后服务静默失败」。另一方面,根分区声明式并不意味着你不能写 ~/.config,而是要把可变状态与纯声明片段分开,避免把订阅缓存、运行日志当成「可以进 git 的静态文件」。
单独写 NixOS,还能命中「flake home-manager 代理、Nix Mihomo」等长尾词,并与站内 Linux 发行版专文互链对照:同样使用 systemd --user,但包的来源与更新方式完全不同。
总路线图:flake、home-manager 与 systemd 用户实例
推荐心智模型分三层:① 系统层(可选)用 NixOS 模块挂全局依赖、内核参数或 TUN 相关能力;② 家目录层用 home-manager 声明「装哪些包、哪些配置文件由 Nix 生成、哪些目录保留给用户态工具写」;③ 会话层用 systemd --user 在登录后拉起 Mihomo 或 GUI 客户端。多数桌面用户只需 ②+③ 就能跑通;只有当你确定 TUN、路由或权限与系统级服务绑定时,才需要回到 ① 写 configuration.nix。
下文示例以「home-manager 作为 flake 的 homeConfigurations」为主,与官方文档常见结构一致;若你仍用「NixOS 模块内嵌 home-manager」的旧式写法,只要把同名选项嵌进对应块即可,核心选项名不变。
第一步:flake 输入与 home-manager 入口
在 flake.nix 中通常需要两个输入:nixpkgs 与 home-manager,并在 outputs 里为每个用户名暴露 homeConfigurations.<user>。选择 nixpkgs 的 branch(如 nixos-unstable 或跟随你系统的 release)会直接影响 mihomo、clash-verge-rev 等 attr 是否可用及版本新旧,这是 Nix 用户最常需要自觉对齐的一点。
完成 home-manager switch --flake .#你的配置名 能无报错通过后,再继续叠加代理相关模块,避免把网络问题与 Nix 语法问题搅在一起。首次切换前建议确认本机时间、TLS 与 DNS 正常,否则拉取 flake 输入就会失败,与 Clash 无关。
第二步:把 Mihomo(Clash Meta 系核心)装进 home.packages
在 nixpkgs 中,面向 Clash Meta 系的后端实现常以 pkgs.mihomo 提供(名称与上游重品牌一致;旧资料里的 clash-meta 指同一生态)。在 home.nix 中写 home.packages = [ pkgs.mihomo ]; 即可把可执行文件带入当前用户的 PATH,版本随你锁定的 nixpkgs 一代更新。
若你还需要命令行辅助工具或规则集下载器,可一并放入同一列表;但不要在这里面混入「应在运行时生成的密钥或机场专属 URL」,那些更适合由你在不纳入版本库的本地文件或 sops-nix 等方案管理。
第三步:配置目录、订阅导入与「可写家目录」原则
Mihomo通常读取某工作目录下的 config.yaml(具体以你使用的分支文档为准)。在 Nix 里你有两条常见路线:A. 完全由 home-manager 的 xdg.configFile 生成静态片段,订阅 URL 用占位符,真实密钥本地覆盖;B. 仅声明目录与权限,把完整配置交给图形客户端或上游转换工具写入 ~/.config/mihomo 一类路径。
订阅导入的本质是把远程 HTTPS 订阅拉取为本地规则与节点列表;在声明式系统上,请把「会被客户端频繁改写」的文件放在家目录,而不是用 environment.etc 映射成只读。否则每次客户端更新订阅都会失败,或你需要反复 sudo 与重建,失去 Nix 工作流的意义。
若你使用图形前端导入订阅,注意前端自己的配置路径与核心二进制是否指向同一代 Mihomo;混用不同通道安装的二进制,最容易出现「界面能开、内核版本与规则特性不一致」的隐性问题。需要自定义分流时,可延伸阅读自定义规则教程。
第四步:用 home-manager 声明 systemd 用户服务
与 Debian 文里手写 ~/.config/systemd/user/*.service 等价,home-manager 提供 systemd.user.services 选项,把单元文件生成到用户级配置中。关键是 ExecStart:应使用 ${pkgs.mihomo}/bin/mihomo 这类由 Nix 展开的路径,并在参数里指定 -d 到你的可写配置目录。
下面是一段结构示意(请把目录名、服务名与本机用户名对齐后再切换):
# home.nix fragment — illustrative only
{ pkgs, ... }:
{
systemd.user.services.mihomo = {
Unit = {
Description = "Mihomo (Clash Meta-like core) user daemon";
After = [ "graphical-session-pre.target" ];
};
Service = {
ExecStart = "${pkgs.mihomo}/bin/mihomo -d %h/.config/mihomo";
Restart = "on-failure";
RestartSec = "5s";
};
Install = { WantedBy = [ "default.target" ]; };
};
}
切换后使用 systemctl --user daemon-reload 与 systemctl --user enable --now mihomo.service 验证;日志用 journalctl --user -u mihomo.service -e。若你同时在桌面「自动启动」里再勾一份 GUI,可能双开争用同一端口,与 Debian/Arch 文强调的问题相同,只保留一种自启方式更稳。
图形客户端:nixpkgs、FHS 环境与 AppImage 的取舍
部分 Clash 兼容 GUI 已进 nixpkgs,可用 home.packages 直接安装;是否启用 TUN、能否一键写入系统代理,仍取决于具体包维护者的打包方式与你的桌面会话。若你使用 AppImage 或官方二进制,往往需要 FHS 用户环境(如 appimage-run、steam-run 一类兼容层)才能在 NixOS 上正常动态链接;这与传统发行版「下载即可执行」的体验不同,遇到「缺库、沙箱拒绝」要先对照 NixOS Wiki 的通用打包说明,而不是急着改代理规则。
无论你用哪种前端,都建议先确认非 TUN 场景下浏览器能稳定走代理,再开 TUN 做全局接管;TUN 与 DNS、fake-ip 的耦合可参考TUN 模式深度解析。
更新工作流:nixpkgs、flake lock 与订阅刷新
系统与应用的版本升级遵循 Nix 的节奏:nix flake update 或 bump nixpkgs 输入后,再 home-manager switch。这会把 Mihomo 二进制切到新 store 路径,而你的 systemd 单元若使用 ${pkgs.mihomo} 占位符,会随代际自动对齐,避免手动改路径。
订阅导入的刷新仍由客户端或核心的内置调度完成;声明式配置只管「装什么版本、服务怎么起」。不要把「机场 URL 变更」与「nixpkgs 版本变更」混在同一套 git 提交里,除非你明确希望把订阅也纳入密钥管理方案。
常见坑与建议排查顺序
服务起不来、日志提示找不到文件:先核对 -d 目录是否存在、权限是否为当前用户,再看配置名是否为 config.yaml(或你使用分支的约定名)。
升级 nixpkgs 后旧单元仍指向不存在路径:说明单元不是由 Nix 生成而是手工复制的老文件;删掉手工单元,改由 home-manager 重新生成并 daemon-reload。
TUN 打开后全站 DNS 失败:先关 TUN,回到系统代理或手动代理验证,再对照 DNS 与规则顺序;与发行版无关的共性部分仍按TUN 文处理。
只想快速对比传统发行版步骤:可平行阅读 Ubuntu 24.04 与 Arch 专文,把其中「包管理器换源」段落映射成「nixpkgs 频道」,把「apt/yay」映射成「home-manager/NixOS 模块」。
合规与边界说明
请在你有权使用的网络与设备上部署代理工具,遵守当地法律法规与服务条款。本文仅讨论在自管 NixOS 主机上,用声明式工具装配Clash 兼容组件与systemd --user自启的通用步骤,不构成对任何具体商用订阅源的建议或背书。
小结
在 NixOS 上首次跑通 Clash 系栈,关键是把「Nix 包与用户服务」写进 flake + home-manager,把「订阅导入与运行时缓存」留在可写家目录,并用 ${pkgs.mihomo} 这类绑定避免 store 路径漂移。相比在论坛碎片帖里复制粘贴过时路径,声明式配置一旦写对,升级与回滚都更可预期。
相比其他发行版上一键安装的体验,Nix 的前置学习成本更高,但长期可维护性往往更好;若你还需要跨平台图形客户端作对照,可从本站 下载页 获取安装包,并配合 总览教程 建立固定排错顺序。若你尚未安装客户端,可从本站开始:→ 立即免费下载 Clash,开启流畅上网新体验。