NixOS 与 Nix Flakes 新手入门

2023-05-09 12:23:57 +08:00
 ryan4yin

好几年前就听说过 Nix ,用 DSL 来管理系统依赖,还能随时回滚到任一历史状态。 虽然听着很牛,但是不仅要多学一门语言,装个包还得写代码,当时觉得太麻烦就没研究。 但是最近搞系统迁移遇到两件麻烦事,使我决定尝试下 Nix.

第一件事是在新组装的 PC 主机上安装 EndeavourOS ( Arch Linux 的一个衍生发行版),因为旧系统也是 EndeavourOS 系统,安装完为了省事,我就直接把旧电脑的 Home 目录 rsync 同步到了新 PC 上。 这一同步就出了问题,所有功能都工作正常,但是视频播放老是卡住,firefox/chrome/mpv 都会卡住,网上找各种资料都没解决,还是我灵光一闪想到是不是 Home 目录同步的锅,清空了 Home 目录,问题立马就解决了…后面又花好长时间从旧电脑一点点恢复 Home 目录下的东西。

第二件事是,想尝鲜 wayland ,把桌面从 i3wm 换成了 sway ,但是因为用起来区别不明显,再加上诸多不便( hidpi 、sway 配置调优要花时间精力,另外我用的是 sway 官方不支持的 nvidia 显卡),就还是回退到了 i3wm 。结果回退后,每次系统刚启动时,有一段时间 firefox/thunar 等 GUI 程序会一直卡着,要大概 1 分钟后才能正常启动…

发生第二件事时我就懒得折腾了,想到归根结底还是系统没有版本控制跟回滚机制,导致系统出了问题不能还原,装新系统时各种软件包也全靠自己手工从旧机器导出软件包清单,再在新机器安装恢复。就打算干脆换成 NixOS 试试。

然后就研究了半个月 Nix 与 Flakes ,将 PC 从之前用的 EndeavourOS 切换到了 NixOS 。

我折腾的第一步是在我 homelab 上开了台 NixOS 虚拟机,在这台虚拟机里把我物理机的 EndeavourOS i3 配置迁移到 NixOS + Flakes ,还原出了整个桌面环境。 在虚拟机里搞定后问题就不大了,直接备份好我办公电脑的 Home 目录、软件清单,然后将系统重装为 NixOS ,再 git clone 我调试好的 NixOS 配置,改一改硬盘挂载相关的参数,额外补充下 Nvidia 显卡相关的 NixOS 配置,最后一行命令部署配置。几行命令就在我全新的 NixOS 系统上还原出了整个 i3 桌面环境跟我的常用软件,那一刻真的很有成就感!

NixOS 的回滚能力给了我非常大的底气,使我前几天我又进一步迁移到了 hyprland 桌面,确实比 i3 香多了,它的动画效果我吹爆!(在以前 EndeavourOS 上我肯定是不太敢做这样的切换的,原因前面已经解释过了——万一把系统搞出问题,会非常麻烦。)

如果看完上面这些,你对 NixOS 也产生了一些兴趣,如下是我最近折腾时记录的 NixOS 新手笔记~

https://thiscute.world/posts/nixos-and-flake-basics/

7413 次点击
所在节点    Linux
47 条回复
moonjourney
2023-05-10 18:49:52 +08:00
@Miy4mori sliverblue 真的用的爽吗?引用某人回复:开发工具用 toolbox 装,mysql 用 podman 装,virt-manager 用 rpm-ostree 装,还有桌面软件用 flatpak 装。。。
ryan4yin
2023-05-10 19:13:22 +08:00
@moonjourney 这...就有点尴尬了 hhhh
WebKit
2023-05-10 20:14:42 +08:00
用 btrfs 打来快照功能,随时可以回滚
tywtyw2002
2023-05-20 12:55:55 +08:00
@ryan4yin nixos 回滚 最大的问题还是硬盘空间。
nix-store 真的是无底洞,比 npm 都狠。再加上有些 pkg 的 dependency 写的让人头疼,导致随便装点基础工具 硬盘空间就 10g+了。(比如说 fzf ,本来不到 10m ,结果 dependency 中有 perl ,直接要用掉 1g 硬盘空间)

系统一般没事都不会滚,有了 flake ,直接 git check 到相应 commit 然后 nixos-rebuild 下就好了,自定义 overlay 的软件包基本都 ci 预编译二进制。

nixos home-manager 对没事折腾 dot config 真的不是很友好,之前调 config 的时候,一天下来 40 多个 version 。后来就 dot config 和 hm 分开了。
ryan4yin
2023-05-22 09:30:43 +08:00
@tywtyw2002 对我来说这倒不是啥问题,最近固态便宜整了个 2T 的国产固态,目前感觉很够用。
ryan4yin
2023-05-22 09:33:05 +08:00
@tywtyw2002 至于说 dot config 的话,version 多一点也无所谓吧?无非是 switch 比较慢,要等。

我感觉调试的时候可以先不用 home-manager ,调完再加进去就 ok 了。(也可能是我不太折腾 dotfiles 所以没感觉到这里有啥痛点 emmm)
tywtyw2002
2023-05-22 10:15:42 +08:00
@ryan4yin 虚拟机和 vps ,一个 instance 轻轻松松过 10g ,50g 正常。母鸡硬盘都有点吃不消。
chronos
2023-05-23 16:35:55 +08:00
一直听说 nixos 很牛逼,这个硬盘的消耗是不是可以通过 btrfs 的去重功能解决。比如安装完新的依赖后,执行一篇 btrfs 的去重工具,应该可以节省不少的硬盘空间。
ryan4yin
2023-05-26 18:00:37 +08:00
@tywtyw2002 小磁盘的虚拟机的话可能确实有点麻烦,我最近也打算用 NixOS 跑虚拟机,以前跑 Ubuntu 我一般就给 32G 甚至 16G ,如果用 NixOS 的话确实可能 50G 更合适点...

@chronos 我还没用过 btrfs 的去重功能,不过 NixOS 的历史数据实际重复率可能不高,新旧版本的依赖,文件内容有微小差异,这估计去不了重吧?所以我觉得不一定行。
tywtyw2002
2023-05-27 05:58:27 +08:00
@chronos
@ryan4yin
nixos 的硬盘消耗跟重复文件没啥关系。nix-store 自带的硬链已经可以去重了。

磁盘消耗的原因主要是额外的 dependency 磁盘占用太多。

nix 的包一般没有 minimal 安装这种概念,要装就是装全部。

nix 下 git 包 dependency 和 debian 对比。Debian 大概需要不超过 50mb 空间吧,nix 就需要 300Mb+
https://imgur.com/a/erhuYVT

https://imgur.com/a/S3YAKkz
chronos
2023-05-27 09:46:52 +08:00
@tywtyw2002
硬链接的方式应该多个版本之间是不会共用文件的。你可以尝试用 fclones 分析一下,应该还是可以找出挺多重复文件的。

fclones 查出来的重复文件可以进行硬链接去重,但手动的硬链接去重后不能对文件内容直接修改,会导致其它地方的文件内容也被更改。不清楚在 nix 的这种安装机制下有没有问题。

如果是 btrfs 文件系统还可以进行 block 级别去重,还有透明压缩可以减少空间占用。 而且文件系统级别的去重跟硬链接不一样,修改文件不会导致使用相同块的文件内容同时被修改。

我尝试了一下使用 fclones 扫描 /var/lib/docker ,3GB 里面有 2GB 的冗余文件。
SaltyKitkat
2023-05-28 09:55:53 +08:00
@chronos 这种去重应该没有问题,因为据我了解 nix store 下面的东西都是只读的;

另外透明压缩真的很给力!在我这整个 nix store 大概压到了 40%左右
SaltyKitkat
2023-05-28 10:13:50 +08:00
@chronos 试了一下 fclones,发现在 nix store 下面作用不大,大多重复文件也是拜 node_modules 所赐
chronos
2023-05-28 10:37:48 +08:00
@SaltyKitkat node_modules 可以改用 pnpm 安装依赖,pnpm 用了硬链接和软链接。
SaltyKitkat
2023-05-28 13:38:50 +08:00
@chronos 这就不是 nix 层面可以解决的问题了……
毕竟许多电子包从源码打包几乎是一件不可能的事情
比如 vscode
比如 linux qq
logseq 这种也是比起构建还是直接拉二进制比较方便
这些打包就几乎只能把打好的包拉下来这样
不过目前来看虽然丑得一批,但问题也不大就是了
比如我这边主要就是 vscode 里面重复的东西比较多
而整个 nix store 用 fclones 扫一遍,一共也就能节省 70M 左右吧
Miy4mori
2023-05-31 09:01:00 +08:00
@moonjourney 你真的用 Linux ?分享下你都怎么装这些的呗?
ryan4yin
2023-05-31 09:28:16 +08:00
@Miy4mori 额,人家都说了 NixOS 了啊,实话实说我用了快一个月 NixOS ,也经常 sway/i3 换着用,很方便。
Miy4mori
2023-06-06 15:24:21 +08:00
@ryan4yin 他说的有一句在点子上吗? toolbox 装 ide ,podman 跑 mysql 这和什么发行版有什么关系?压根就是不懂装懂……
ryan4yin
2023-06-06 15:37:18 +08:00
@Miy4mori 额没注意到下面的 #21 ,我以为你回的是 #12 ,
ryan4yin
2023-06-06 15:52:08 +08:00
@Miy4mori 不过你说的确实有道理...看了下 sliverblue 主推用 flatpak 装图形化应用,那 jetbrains 全家桶跟其他图形化应用,全都用 flatpak 装应该完全没问题,mysql 不清楚为什么非得用 podman 跑,但应该也有其他运行方法吧。

我猜之所以被这么吐槽,可能是因为直接在 sliverblue 上跑 mysql 确实有困难,得用容器迂回实现?
用 toolbox 装 ide 或许是因为 flatpak 版本有什么坑?
virt-manager 我在 flatpak 上搜了下确实没有,可能是得用 rpm-ostree 装?

所以感觉 @moonjourney 想说的问题本质是,sliverblue 为了实现不可变,对环境施加了许多限制,导致装这些包变得很不方便、安装方式不统一?

如果你有 sliverblue 的使用经验,可以帮助回答下这些问题,最近不可变发行版越发多了起来,我也挺好奇的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/938569

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX