今日记录:在NixOS上符号链接点文件
摘要
一位开发者分享了在NixOS上使用systemd-tmpfiles符号链接点文件的技巧,无需依赖home-manager或其他工具。
<header>
<h1>今日记录:在NixOS上符号链接点文件</h1>
<time class="meta" datetime="2026-05-21">May 21, 2026</time>
</header>
<p>在NixOS上管理点文件的标准答案是
<a href="https://github.com/nix-community/home-manager">home-manager</a>。我从未使用过它,原因有两个审美和一个实用性异议:</p>
<ul>
<li>
我避免依赖,特别是在 nix 中,它在依赖管理的方法数量上与 Python 相媲美。
</li>
<li>
home-manager 仅为当前用户安装包,这在非NixOS系统上是有意义的。但在单用户桌面系统上,我更喜欢只有一套包。
</li>
<li>
将点文件的真实来源放在 nix store 中需要重建系统才能更改配置,这妨碍了类似 Emacs 风格的直接调整。
</li>
</ul>
<p>我喜欢的方法是将点文件与 <code>flake.nix</code> / <code>configuration.nix</code> 存储在同一个仓库中,并在原地创建符号链接。</p>
<p>这里的问题是,NixOS 似乎没有一种“原生”方式来声明 <code>/a/b/c</code> 应该是 <code>/c/d/e</code> 的符号链接。或者有吗?</p>
<p>如果你<a href="https://search.nixos.org/options?query=symlink">搜索 symlink 选项</a>,你会了解到
<a href="https://search.nixos.org/options?query=environment.etc#show=option%253Aenvironment.etc"><code>environment.etc</code></a>,它允许你配置符号链接,但仅限于 <code>/etc</code> 中的内容,而不是你的 <code>~/.config</code>。</p>
<p>对于后者,你可以使用 <a href="https://www.gnu.org/software/stow/">gnu stow</a> 或其他点文件链接管理器,但仅管理符号链接的问题的复杂性并不值得再添加一个依赖。<a href="https://github.com/matklad/config/blob/346afb44f0cc50a04b8e7008ab389a90a1dfdd0f/xtool/src/autostart.rs#L75-L105">手动处理</a>也可以。</p>
<p>但是,如果你的系统声明式配置框架允许你声明式地配置符号链接,那不是很好吗?事实证明,这是可能的,以一种迂回的方式。名不副实的
<a href="https://www.man7.org/linux/man-pages/man8/systemd-tmpfiles.8.html">systemd-tmpfiles</a> 允许从声明式配置创建符号链接,而你可以使用 NixOS 来
<a href="https://search.nixos.org/options?channel=25.11&query=systemd.tmpfiles.rules">配置</a>
<code>systemd-tmpfiles</code> 本身(感谢 <a href="https://discourse.nixos.org/t/managing-config-files-why-not-use-mkoutofstoresymlink-for-everything/77643/21">Noobz</a>!)。</p>
<p>例如,如果我想将 <code>~/dotfiles/git/config</code> 符号链接到 <code>.config/git/config</code>:</p>
<figure class="code-block">
<pre><code><span class="line">{</span>
<span class="line"> systemd.tmpfiles.<span class="hl-attr">rules</span> = [</span>
<span class="line"> <span class="hl-string">"L+ /home/matklad/.config/git/config - - - - /home/matklad/dotfiles/git/config"</span></span>
<span class="line"> ];</span>
<span class="line">}</span></code></pre>
</figure>
<p>目前对此方法与定制脚本或<a href="https://github.com/feel-co/smfh">更专门设计的工具</a>相比如何没有意见。</p>
查看缓存全文
缓存时间: 2026/05/22 08:51
# TIL:NixOS 配置文件的符号链接
来源:https://matklad.github.io/2026/05/21/symlinking-nixos-dotfiles.html
2026年5月21日
在 NixOS 上管理 dotfiles 的标准答案是 home-manager(https://github.com/nix-community/home-manager)。我从未使用过它,原因有两个审美上的和一个实际上的:
- 我尽量避免依赖,尤其是在 Nix 中——它在依赖管理方法的数量上堪比 Python。
- home-manager 仅为当前用户安装包,这在非 NixOS 系统上合理。但在单用户桌面系统上,我更喜欢只有一套全局包。
- 将 dotfiles 的权威源头放在 Nix store 中意味着修改配置需要重建系统,这会妨碍 Emacs 风格的那种直接调式。
我喜欢的方法是将 dotfiles 与 `flake.nix` / `configuration.nix` 存放在同一个仓库中,然后通过符号链接让它们就位。
问题在于,NixOS 似乎没有一种“原生”的方式来说“/a/b/c 应该是 /c/d/e 的符号链接”。或者真的有?
如果你在选项中搜索 symlink(https://search.nixos.org/options?query=symlink),会了解到 `environment.etc`(https://search.nixos.org/options?query=environment.etc#show=option%253Aenvironment.etc),它允许你配置符号链接,但仅限于 `/etc` 下的内容,而无法用于 `~/.config`。
对于后者,你可以使用 gnu stow(https://www.gnu.org/software/stow/)或其它 dotfile 链接管理器,但“仅仅”管理符号链接这个问题的复杂度并不值得再引入一个依赖。手动处理(https://github.com/matklad/config/blob/346afb44f0cc50a04b8e7008ab389a90a1dfdd0f/xtool/src/autostart.rs#L75-L105)就可以了。
但若能通过这个声明式系统配置框架来声明式地管理符号链接,岂不美哉?事实上,通过一种迂回的方式这是可能的。名字有点误导人的 systemd-tmpfiles(https://www.man7.org/linux/man-pages/man8/systemd-tmpfiles.8.html)允许通过声明式配置创建符号链接,而你可以用 NixOS 来配置(https://search.nixos.org/options?channel=25.11&query=systemd.tmpfiles.rules)`systemd-tmpfiles` 本身(感谢 Noobz(https://discourse.nixos.org/t/managing-config-files-why-not-use-mkoutofstoresymlink-for-everything/77643/21)!)。
例如,如果我想将 `~/dotfiles/git/config` 符号链接到 `.config/git/config`:
```
{
systemd.tmpfiles.rules = [
"L+ /home/matklad/.config/git/config - - - - /home/matklad/dotfiles/git/config"
];
}
```
目前还没有关于这种方法与自定义脚本或更专门的工具(https://github.com/feel-co/smfh)相比孰优孰劣的定论。
相似文章
我喜欢的 NixOS 声明式安装方式
一份关于使用 nixos-anywhere 等工具通过网络声明式安装 NixOS 的指南,重点强调在版本控制下管理配置文件。
NNN Stack: NixOS, Niri, Noctalia
NNN Stack 结合了 NixOS、Niri 组合器和 Noctalia shell,创建了一个声明式、可滚动且可复现的桌面环境,并邀请用户贡献他们的 dotfiles。
将我的 NAS 从 CoreOS/Flatcar Linux 迁移到 NixOS
Michael Stapelberg 详细介绍了他将一台 NAS 从 CoreOS/Flatcar Linux 迁移到 NixOS 的过程,涵盖了从 Docker 容器逐步过渡到原生 NixOS 模块的步骤,并附有实际示例。
使用Nix的开发环境:四个快速示例
本教程演示了使用Nix设置开发环境的四种方法,包括交互式一次性使用、配置文件以及密封的Nix Flakes,并以GoCV和OpenCV为例。
使用sops-nix在NixOS上管理机密
使用sops-nix在NixOS配置中管理机密的指南,涵盖设置、加密以及与Samba等服务的集成。