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

不可变文件系统、无状态、声明式配置,是 Linux 发行版的未来么?

  •  1
     
  •   ryan4yin ·
    ryan4yin · 2023-07-06 14:22:50 +08:00 · 4691 次点击
    这是一个创建于 510 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道是不是因为我自己最近一直在折腾 NixOS ,还写了点 NixOS 的入门教程,发觉 V 站上有越来越多的人在推荐 NixOS 、SliverBlue 等比较有特点的发行版 。比如说前两天这个帖子:

    https://www.v2ex.com/t/953897#reply81

    SliverBlue 感觉是个很新的发行版,而 NixOS 虽然不新,但确实是在最近几年听得越来越多。

    结合 Docker/Kubernetes/Terraform 这样的容器即代码、声明式集群管理系统、声明式配置工具的发展趋势,就感觉 Linux 现在的发展也有点切合这个趋势。

    也跟人讨论过这个问题,朋友感慨为什么 2023 年了大家才发现声明式配置、不可变系统的好处... 也有一些 NixOS 用户疑惑,为什么 NixOS 用户群现在才这么点,Flakes 咋到现在还是个实验特性,感觉很不应该...

    33 条回复    2023-10-11 10:05:12 +08:00
    duke807
        1
    duke807  
       2023-07-06 14:26:37 +08:00 via Android
    不觉得能撼动 gentoo 做为发行版的尽头的地位
    codehz
        2
    codehz  
       2023-07-06 14:37:00 +08:00   ❤️ 2
    如果要推广给个人用户的话,还是一键 A/B 分区(加验证禁止修改 root ),软件尽可能单独用户安装的模式比较合适
    crz
        3
    crz  
       2023-07-06 14:45:54 +08:00
    @duke807 lfs?
    ryan4yin
        4
    ryan4yin  
    OP
       2023-07-06 15:47:18 +08:00
    @codehz #2 我主要是考虑开发者群体,有能力理解声明式配置,可复现的开发环境对开发也有很大的好处。

    @duke807 #1 没用过 Gentoo ,不过 NixOS 跟它有一点一样,就是都是源码发行版。

    @crz #3 LFS 主要意义在于学习 Linux ,感觉没啥实用价值,没见过几个人长期自己折腾 LFS 当桌面的,太 Geek 了.
    aloxaf
        5
    aloxaf  
       2023-07-06 16:31:04 +08:00
    这有啥不应该的,喜欢折腾 Linux 的终究是少数,大多数人用 Linux 只是为了干活。
    至于服务端,如果有大公司去推倒是有可能,不然谁敢在服务器上用小众发行版,出了事儿怎么办?

    说白了,发行版的命运,一方面要靠自我奋斗,但另一方面也要考虑到历史的行程……
    Masoud2023
        6
    Masoud2023  
       2023-07-06 16:43:48 +08:00
    感谢分享,第一次知道这个。

    不知道服务器用这个怎么样,想试试 debian12 加 nix 的体验如何。
    chengleqi
        7
    chengleqi  
       2023-07-06 17:04:05 +08:00
    我之前看过个 nixos 的视频,好像不符合 Linux 目录规则?这个是怎么解决的?
    vcn8yjOogEL
        8
    vcn8yjOogEL  
       2023-07-06 17:59:57 +08:00 via Android   ❤️ 5
    当然是,早就通过实战检验了,使用者最多的不可变系统叫 Android
    ryan4yin
        9
    ryan4yin  
    OP
       2023-07-06 18:13:03 +08:00   ❤️ 1
    @chengleqi 是的,简单的说,NixOS 为了极致的系统管理能力,将系统的所有文件都放在了 /nix/store 里面,并且设置为 readonly 避免被用户修改。
    在系统启动时,所有 FHS 相关目录才会被动态创建,比如 /bin /usr/bin /var /tmp 等文件夹,这些文件夹中的初始内容全都是指向 /nix/store 的 symlink.

    也就是说 NixOS 不遵循 Linux FHS 规范,但是通过 symlink 一定程度上兼容了最核心的一些 FHS 路径,使系统能正常运行。

    但是这导致用户无法在 NixOS 上执行任何其他系统上构建的程序,因为绝大部分程序都依赖的 glibc 不在标准路径下。
    解决方法有很多,源码包可以通过在 NixOS 上重新编译一份来解决,二进制包可以通过 patchelf 修改动态链接库路径,也可以模拟一个 FHS 环境来运行这些程序。详见:

    https://nixos-and-flakes.thiscute.world/zh/best-practices/run-downloaded-binaries-on-nixos
    ryan4yin
        10
    ryan4yin  
    OP
       2023-07-06 18:14:53 +08:00
    @vcn8yjOogEL 想了下还真是,Android 包老早就是不可变了,还带签名校验,灯下黑了我。
    pokon548
        11
    pokon548  
       2023-07-06 19:54:01 +08:00 via Android   ❤️ 2
    不可变系统严格意义上不是未来,而是当下。因为目前已经有很多流行的商业产品了,例如 Xbox / Nintendo Switch ( A / B 更新,共同点是更新近乎无下线时间,重启即更新好)。至于 NixOS / Fedora SilverBlue 不火,个人认为主要还是生态和用户面不够广。

    无状态的生态是硬伤,因为很多程序没有按照这个思路去设计。声明式配置同理
    ysc3839
        12
    ysc3839  
       2023-07-06 20:55:22 +08:00 via Android
    去掉无状态基本就是 Android 了,不可变文件系统,系统功能由代码和配置文件控制
    L4Linux
        13
    L4Linux  
       2023-07-06 21:18:50 +08:00 via Android
    这种类型或许适合服务器,但不适合个人用户。
    deorth
        14
    deorth  
       2023-07-06 21:25:11 +08:00 via Android
    我感觉不如滚动更新+文件系统快照
    flyqie
        15
    flyqie  
       2023-07-06 22:00:02 +08:00
    @aloxaf #5

    太暴力了。。

    不过小众发行版之所以小众,一方面是机遇,另一方面也是自身解决的痛点问题所导致的。
    angrylid
        16
    angrylid  
       2023-07-06 22:32:24 +08:00 via Android
    我觉得 Linux Desktop 如果有未来,要么是 Chrome OS 要么是 Steam OS
    flyqie
        17
    flyqie  
       2023-07-06 22:34:39 +08:00
    @angrylid #16

    wayland 和 x11 ,还有 google 造的轮子。。

    linux 桌面。。不好搞啊。
    angrylid
        18
    angrylid  
       2023-07-06 22:45:55 +08:00 via Android
    @flyqie 且如果 Chrome OS 或 Steam OS 真的在未来有一席之地,那说明是他们的商业模式走通了,而非是在技术上有什么一骑绝尘的特性。那他们会成功在瞄准了 Windows 鞭长莫及的市场,而不是解决了 Windows 的技术痛点。
    lucifer9
        19
    lucifer9  
       2023-07-07 13:30:21 +08:00
    NixOS 以前我问过一个长期的用户,有些软件的配置需要查好多选项应该怎么写,而且还有 configuration.nix 和 home.nix 里面同一个软件可以用的选项不一样,这些都要怎么知道。得到的回答是看源码。后来他又补充了一句,要是你有之前就写好的配置,可以直接用 builtin.readFIle 还是啥的直接导入到 nix store 。听上去还挺方便。后来我仔细想了一下,这跟我自己用 stow+git 管理配置,系统自动快照有啥区别
    yyws2012
        20
    yyws2012  
       2023-07-07 13:44:25 +08:00 via Android   ❤️ 1
    预言:声明式配置会一直保持小众。不可变发行版会在 10 年成为主流
    ryan4yin
        21
    ryan4yin  
    OP
       2023-07-07 14:34:24 +08:00
    @lucifer9 #19 单纯从 dotfiles 管理的角度看,我也觉得没啥区别。
    但是 NixOS 作为一个 OS ,它的配置显然不仅仅只能管 dotfiles ,它的配置文件可以管理整个操作系统的大部分状态。
    ryan4yin
        22
    ryan4yin  
    OP
       2023-07-07 14:39:32 +08:00
    @lucifer9 #19 哦漏了一点,你用系统自动快照来管理系统状态。

    这里的区别在于,系统快照的内容是不可复现的,快照内容不包含如何从零构建这个快照的「知识」,是不可解释的。

    而 NixOS 的配置是一份从零构建出一个一模一样的 OS 的「知识」,是可解释的,而且可以通过简单几行命令就自动完成这个构建。NixOS 配置本身既是一份记录你的 OS 都做过哪些变更的文档,也是用于自动构建出这个 OS 的配置。
    ryan4yin
        23
    ryan4yin  
    OP
       2023-07-07 14:46:08 +08:00
    接前文 #22 ,NixOS 有这么一份可解释的、声明式的「知识」的好处在于:

    1. 对系统做任何修改都很方便、安全、干净
    2. 可以很方便地分享给别人,其他人也能通过简单的配置内容审查,确定你的配置是无害的
    lucifer9
        24
    lucifer9  
       2023-07-07 15:19:30 +08:00
    @ryan4yin 快照是滚挂了有个后悔药,方便修复。不是跟 NixOS 那样同步每一次配置更改的。
    配置文件不止是 dotfiles 。自己安装新软件,改动配置,测试成功以后都会提交一下 git 的。历史就在 git 里面。
    需要重新构建的话,我这边从格盘,分区,安装所有软件包,复原相应的配置文件都有脚本的,需要恢复到哪一步 checkout 相应的 commit 就行的。
    ryan4yin
        25
    ryan4yin  
    OP
       2023-07-07 15:57:25 +08:00
    @lucifer9 理解,你自己写脚本安装软件、恢复配置文件,恢复整个环境,当然也完全可行,毕竟很多运维都是这么干的。
    huangmingyou
        26
    huangmingyou  
       2023-07-07 16:07:05 +08:00
    我用 ansible 维护桌面环境,遇到要重做新系统,就跑一下 ansible 搞定。
    huangmingyou
        27
    huangmingyou  
       2023-07-07 16:11:01 +08:00
    看了一下 op 的 nixos 的说明文档,感觉这系统违反了 unix 哲学。明明很简单的事情搞的很复杂。各个层次也搞的很混乱。比如可以用 puppet,ansible 来维护系统状态,可以用 lvm snapshot 来维护数据状态。偏偏都要搅和到一起。
    ryan4yin
        28
    ryan4yin  
    OP
       2023-07-07 16:18:46 +08:00
    @huangmingyou NixOS 只负责维护系统状态,数据状态还是需要 lvm snapshot 来维护。
    chengleqi
        29
    chengleqi  
       2023-07-07 17:47:33 +08:00
    @ryan4yin 感谢详细的回答,受教了
    ryan4yin
        30
    ryan4yin  
    OP
       2023-07-07 18:32:02 +08:00
    @lucifer9 @huangmingyou #24 #28 我一起回复下吧,用传统 Linux 发行版、脚本或者 ansible 等工具,当然都能实现同样的功能,毕竟这么多年业界都是这么用的。

    而 NixOS / Fedora SilverBlue / Android 以及其他类似的发行版,它们或多或少拥有的,比这些传统方法更有优势的特性就在于本文的标题:

    不可变文件系统、无状态、声明式配置

    如果各位有用过帖子前面提过的 Docker/Kubernetes/Terraform/Pulumi 这些现代化运维工具,应该会比较能理解这一点。
    ryan4yin
        31
    ryan4yin  
    OP
       2023-07-07 18:48:20 +08:00
    @lucifer9 @huangmingyou 如果单纯说 NixOS 跟自己写脚本以及用 Ansible 、Dockerfile 的区别,我暂时想到的是,NixOS 把环境的「可复现性」提升了一个级别,另外它的「声明式配置」也是前面几种方法所没有的。

    先说下「可复现性」,Ansible 、Dockerfile 、自己写脚本,实质上都存在不可复现的安全隐患。
    比如说你会用 `apt install curl` 来安装一个 curl 包,用 `pip isntall xxx` 安装一个 python 包,一个月前在 ubuntu 20.04 上跑它,跟现在跑它,下载到的包版本是可能会更新的。这通常不会导致啥问题,但是一旦出现不兼容变更的更新,那麻烦就大了。
    而 NixOS 的 Flakes 功能,跟 go.sum/package-json.lock/cargo.lock/poetry.lock 一样,不需要手动做任何配置,它默认就会通过 hash 值、git commit 等手段完全锁定所有依赖包的版本号与 hash id ,这就极大地提升了环境的可复现性。

    再说「声明式配置」,声明式配置工具将底层的复杂操作全部封装在了它内部,只给用户提供了简洁且必要的声明式参数。我想用过 terraform/kubernetes 的人都应该能体会到它的好处,通过改几行配置,就可以简单地更换系统的各种组件,或者直接创建并配置好一整套包含 k8s/mysql/redis 在内的云上微服务系统。如果自己写脚本或者用 ansible 去做,那这会是个大工程,要达到众多贡献者维护的 terraform 等工具的稳定性,更不知道要花多少精力。
    Chobits
        32
    Chobits  
       2023-10-11 00:09:36 +08:00
    个人感觉,NixOS 的问题是官方文档很有限还很分散,如果遇到特殊需求了需要自己打包,就得去翻源码;官方的 cache 在国内不能访问,国内的镜像 cache 又不完整,光是安装就很看脸。至于 flake 、home-manager 等实验特性,文档嘛,呵呵。

    想装个 virtualbox ,直接是一堆报错,还不说明是哪里的问题。

    NixOS 比 Ubuntu 的发表时间还长,20 多年了还没流行开,主因还是自身问题太多了。
    ryan4yin
        33
    ryan4yin  
    OP
       2023-10-11 10:05:12 +08:00
    @Chobits 是这么回事,导致 NixOS 小众的问题很多都来自它自身,文档跟社区自身问题都很大。
    至于国内网络,这个确实...没梯子的话会很麻烦。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1198 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:12 · PVG 07:12 · LAX 15:12 · JFK 18:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.