我的 Linux 再也滚不挂了—— NixOS 桌面试用

我的 Linux 再也滚不挂了—— NixOS 桌面试用

之前在虚拟机里用了一段时间的 NixOS。昨天终于在笔记本上抛弃了“正常”发行版的带镜像下载速度,安装了 NixOS。那个 Fastly 的 CDN 稍微 slowly 点就 slowly 点吧……

安装

(本文不是 NixOS 安装和配置教程。安装教程请参考文档。)

NixOS 没有像 Ubuntu 或者 Fedora 那样的完全一站式的安装程序,所以一开始和 Arch 有点像,需要自己分区然后 mount 上。这一步参照 manual 就可以了。

之后 nixos-generate-config 命令会从当前挂载的分区和存在的硬件生成一个 /etc/nixos/hardware-configuration.nix 和一个基础系统的 /etc/nixos/configuration.nix。

默认的 configuration.nix 里面注释写的是举例形式的,比较简洁但是不难懂。先把网络和图形界面配置上:

networking.hostName = "<It's important to pick a good name>"; # https://www.xkcd.com/910/
networking.networkmanager.enable = true;
services.xserver.displayManager.sddm.enable = true;
services.xserver.desktopManager.plasma5.enable = true;

(Bootloader 默认是 systemd-boot,保留即可,换 GRUB 也行。)(题图是我的 Bootloader 和内核相关配置)

然后 nixos-install 就可以了,各种乱七八糟的自动按照 configuration.nix 配置好,最后让你设一个 root 密码,之后重启进系统就可以了。这一步比 Arch 简单多了。

在这里我们已经在体验 NixOS 系统配置的“一条龙服务”。在写下一行配置的时候,里面就包括了软件依赖、配置文件、Systemd 的 unit 文件等内容。

像这种声明式的系统配置,一大好处就是更加紧凑,更容易复现。日常使用上最明显的一点就是,我们再也不用担心忘了系统配置都改了什么了。

使用

和预料中的没有太大的差别。用户账户用什么东西直接 nix-env 安装就好,使用上和一般的包管理器比较接近,只是不需要 sudo 就可以装东西。实现上是在系统全局安装好后 symlink 到 ~/.nix-profile 下,成为一个“prefix”的样子,还是比较科学的。

我加了个 alias:

alias nixpkgs="nix-env -f '<nixpkgs>'"

系统配置的话,用 /etc/nixos/configuration.nix 真是简直不能再爽。我的笔记本是 SSD 的,所以配置了一个 fstrim。

services.fstrim = {
  enable = true;
  interval = "tuesday";  
};

SDDM 的 HiDPI 支持默认确实是打开的,不过貌似没有检测出我的机器需要 1.5x,所以加点配置:

services.xserver.displayManager.sddm.extraConfig = ''
  [X11]
  ServerArguments=-dpi 144
'';

(KDE 里面 Scale Display 到 1.5x,然后底栏高度拉高点就好了,不需要系统配置)

文本编辑器 Vim Emacs Nano 啥的默认统统没有,随手开个默认 EDITOR。

programs.vim.defaultEditor = true;

ucode 啥的,我才不记得什么 initrd 呢,直接:

hardware.cpu.intel.updateMicrocode = true;

发行版

Nixpkgs 里面的包少……吗?

有一些标记为非自由软件的包默认不会显示,安装也会失败。(nix-env 直接什么都不做……这应该是个 bug)如果需要用的话必须手动允许:

nixpkgs.config.allowUnfree = true;

Nixpkgs 包总体来说应该还算可以吧……除了有大量常见自由软件以外(KDE 算不算……),许多小众的包和非自由软件 patched binary 的包在 Nixpkgs 里都能找到:

  • 首先就是整个 Haskell 的 Hackage 都在 Nixpkgs 里面,贡献了很大的包的总数……
  • Sarasa Gothic 字体都有打包
  • 连 Mathematica 都有打包。从 binary 开始 PatchELF……
  • VSCode 确实有,但是只有 binary 的没有 OSS 的。
  • Chrome 和 Chromium 倒是都有。

为什么 binary 要 PatchELF 呢?如果尝试运行一下就会发现有很多 so 找不到。

容易发现,NixOS 是缺少很多 FHS 目录的。比如 /bin 下只有一个 /bin/sh,/usr 下只有一个 /usr/bin/env,其余真正的软件都分开存放在不同的目录下,然后系统配置是 symlink 出来的,放在 /run/current-system。既然 /usr/lib 啥的都没有,能找到库就怪了。

这种隔离式的设计事实上帮助实现了原子更新和快速回滚。从启动界面上列出的不同版本的系统 profile 就可以看出,NixOS 是一个可以字面意义上“恢复上一次正确的配置”的发行版(趴)。而且配置 profile 之间的切换不需要复制好多文件之类的,所以非常迅速。

所以是不是左传可以在此立下 NixOS 滚不挂 Flag 一枚 23333

(实在不行,进启动盘重新 nixos-install 一遍,反正也是按照 configuration.nix 安装的)

总结

所以你们可能关心的问题是:到底要不要用 NixOS。

如果你不需要 Ubuntu 那种的开箱即用的,觉得 Arch 那样的自己动手可以接受,喜欢 Gentoo 的可配置性,又不想自己完全编译整个世界,并且觉得所有系统配置全都由统一格式写出来的可复现性确实很棒,并且觉得那帮人为了 portable 和轻量级,自己做了个 Nix 语言可以接受的话,NixOS 可能就是专门为你设计的。

哦对,如果你特别想用 Lisp 或者特别想坚持用自由软件的话出门左转 GuixSD……

参考资料

NixOS manual

我的 /etc/nixos/configuration.nix

github.com/dramforever/

编辑于 2018-11-23

文章被以下专栏收录