不可变文件系统、无状态、声明式配置,是 Linux 发行版的未来么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ryan4yin
V2EX    Linux

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

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

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

    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

    太暴力了。。

    不过小众发行版之所以小众,一方面是机遇,另一方面也是自身解决的痛点问题所导致的。
    wakarimasen
        16
    wakarimasen  
       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 桌面。。不好搞啊。
    wakarimasen
        18
    wakarimasen  
       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     Solana     873 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 21:26 PVG 05:26 LAX 14:26 JFK 17:26
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86