NixOS: 选择与放弃

 Linux  Nix  NixOS 󰈭 2721字

偶然听说了NixOS, 其万物皆配置文件的理念深深地吸引了我. 由于Arch下的pacman对于系统的监控总是不够地完全, 完全可能出现安装的某个包被卸载后一些配置/数据文件遗留在本机(经过测试, pacman -Rsun并不行, 后续考虑结合pacman -Ql写一些钩子函数), 或者是我修改了若干位于/etc/目录下的文件但这些修改并不会被包管理器追踪, 这极大地造成了系统状态的不确定性(冗余垃圾+不可复现). 因此, NixOS的理念从一开始就极大地吸引了有一些系统洁癖的我.

折腾了大概3 5天的配置在这里: <rqdmap/NixOS: NixOS configuration.>

能和原本的arch长得差不太多, 不过dm用的是lightdm, 貌似会默认给上一张背景图; 其实具体内部很多都是残缺的.

最后为什么放弃了呢?

最为直接的原因在于: Nvidia fook you.. 在NixOS中对于英伟达显卡的支持并不如Arch, 默认虽然采用的是nouveau开源驱动, 但是经过测试, 使用开源驱动在多显示屏下有问题. 显卡直连的hdmi端口所在的屏幕无法展示窗口, 我不用冻结(freeze)一词的原因是, 鼠标滑过去可以正常显示, 使用bspc新建desktop并打开窗口都能正常进行, 除了在外接显示屏上不显示任何窗口罢了(不仅是bspwm下的窗口, polybar也不显示)! 必须切换到nvidia闭源驱动才能正常显示, 不过如果使用闭源驱动则会带来在Arch上一样的问题: 无法优雅地做optimus了, 笔记本内置的屏幕通常就会烂掉而无法检测到.

由于我已经完完全全受够了再调试nvidia相关的问题一秒, 所以昨天发现这个问题出现后, 第一反应已经不是去如何修了, 而是直接run了.

另外还有一些发现的问题, 一个是NixOS不如Arch纯粹. 一个最显然的地方是, 当我在nix配置文件中仅仅写入差不多是xserver.enable = true这样一条简单的指令后, 再次重新生成系统后竟然可以直接boot进一个系统! 同时其拥有lightdm显示管理器, 拥有notify, 以及拥有许多我根本没有显示声明在配置文件中的内容! 众所周知, 使用非KDE/GNOME等DE套件时, 配置一套桌面环境是极为复杂. 你需要自己挑选包括dm, composer, wm等多个组件自行组装出自己的桌面, 不过nixos的做法貌似是过于用户友好了. 谁也不知道他到底在后面偷偷装了哪些默认的软件依赖! 另外就是当尚未启用X时, 其也会预装诸如NetworkManager这样软件, 不能说这样的做法不好, 因为这类软件通常是必须的. 不过这说明了在配置文件中可能只是简单的一句声明, nixos就会自顾自地给你塞一堆软件. 这样的做法作为一个KISS的Arch用户来说是不能接受的.

另一个问题是过于严苛的配置文件的管理. 我所希望的系统是这样的:

  • 用户可以随意的修改任何系统配置/家目录的用户配置, 包管理器/系统会帮我跟踪记录这些配置的变化情况.

  • 只有经过显式说明的软件包及其相关的数据/配置会被持久化保存在系统中, 不然我随时可以通过若干指令将系统还原到安装无用软件之前的状态.

  • 我可以通过若干指令一键保存&部署当前系统的所有环境(包括各类软件包以及各类配置文件, 而有关与log,cache等内容则可以酌情删除)

通常使用nixos都会使用home-manager, 其功能是使用nix管理每个用户的配置文件. 不过就我体验下来, nixos以及home-manager给我的感觉更像是一个类似iso格式的只读挂载的感觉.. 比如htop, fcitx5, 如果我将预定义的配置文件存放在/etc/nixos/..中, 通过nixos构建体系挂载到相应的用户目录下, 此后我无法再修改该配置文件! 如果我希望可持久的修改, 我必须在/etc下修改对应的文件, 再重新生成系统! 当以用户运行时如果想在htop里改一个参数, 或者像fcitx5每次切换输入法都会写一遍相应的配置文件, 这些都不行! 可能需要奇技淫巧来处理这些问题, 不确定<Impermanence - NixOS Wiki>所对应的内容是否会有帮助, 不过目前来说, 我还没想好怎么样能够优雅地解决.

NixOS可以说基本能够满足后两项要求, 但是对于第一项来说表现不佳. 这导致其不像是一个用户自用的桌面系统了, 而更像是一个ISO镜像系统了!

此外, nixos除了/boot以及/nix文件夹, 其余的目录都是动态生成的软连接. 这也导致一些应用程序会出现问题. 通过readelf -a可以看到一些软件依赖/lib/目录下的一些库文件, 长这样:

1  [Requesting program interpreter: /lib/ld-linux.so.2]

此时, 如果直接执行该可执行文件, 就会报错, 提示 No such file or directory. (这其实在之前SCX技术实践时遇到过, 确实就是一些系统库的问题). 一些相关的讨论可以参考:

不过我已经懒得搞这些了, 过于不方便了. 此外, nixos的包感觉还是不如arch的包, arch的东西用起来感觉就很安心, 因为官方就只维护一个版本, 其就是最新的版本, 直接用就行了, 而nixos下载bbswitch时就有好多版本针对不同的内容, 导致我不知道选择哪一个, 不想选特定版本的因为我希望内核也是会滚动升级到最新的.. (这就看出来滚动更新了好处了, 不需要维护旧的软件包, 不仅减轻了开发者和维护者的压力, 用户自己使用的话其实也更加方便了 多版本软件应用除外)

还有一个问题是Grub相关的配置. Nixos在grub中会记录每次重建系统时的条目, 这很好, 但是其不与我原本的Archlinux所用的grub相统一.. 原本的配置文件位于/boot/grub/grub.cfg, nixos的我完全搞不懂, 在 /boot/loader/entries下记录了所有的nixos的入口项目:

 1$ tree /boot/loader/entries
 2/boot/loader/entries
 3├── nixos-generation-100.conf
 4├── nixos-generation-101.conf
 5├── nixos-generation-102.conf
 6├── nixos-generation-103.conf
 7├── nixos-generation-103-specialisation-external-display.conf
 8├── nixos-generation-104.conf
 9├── nixos-generation-105.conf
10├── nixos-generation-106.conf
11├── nixos-generation-107.conf
12├── nixos-generation-108.conf
13├── nixos-generation-83.conf
14├── nixos-generation-84.conf
15├── nixos-generation-85.conf
16├── nixos-generation-86.conf
17├── nixos-generation-87.conf
18├── nixos-generation-88.conf
19├── nixos-generation-89.conf
20├── nixos-generation-90.conf
21├── nixos-generation-91.conf
22├── nixos-generation-92.conf
23├── nixos-generation-93.conf
24├── nixos-generation-94.conf
25├── nixos-generation-95.conf
26├── nixos-generation-96.conf
27├── nixos-generation-97.conf
28├── nixos-generation-98.conf
29└── nixos-generation-99.conf
301 directory, 27 files

里面大概是一些这样的东西:

1title NixOS
2version Generation 100 NixOS 23.05.20230520.3005f20, Linux Kernel 6.1.29, Built on 2023-05-23
3linux /efi/nixos/63p9bs9v84iazp3ra9g6gnscdndqlsd9-linux-6.1.29-bzImage.efi
4initrd /efi/nixos/q45mvi3i39ygbcqwx225blijc2vljgg3-initrd-linux-6.1.29-initrd.efi
5options init=/nix/store/9gp3bqbf0wwvl48h0majrz1prkpasfvf-nixos-system-nixos-23.05.20230520.3005f20/init loglevel=4
6machine-id 1fb026c04e8f427fa8ec005c0f3ad568

我希望能够统一到一整个grub里, 但是我还没折腾, 因为我对于EFI引导以及GRUB不说是完全了解吧也可以说是一窍不通, 这里也算是一个不够满意的地方(不过应该可以通过花费大量的时间折腾来优雅的解决)

总的来说, NixOS在系统管理方面还是很新颖的, 不过Nix语言本身熟练使用的门槛也较高, 同时有关系统的方方面面还是差强人意, 因而最终还是回退到了先进的Arch上去!

为什么不在Arch上研究一种配置与软件包的追踪方式呢? 挖坑(逃

嗨! 这里是 rqdmap 的个人博客, 我正关注 GNU/Linux 桌面系统, Linux 内核, 后端开发, Python, Rust 以及一切有趣的计算机技术! 希望我的内容能对你有所帮助~
如果你遇到了任何问题, 包括但不限于: 博客内容说明不清楚或错误; 样式版面混乱等问题, 请通过邮箱 rqdmap@gmail.com 联系我!
修改记录:
  • 2023-05-29 23:05:14大幅重构了python脚本的目录结构,实现了若干操作博客内容、sqlite的助手函数;修改原本的文本数 据库(ok)为sqlite数据库,通过嵌入front-matter的page_id将源文件与网页文件相关联
  • 2023-05-24 20:07:29NixOS