V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ryan4yin
V2EX  ›  Linux

NixOS 与 Nix Flakes 新手入门

  •  2
     
  •   ryan4yin ·
    ryan4yin · 2023-05-09 12:23:57 +08:00 · 7434 次点击
    这是一个创建于 598 天前的主题,其中的信息可能已经有所发展或是发生改变。

    好几年前就听说过 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/

    47 条回复    2023-09-29 10:02:10 +08:00
    tywtyw2002
        1
    tywtyw2002  
       2023-05-09 13:26:31 +08:00   ❤️ 1
    装 nixos 最简单的方法其实是用 kexec 。

    https://github.com/nix-community/nixos-images
    Al0rid4l
        2
    Al0rid4l  
       2023-05-09 13:39:37 +08:00   ❤️ 1
    感谢, 非常详细的指南, 正好最近也想尝试 Nix
    ryan4yin
        3
    ryan4yin  
    OP
       2023-05-09 14:25:56 +08:00
    @tywtyw2002 感谢推荐,我有空再研究下
    yuhangch
        4
    yuhangch  
       2023-05-09 14:47:50 +08:00
    歪日 4090
    lindas
        5
    lindas  
       2023-05-09 15:47:17 +08:00   ❤️ 1
    好巧,刚好在看你写的关于 linux 虚拟网络设备的文章 https://thiscute.world/posts/linux-virtual-network-interfaces/#%E4%B8%89bridge
    ryan4yin
        6
    ryan4yin  
    OP
       2023-05-09 15:56:29 +08:00
    @lindas 那确实是巧了,某种程度上说世界还挺小的~

    @yuhangch 脑子一热就买了,windows 下打游戏贼爽,就是钱包有点受伤...
    Naccl
        7
    Naccl  
       2023-05-09 17:32:49 +08:00   ❤️ 1
    歪日,二花佬又在整些让人头大的技术
    ryan4yin
        8
    ryan4yin  
    OP
       2023-05-09 18:09:09 +08:00
    @Naccl 哈哈哈哈哈哈嗝...
    jKpzPv20NjX56i44
        9
    jKpzPv20NjX56i44  
       2023-05-09 18:44:13 +08:00
    Immutable OS 也可以试试 openSUSE 的 MicroOS https://get.opensuse.org/microos/
    jKpzPv20NjX56i44
        10
    jKpzPv20NjX56i44  
       2023-05-09 18:45:48 +08:00   ❤️ 1
    @qwerzl 不小心发送了... 直接用的 btrfs snapshot 实现回滚,个人感觉比 silverblue 和 nix 都简单很多
    ryan4yin
        11
    ryan4yin  
    OP
       2023-05-09 19:02:16 +08:00 via Android
    @qwerzl 嗯嗯,之前确实没考虑到有这功能,有空研究研究,不过 Nix 都已经搞定了,大概率不换方案了🤣
    moonjourney
        12
    moonjourney  
       2023-05-09 19:41:51 +08:00   ❤️ 1
    nixos 切换不同桌面非常简单干净,而且很安全,我就经常 gnome/kde/sway 来回换着用。
    unidentifiedme
        13
    unidentifiedme  
       2023-05-09 20:25:32 +08:00   ❤️ 1
    我的 NAS 也是 NixOS ,用 flake 的管理的 NixOS 和 home ,正准备把 WSL 和 VPS 也换成 NixOS ,reproducible 确实很爽。

    Overlay 就是字面意义上的 nixpkgs overlay ,你可以修改 /新增 pkg ,比如你想在 configuration.nix/home.nix 中安装还不在 nixpkgs 里面的 pkg ,你可以不用提交你的 pkg 到 nixpkgs ,而是通过在 nixpkgs 上叠加你自己的 overlay 来 "生成" 一个包含你自己的 pkg 的 nixpkgs 。有点类似 docker 中的 overlayfs 。
    ryan4yin
        14
    ryan4yin  
    OP
       2023-05-09 21:43:53 +08:00
    @moonjourney 确实,这是我以前用其他 OS 没体会到过的爽点。

    @unidentifiedme 感谢解释,另外将 NixOS 用在 NAS 上也是我下一步想尝试的事情~
    Remmina
        15
    Remmina  
       2023-05-10 11:39:32 +08:00
    感谢楼主的文章,一直对 NixOS 很感兴趣,有时间好好学习一下~
    另外,想请问一下楼主所说的回滚机制具体指什么,能不能使用基于 Btrfs 的 TimeShift 实现呢?
    ryan4yin
        16
    ryan4yin  
    OP
       2023-05-10 12:02:21 +08:00   ❤️ 1
    @Remmina 我之前也是用的 btrfs 文件系统,不过确实不知道还有 timeshift 这个功能。

    刚刚特意研究了一下,看起来 timeshift 有点类似虚拟机的镜像快照,不过可能更省空间、更快速。

    而 NixOS 的回滚机制,就是 NixOS 系统的任何变更,都会生成一个新的系统环境,同时旧的系统环境也会被保留,所有的历史环境都会被自动加入到 grub 启动项中,NixOS 的版本就相当于 timeshift 的快照。

    所以单论回滚能力,NixOS 跟 timeshift 貌似确实没啥大的区别,timeshift 反而要更简单些,门槛低很多。

    NixOS 更大的优势应该是它的声明式系统配置与版本锁文件带来的可复现性,这是指它是直接通过代码来描述操作系统,OS as Code ,从而可以直接用 Git 来管理这部分配置,这带来的好处有:

    1. 可以很方便地分享自己的系统配置,当然也可以在 Github 上找到很多别人分享的配置可供参考。
    2. 声明式配置给系统带来了高度便捷的可自定义能力,NixOS 可以非常简单地更换系统的各种组件。
    1. 前面有 v 友的评论就是一个例证:「#12 nixos 切换不同桌面非常简单干净,而且很安全,我就经常 gnome/kde/sway 来回换着用。」
    1. 只要对声明式配置的修改都及时提交到 Git 仓库,就不用担心系统无法还原,即使你固态硬盘挂了、备份没了甚至机器烧掉了,照样能在别的机器上几行命令基本还原出整个系统。
    ryan4yin
        17
    ryan4yin  
    OP
       2023-05-10 12:03:56 +08:00
    额楼上排版有点问题,缩进不对,将就着看吧。
    Miy4mori
        18
    Miy4mori  
       2023-05-10 12:25:25 +08:00 via iPhone
    我一直用 rpm 系的 fedora ,silverblue 这种同宗同源的无痛切换很爽,nix 这种自成一脉的学习成本有点高。
    ryan4yin
        19
    ryan4yin  
    OP
       2023-05-10 14:49:50 +08:00
    @Miy4mori 你提到的 sliverblue ,与前面 v 友提到的 microos ,都挺类似的,之前我都没听说过 emmm 涨见识了
    Remmina
        20
    Remmina  
       2023-05-10 15:55:47 +08:00
    @ryan4yin #16 感谢如此认真的回复!
    moonjourney
        21
    moonjourney  
       2023-05-10 18:49:52 +08:00
    @Miy4mori sliverblue 真的用的爽吗?引用某人回复:开发工具用 toolbox 装,mysql 用 podman 装,virt-manager 用 rpm-ostree 装,还有桌面软件用 flatpak 装。。。
    ryan4yin
        22
    ryan4yin  
    OP
       2023-05-10 19:13:22 +08:00
    @moonjourney 这...就有点尴尬了 hhhh
    WebKit
        23
    WebKit  
       2023-05-10 20:14:42 +08:00 via Android
    用 btrfs 打来快照功能,随时可以回滚
    tywtyw2002
        24
    tywtyw2002  
       2023-05-20 12:55:55 +08:00 via iPhone
    @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
        25
    ryan4yin  
    OP
       2023-05-22 09:30:43 +08:00
    @tywtyw2002 对我来说这倒不是啥问题,最近固态便宜整了个 2T 的国产固态,目前感觉很够用。
    ryan4yin
        26
    ryan4yin  
    OP
       2023-05-22 09:33:05 +08:00
    @tywtyw2002 至于说 dot config 的话,version 多一点也无所谓吧?无非是 switch 比较慢,要等。

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

    @chronos 我还没用过 btrfs 的去重功能,不过 NixOS 的历史数据实际重复率可能不高,新旧版本的依赖,文件内容有微小差异,这估计去不了重吧?所以我觉得不一定行。
    tywtyw2002
        30
    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
        31
    chronos  
       2023-05-27 09:46:52 +08:00
    @tywtyw2002
    硬链接的方式应该多个版本之间是不会共用文件的。你可以尝试用 fclones 分析一下,应该还是可以找出挺多重复文件的。

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

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

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

    另外透明压缩真的很给力!在我这整个 nix store 大概压到了 40%左右
    SaltyKitkat
        33
    SaltyKitkat  
       2023-05-28 10:13:50 +08:00
    @chronos 试了一下 fclones,发现在 nix store 下面作用不大,大多重复文件也是拜 node_modules 所赐
    chronos
        34
    chronos  
       2023-05-28 10:37:48 +08:00
    @SaltyKitkat node_modules 可以改用 pnpm 安装依赖,pnpm 用了硬链接和软链接。
    SaltyKitkat
        35
    SaltyKitkat  
       2023-05-28 13:38:50 +08:00
    @chronos 这就不是 nix 层面可以解决的问题了……
    毕竟许多电子包从源码打包几乎是一件不可能的事情
    比如 vscode
    比如 linux qq
    logseq 这种也是比起构建还是直接拉二进制比较方便
    这些打包就几乎只能把打好的包拉下来这样
    不过目前来看虽然丑得一批,但问题也不大就是了
    比如我这边主要就是 vscode 里面重复的东西比较多
    而整个 nix store 用 fclones 扫一遍,一共也就能节省 70M 左右吧
    Miy4mori
        36
    Miy4mori  
       2023-05-31 09:01:00 +08:00 via iPhone
    @moonjourney 你真的用 Linux ?分享下你都怎么装这些的呗?
    ryan4yin
        37
    ryan4yin  
    OP
       2023-05-31 09:28:16 +08:00
    @Miy4mori 额,人家都说了 NixOS 了啊,实话实说我用了快一个月 NixOS ,也经常 sway/i3 换着用,很方便。
    Miy4mori
        38
    Miy4mori  
       2023-06-06 15:24:21 +08:00 via iPhone
    @ryan4yin 他说的有一句在点子上吗? toolbox 装 ide ,podman 跑 mysql 这和什么发行版有什么关系?压根就是不懂装懂……
    ryan4yin
        39
    ryan4yin  
    OP
       2023-06-06 15:37:18 +08:00
    @Miy4mori 额没注意到下面的 #21 ,我以为你回的是 #12 ,
    ryan4yin
        40
    ryan4yin  
    OP
       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 的使用经验,可以帮助回答下这些问题,最近不可变发行版越发多了起来,我也挺好奇的。
    moonjourney
        41
    moonjourney  
       2023-06-06 23:13:00 +08:00
    @Miy4mori 哪里不对了?哪里不懂了?另外 toolbox 是这个 https://containertoolbx.org/
    tywtyw2002
        42
    tywtyw2002  
       2023-06-29 12:38:14 +08:00 via iPhone   ❤️ 1
    @SaltyKitkat
    @chronos
    nix store 在设计的时候就已经考虑到去重了。如果想要更好的去重,上 zfs ,扫 block ,不过增加一些开销。

    qq 什么的,真的建议 remote desktop 到个 win10 ,用起来方便很多。

    官方的 nixpkgs 是自动 build cache 的,安装的时候直接从 binary cache 里面拉编译好的。
    自己写的 nixpkgs 包,可以用 github action 去编译然后 push 到 cachix ,不同二次编译。
    https://nixos.wiki/wiki/Binary_Cache
    SaltyKitkat
        43
    SaltyKitkat  
       2023-06-29 20:25:59 +08:00
    @tywtyw2002 现在看感觉对 nix store 再从文件系统层面进行去重意义不大,倒是透明压缩的潜力挺大的
    qq 什么的,win 确实是最佳方案,但问题是目前手里面没有多的机子😂
    试过虚拟机,但感觉还是有点太麻烦
    SaltyKitkat
        44
    SaltyKitkat  
       2023-06-29 20:30:39 +08:00
    @chronos 才了解到,nixpkgs 里面有 npm 和 yarn 的支持,但貌似暂时还没有打包 pnpm 的函数…
    有兴趣的可以去 pr
    chronos
        45
    chronos  
       2023-06-30 09:37:31 +08:00
    @SaltyKitkat 没用过 NixOS ,一直用着 Archlinux ,暂时没有换的打算,重新搞整套环境太麻烦了。
    aur3l14no
        46
    aur3l14no  
       2023-09-28 23:15:41 +08:00
    @tywtyw2002 cachix 好贵啊...
    tywtyw2002
        47
    tywtyw2002  
       2023-09-29 10:02:10 +08:00 via iPhone
    @aur3l14no 一般情况下 cachix 用不超啊 自带垃圾回收,免费的够用了。

    需要空间大自建 nix cache 就好了 后端可以 s3 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2781 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:13 · PVG 22:13 · LAX 06:13 · JFK 09:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.