Guix重装系统感到非常方便

Author: R.W.Flurando

Tags: Guix

虚无缥缈的可复现

函数式编程最爱吹的莫过于Reproducibility可复现特性了。

这是什么东西呢?

按照定义,就是他机器上跑一遍编译出来的东西在你机器上跑出来的一模一样,每个bit都是相同的。

当然,如果是文本输出,ok,裸机器码的二进制输出不同架构的机器的确不同,那么在这种情况下就是相同架构的机器结果应当相同。

懂了么,要求是可控,只要我认为这里应该是相同的,它就该是相同的,而不是同样的printf("Hello, World!");在我电脑上输出一个干净的可执行文件,却在你电脑上内置了电话号码。

这样做好处是什么呢?

  1. 方便审查

    任何人都可以在自己机器上跑相同内容再通过hash值检查某个来源声称的包是否正常。

  2. 方便自建

    任何人都可以自己生成最终文件并确信和来自某个来源的包完全相同,而不是出现问题后思考是不是自己的机器有问题。

这样做的坏处是什么呢?

对于普通终端用户而言,没有任何害处。

我唯一能想到的就是不方便放后门、记录元数据,因为人家都可以自己造甚至反过来检查你的包是不是真的由那些操作生成。

但是正常合法情况下放后门和记录元数据都是不存在的,所以对我们来说,函数式是有益无害的!好吧,你自己生成会比随便下个二进制跑耗电……

问题在于,这很好,但好像完全是开发者的事啊!

终端用户敢从某个来源下载可执行文件,自然是信任那个来源的,谁没事把下好的包再重新构建检查啊?

看上去,可复现还真没啥实际意义。

直到……

重装系统的痛苦

mmm,重装系统其实不痛苦,痛苦的是配置环境的重新构建和个人资料的转移。

其中个人资料的转移一般就是个把文件夹,说实话拿个U盘就可以,甚至网盘都行,复制嘛,不麻烦。

麻烦的是环境构建,当下的环境不是要在终端一步步下东西,就是在各种地方修改各种配置文件。

即便用git管理,一堆配置文件也让人十分头疼。以至于很多人因为配置文件不方便转移,只能停留在某个发行版,这可真是最不能责怪厂家的Lock Vendor了。

Guix的解决方案

Guix的出现和发展,较好的解决了这个问题。

参照Nix来设计的一切由Guile Scheme管理的函数式包管理器/发行版,给予用户用一个Scheme模块来配置系统、用户环境等能力。

或许你感受不到,但请想象你的Word配置、vscode配置、latex配置、网页服务器配置、代理配置、环境变量设置甚至装什么软件都可以用一个大型Scheme程序表示,并可以一键还原、布置、切换……再也不用计较那些四散在系统各处的配置了!

只要用git监视一个配置文件,这个文件包含你的系统、用户、软件包甚至独立配置文件,在系统迁移或重装时只要把用户文件夹下个别存放数据的文件夹手动备份即可,配置文件直接git同步,一键恢复,再放上那些数据文件夹就结束了。

有人说也不行啊,你倒是自动同步数据啊。

这就要牵涉到函数式编程的另一个特性了,不可修改。如果你的数据不可修改,那么我认为你可以把它和那些配置文件一起弄;如果你的数据要经常修改而且你不希望每次修改都重新配置一遍系统的话,建议手动或者用其他数据同步软件。

毕竟,不会真有人用git管理Documents、Pictures、Videos、.local之类的文件夹吧。没必要,而且.local、.var之类的文件夹内容如果不可修改,很多程序会无法正常运行的。

所以,不能自动同步数据不能怪函数式编程,人家就不是设计来弄这个的。(当然,理论上可以实现相关的服务来自动管理数据,但目前guix里没有这个东西,syncthing的服务是多机器同步文件夹的,不能有效处理你自己的.local之类的内容,怎么说,靠你写咯)

我的建议和实践是,重要的数据量必然不大,你自己手动弄一下得了,也没几个地方,Documents那几个文件夹,.local,.ssh,.gnupg,用flatpak的再来个.var吧,没了。手动完全可以,甚至你数据实在过于分散的,整个home文件夹除了.guix-home,.guix-profile和老guix-home备份外统统打包到时候还原得了。如果你用guix还疯狂手改系统内容,我相信你是可以自己处理的。

有人说数据真的特别特别多怎么办,我只能说常用系统不该拿来当存储盘,用网盘或者其他硬盘专门存电影什么的吧。

实际感受

太棒了!

你肯定想不到,当我第一次用git云端同步几分钟内在Windows电脑上打开和我Linux上emacs完全相同的布色,有多高兴。

而使用Guix,这个体验不仅仅是一个emacs,而是整个系统,整个系统的配置啊!

除了一开始的uefi之类的和我的数据之外,都可以用一个scheme程序复现。

说实话,需要手动迁移数据,比如gpg密钥和.local/bin中的可执行文件之类的让我有点恼火,但它已经足够好。这里的手动,我还真想不到在不牺牲安全性前提下避免的方法。

感想

声明式和函数式真的高端,同时给Guix的graft功能赞一个。

而这些,我用windows不知道除了4399还能干啥时是做梦也想不到的。