Bye Bye Debian, Hello Guix

从高三时第一次接触Gnu/Linux到现在已经好多年了。最开始只是尝试使用Ubuntu,后来成了Debian系distro的死忠粉,从桌面环境到服务器都一直用着Debian。现在我要宣布和 Debian拜拜了。因为我有了Guix!

今年初发现了Guix这个Gnu/Linux发行版,相见恨晚。Gnu官方出品,够清真。关键是功能也强大,通过一份Scheme程序就可以配置好整个操作系统,免去了以前每次安装Debian后一个个改软件包配置文件的痛苦,还不用担心系统使用时间久了之后积累各种垃圾依赖软件包,洁癖患者的救星。于是我立马就在虚拟机里安装了Guix,接着就遇到打击了。Guix现有的软件包和Debian相比太少,缺少一些我常用的工具,而且我不知道怎么在Guix里运行Dropbox。使用fish shell时又遇到一个严重的bug,虽然报告给了guix开发者,但是一直没得到修复。于是Guix就这样在我的虚拟机里躺了几个月,期间我偶尔学着折腾一下。

直到上个月,我下定决心要在我的主力机器上安装Guix!

我的主力机是一台Surbook Mini,这是买来替换Macbook Pro的。虽说是主力机,但是很惭愧,性能实在渣,Celeron N3450 CPU + 4GB RAM(其实它就是一个平板电脑)。好在我的日常需求只是Unix+Emacs+Firefox,这个渣机器勉强够用。之前这台机器一直安装Debian,现在我要给它安装Guix。

在Surbook Mini上安装Guix遇到的第一个困难就是驱动程序。由于Guix过于清真,使用了 Linux-libre内核,不含闭源驱动程序,也不允许加载闭源固件,而Surbook Mini的网卡和触摸屏需要闭源固件,所以我需要替换Guix使用的内核。通过搜索Internet和查看Guix文档,我给Guix配置文件添加了Linux-nonfree内核,解决了网卡驱动程序问题。

接下来可以开始尝试安装了。把Guix的ISO安装文件写到U盘上,从U盘启动Guix。由于Guix 安装过程中需要从网上下载很多东西,所以这时需要让电脑联网,最简单的解决方案就是把手机用USB线和电脑连接,打开手机上的USB tethering,把手机作为一个网卡。Linux内核自带USB tethering所需要的驱动程序。按照安装Guix的标准流程,之后需要创建硬盘分区、挂载文件系统、复制Guix的配置文件,最后启动guix system init。接着就是漫长的等待过程,这个过程非常非常长,因为这台渣电脑编译一遍Linux 4.18内核需要四个小时。

等guix system init执行结束之后就是激动人心的reboot过程。然而童话里都是骗人的,迎接我的不是Guix桌面,而是一个bug。Grub说它找不到我的硬盘分区/dev/mmcblk1p2,这是操作系统的root分区。我仔细瞅了又瞅,瞧了又瞧,每一个字符都没写错。为什么会这样,我不知道。苦思冥想之后我尝试了一个解决方案,把配置文件里的/dev/mmcblk1p2替换成分区的UUID。重新安装Guix,又是漫长的四个小时。再重启。哇,这次终于启动起来了,黑底白字的Linux内核log在屏幕上滚动。可是滚到后面它突然滚不下去了,又抛了一个bug,这次它找不到/dev/mmcblk1p1,这是/boot/efi分区。为什么会这样,我还是不知道。但是我把配置文件里的/dev/mmcblk1p1也替换成了分区的UUID。再次重新安装Guix,又过了4个小时。重启。终于启动了Guix。进入操作系统之后我终于找到了bug的原因,从U盘启动Guix安装程序时硬盘的名字是/dev/mmcblk1,但是启动安装后的操作系统时硬盘的名字变成了 /dev/mmcblk0。这个故事告诉我们,写硬盘分区配置时不要为了偷懒而使用分区名字,一定要使用UUID。

进入Guix之后就要开始各种折腾啦。最开始我为了方便安装了Gnome桌面,现在当然要换成一个tiling window manager即i3-wm。由于Guix没有i3blocks软件包,我给i3blocks打了一个软件包,感觉比给Debian打包要顺心很多。

经过不断地探索又成功运行了Dropbox。如果其他人有类似的需求,可以参考我的解决方案。 Dropbox提供的Linux程序依赖很多library,最重要的是libc,即 /lib64/ld-linux-x86-64.so.2,这个路径是写死的,然而Guix的文件系统结构里没有这个文件,所以先把glibc添加到system profile里,然后把/lib64 symlink到 /run/current-system/profile/lib。之后还需要添加如下这些依赖:

gcc:lib, dbus, fontconfig, freetype, libxml2, libxslt, libice, libsm,
libxcomposite, libxdamage, libxkbcommon, libxrender, libxmu, libxxf86vm

最后把 lib 加入到$LD_LIBRARY_PATH里:

export LD_LIBRARY_PATH="/run/current-system/profile/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="$HOME/.guix-profile/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"

这时候就可以顺利启动dropbox了。注意手动安装的glibc的版本一定要和Guix操作系统默认使用的glibc版本一致,否则会导致所有的程序segmentation fault。

欢迎感兴趣的朋友参考我的Guix配置文件,地址在 https://github.com/meiyopeng/guix-config 。(然而并没有人看我的blog)

用了Guix之后真的很舒心,感觉写配置文件就像自己搭建起来一个Linux distro。这辈子都不会再用别的distro了,就像这辈子除了Emacs不会再用别的文本编辑器。