Nix 是 NixOS 的包管理器,而在非 NixOS 下也可以使用它,也即它具有跨发行版的特性,理论上能够非常方便地在各发行版上搭建相同或相似的环境配置。
理想很美好,但当我真的入门了 Nix 语言(顺手重写了 NixOS 中文社区的《Nix 语言快速入门》),且在 Debian 上实践了 Home-manager 之后,我踩的坑越来越多。
根据我在 Arch 与 Debian 下安装使用 Nix 的经历,目前发现的坑包括但不限于:
安装 Nix
(基本已解决)
无论是使用 Nix 官方的安装脚本,还是 Arch Linux 打包好的 Nix,都会出现一旦安装失败就很难清理干净的问题(不清理干净是无法再次尝试安装的),尤其是因为这个过程涉及大量创建更改系统的用户与组的配置,如果没有做好系统快照的话,回退起来相当麻烦。
目前我已知的唯一解是使用基于 Determinate nix-installer 的实验性的 NixOS/experimental-nix-installer。
所谓 Determinate Nix 是基于 Nix 的一个项目,它的安装器比较稳健,本来也支持安装上游的 Nix,但据 Dropping upstream Nix from Determinate Nix Installer,对上游 Nix 的安装支持将会被取消;而 Nix 社区基于它的复刻 NixOS/experimental-nix-installer 最近才报过一次 404,也不够稳定,所以这个问题暂时只能算做基本解决。
GPU 加速
(基本解决?)
由 Home-manager 安装的包无法直接调用 opengl、vulkan 以便利用 GPU 加速,而是需要 NixGL,但 NixGL 以 opengl 作为后端时性能很差,若以 Nvidia 等作为后端则必须指定 --impure(会降低构建的可复现性),并且我实际测试的时候即使指定了 --impure 也还是会报错(可能是我配置的问题,暂未解决)。
更新:
25.05 实测无效,但是从 25.05 升到 25.11 就可以了。
更新:但是 Hyprland + Nvidia 在这个配置下还是无法启动,报错 EGL: failed to initialize a platform display;也有可能是 Nvidia 驱动本身有问题。已经试过 hyprland wiki 给出的针对 Nvidia 的说明。
PAM 验证
(暂未解决)
使用 Home-manager 安装的程序在调用 PAM 时会失败,典型的是锁屏程序例如 swaylock,如果是用 Home-manager 安装的,即使密码正确也无法解锁。这个问题似乎可以得到解决,但仍未正式实现,见相关讨论。
对由 DM 启动的图形环境启用 Nix
(已解决)
安装 Nix 之后,在 /etc/zshrc 等 shell 的配置中会有:
if [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then
. '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'
fi
如果你的图形环境不是从 tty 启动而是从 DM 启动的,可能不会读取这个配置,导致由 Nix 安装的应用与二进制文件仅在 Shell 中可用,而在应用启动器中不可见或不可用。
这种情况下,你需要以某种方法把它加入到图形环境的启动流程中。例如,对于 KDE Plasma,可以创建一个 ~/.config/plasma-workspace/env/00nix.sh 并填入上述配置。
Joplin 调用的外部编辑器无法正常访问 /usr
(暂未解决)
Joplin 是一个主要基于 Markdown 的跨平台自由开源笔记软件。实测使用 Home-manager 安装 joplin-desktop,在 Joplin 中将 Emacs 作为外部编辑器打开时,Emacs 会报错:Error (use-package): tex/:catch: Searching for program: No such or directory, /usr/bin/zsh(类似地,在尝试复制时也找不到 wl-copy)。
我的 Emacs 配置里没提到 zsh,所以这个大概是读取了用户的默认 Shell;并且在我的系统中并未使用 Home-manager 来安装 Zsh。然而,在系统中 /usr/bin/zsh 是实际存在的。
经排查发现,Joplin 在调用外部编辑器时,/usr 作为挂载点实际指向 /nix/store/<HASH>-joplin-desktop-<VERSION>-fhsenv-rootfs/usr(让 Joplin 调用外部脚本,由 cat /proc/self/mountinfo 即可得知此信息),而这个 /usr 中不含有原本的 /usr/bin/zsh,却含有大量指向 /nix/store 的软链接。
目前我已改用 AppImage 版本的 Joplin,此问题不再出现,可见这确实是由 Home-manager 安装的 Joplin 的问题。
总之,有过类似想法(即,用 Nix 代替系统包管理器,来安装除了 kernel、bootloader 这种底层的包以外的几乎所有包)的朋友们建议慎重考虑在非 NixOS 上使用 Nix。
另:我注意到 Guix 官网 似乎比较强调 Guix 在非 Guix 发行版上的使用:
您可在任意 GNU/Linux 发行版上安装 Guix,与原系统包管理器并行不悖,互不冲突。
因此,Guix 可能不存在 Nix 的上述这些问题?