以Funtoo为基础的Linux桌面系统(2)

构建自己的Linux桌面系统的第一步,就是根据Funtoo网站上提供的wiki页面,编译,安装和配置基础系统(base system)。这包括

如果你对类Unix系统的基本概念非常了解,这个过程看上去应该是水到渠成的。安装的细节虽然无需多言,Funtoo提供的指南已经十分详尽,但这里却有一些非常有趣的概念值得讨论。

第一,这个安装过程的全部魔法都在chroot命令上。我一直以为这个命令是类Unix操作系统设计的精华之一。为什么这么说呢?众所周知,Linux操作系统对它的跟文件系统有一个必要的假设。即,根文件系统是一棵树。而这个树的根就是“/”。像硬盘,SSD之类的块设备可以通过“挂载”(mount)的方式,将实体的存储设备挂载到这棵逻辑中存在的树的任意节点上。当系统在这棵树上创建新文件或者修改任何既有内容时,这种变更就会被反映到实际的存储设备上。树结构的妙处在于,任意一棵子树和拥有该子树的“大树”总是相似的。当你将准备好的硬盘分区挂载到这棵树上,并且chroot进入这个树的子树,你就的到了一个全新的“根文件系统”。但于此同时,系统运行的却是原来大树中预装的Linux内核,由此来帮助新文件系统的生成。这种方法在Windows系统中听起来有点像天方夜谭但是在Linux系统中,却是司空见惯。采用这种方法可也在多个不同的根文件系统之间无缝的切换,比如,你可以在一个64位系统的根文件系统的某一棵子树上创建一个32位系统子树。这对于很多系统测试和环境搭建都不无裨益。一个典型的例子就是debian系统采用chroot的方式帮助开发者创建一个便于创建软件包的标准环境,由此,.deb包才可以避免现有系统不同配置的影响而适用与各种不同配置的系统。

第二,这个安装过程实际上那个暗示了如何从无到有得建造一个操作系统。Linux操作系统的发端就是1990年Linux写给邮件列表的那封信。在已有系统软件——包括编译器,链接器的帮助下,生产内核代码才是可能的。用软件来制造软件。这是一个非常自然的过程。我记得有一句话叫“以机器制造机器标志这第二次工业革命的开始”。而以软件制造软件也是现在软件行业的一个重要标志。也只有当这种衍生和扩展的能力和半导体的几何级数式的蓬勃发展结合起来的时候,这种能力才创造了极大的社会财富。

第三,一些配置和编译的选择也值得讨论一下。

首当其冲的就是UEFI和GPT分区。区别与传统的BIOS和MBR分区,这两个技术都有一些进步。GPT几乎是必要的(desirable)。但是,如果你的系统主板是建立在UEFI之上的话,Linux系统可能会遇到一些问题。这并不是Linux的错,而是因为大多说UEFI固件都缺乏必要的测试问题百出,以至于根本无法保证系统兼容性。对于后面这一点我实在没有什么好的建议,大概能说的只有一条,选择UEFI主板的时候一定要先调查一下再做决定。

创建分区和创建文件系统的分离是让那些在Windows中模糊成一团的操作系统概念变得更加清晰了。对文件系统的选择又是另一个问题。一般来说根据用户的实际应用应该选择不同的文件系统,比如,一些文件在处理“小文件”的时候有明显优势,一些文件系统有灵活配置的特性等等。当然,ext4文件系统适用于大多数桌面应用。虽然这个指南中仅仅提供了传统的采用/dev/sd*方式记述的/etc/fstab,但实际上Funtoo也支持UUID作为标记/etc/fstab中使用。

对很多中文用户来说,键盘布局不是问题。因为,大多数在中国销售的计算机实际上是直接使用英语键盘布局的,所以/etc/conf.d/keymaps中采用默认值没有什么问题。我的情况比较特殊,因为日语键盘布局与英文键盘布局存在相当大的差异。我必须在上面提到的文件中制定键盘布局为jp106。如果你想在运行时改变系统的键盘布局,可以使用下面的命令。

setxkbmap xx   ## xx 是两个字母的国家代码,比如us

当编译安装好的内核和基础系统可以启动以后,我尝试继续跟随Funtoo的指南对基础系统升级并且安装了X Server和必要的系统软件。这样,一个极简洁的Linux操作系统诞生了。

以Funtoo为基础的Linux桌面系统(1)

这个系列的最初起源是一大堆牢骚。当我觉得自己拯救自己的时候,我问了自己这样的问题——如果Ubuntu是错的,那么什么样的桌面系统是对的?也许我尚未找到答案,但至少我觉得以下几点是一个优秀的Linux桌面系统必须具备的特性

  • 源代码是开源软件的灵魂,优秀的包管理系统是强健的骨骼;这个系统必须无缝的升级并且尽可能的贴近源码。
  • 桌面系统必须是轻量级的;它可以快速的启动和关闭。
  • 使用什么样的应用程序应该由用户选择,而这些应用程序之间可以通过统一接口调用。

第一个要求将我引向了Gentoo。Gentoo Linux是以源代码为基础的发行版。它最重要的特色就是portage/emerge包管理系统。每一个Gentoo软件包全部都会在初次安装时从软件的源代码编译生成。每当软件推出新版本的时候,portage/emerge可以帮助用户重新编译并且安装新版本。同时,portage/emerge还可以根据用户的需要,安装同一个软件的多个不同版本。因为不需要二进制和打包的中间过程,这种升级就真正做到了“无缝”。因为系统组建之间之间无非就是动态链接和静态链接创建的简单耦合。所以,它也消除了以二进制文件为基础的包管理系统所创建的不必要的强耦合关系。这使得用户升级和调试单独软件包是获得了充分的自由。这种自由还体现在一种叫做Overlay的机制上。Overlay就是“覆盖”的意思。Gentoo通过这种机制让用户可以创建自己的软件包,并且将这些软件包按照一定的规则排列成树状结构来覆盖/定制官方默认的编译选项和软件特性。当然,用户也可以给自己的Overlay中添加新软件。很多用户在使用Gentoo的同时会创建自己的Overlay。我也将自己的对软件包的选择固化成了一个Overlay,你可以在这里找到它。Funtoo Linux是在Gentoo项目的基础上发展起来的新项目,它区别于Gentoo的最大特色在于以git为核心的软件包更新机制(虽然现在Gentoo也支持以git为基础的同步和升级)。除此以外,Funtoo还提供了比Gentoo更优秀的用户辅助工具——比如boot-update,所以我选择了Funtoo作为基础来建造自己的桌面系统。

对于第二个问题,我的答案是Openbox。为什么不是Gnome或者KDE这样的Desktop environment?因为Gnome项目已经“误入歧途”,至少这是我通过观察得到的结论。而KDE却也不能称作“轻量级”。那么只有在众多的Window Manager(窗口管理器)中选择一款了。我最初尝试了Fluxbox,它非常优秀,可是对于cjk用户并不友好,因为我的Firefox的窗口标题连不能显示中文或者日语这些双字节文字。于是理所当然的,我选择了Openbox。Openbox的开发相对活跃,并且拥有广泛的用户基础。很多发行版都提供了Openbox软件,更有一款非常引人注目的Crunchbang发行版将Openbox作为桌面系统解决方案的基础。这也正是我学习的对象。

最后一点是最贴近用户的问题。每个人对软件的偏好不一样,所以,桌面系统中使用什么样的软件应该由用户自己来决定。一个Web开发者的桌面系统和一个Android开发者的桌面系统应当有很大的区别。比如,前者可能需要curl,bluefish,python/PHP编辑器和多个不同的浏览器——采用wine或者虚拟机安装的IE,不同版本的Firefox和Chrome——等等;而后者,则需要编译Android软件的必要的库和工具,可以运行虚拟机的Java环境,eclipse集成开发环境等等。核心工具集以外的软件,在大多数情况下只能被称作“冗余”而别无他用。当Ubuntu一股脑塞给我OpenOffice套件和Evolution的时候,往往我在安装结束后做的第一件事情就是卸载掉这些冗余。另一个问题是应用程序之间的接口。比如,Windows的COM组件,还有Mac OS的Apple Script,它们都提供了一个完全或者不完全的统一接口来解决应用程序之间通信和“宏操作”的问题。Linux桌面也同样必须拥有这样的机制,否则可能连copy/paste操作也是问题。DBus就是解决这个问题的不二之选。

Windows的Copycat及其他

Ubuntu 12.04发布以后,这个Linux发行版就彻底地让我失望了。臃肿的身躯加上人机交互混沌的令人发指的Unity桌面,已经跟我需要的Linux桌面系统已经相去甚远。沙扬挪拉,Ubuntu。作为一个从6.04开始使用Ubuntu的用户,我不得不跟这个桌面系统说一声再见了。不是因为它在Xeon(R) CPU E31240 + Dual-channel 8GB内存的PC上居然启动的比Windows 7还慢,也不是因为它让我连应用程序菜单在哪里都找不到,只是因为它越来越像一个Windows的Copycat。

也许Ubuntu深受很多从Windows系统迁移过来的超级用户喜爱,但是它却已经失去了很多真正的Linux Users。Linux用户与Windows用户最根本区别的在于,前者确切地知道自己真正需要什么并且知道如何获得和实现他们自身的需要——因为开源软件提供了这种自由,而后者则恰恰相反。Windows从诞生以来就是救世主,它给你一切,让你毫不怀疑的享受这种安逸,让你无法主动地寻找自己的真正需要。由此,它越来臃肿越来越庞大越来越多的消耗更多的包括硬盘,内存和计算能力在内的系统资源。其实我并不单独厌恶Windows的这种给与和扩张,因为几乎所有的商业软件都具有极强的扩张性——比如很多字处理软件都包含拼写检查这个重复的功能,而我真正厌恶的是它对用户自由的侵害。为什么这么说?因为它们将用户假设为无法学习的群体,与Windows交互的最宏观的过程可以总结为“You pay, you go”。所有的软件问题都是需要钱才能解决,而且最根本的这些问题只能由拥有源代码的私有公司解决。这是最基础的假设。如果说,对于一个家庭主妇或者某位非计算机行业/专业人士,这大概没有什么问题。但是,在这种环境之中成长起来的程序员却会慢慢失去学习的意愿和能力。如果你想用“我要将目光集中到我自己的业务上去”这样的话来辩驳的时候,你已经错了,如果你是一位程序员的话。因为那些用来调查和调整系统错误的时间——所谓的“浪费”——事实上一种必备的能力。因为你需要知道计算机的一切!

“……,我从来不把安逸和快乐看作是生活目的的本身——这种伦理基础我叫它猪栏理想。” ——爱因斯坦

对一个人来说,停止思考之日便是他的死亡之时。对程序员来说更是如此。闭源软件正在带着停止思考的你我渐渐死去。

Ubuntu有了软件商店,这是一件好事。它本来有机会开拓一个新的开源软件的开发模式。但不幸的是它却偏离的开放源代码软件的初衷。开源软件真正的意义在于“开放源代码”!而不是“免费”。假设,你买到Photoshop套件的同时可以获得它的源码,难道你不开心么,难道你不想要这样的软件么?我想有人会提到“盗版”。看上去会很复杂,但“盗版”和开源事实上不是同一个命题。闭源软件同样会被盗版。真正保护版权的是适当的法律和严格的执行。不要跟我提中国市场上猖獗的盗版,因为中国软件市场,软件人才事实上是被上述猪栏思想和猖獗的盗版所戕害的。

没有哪个商业操作系统或者Linux发行版能够提供给你那个你确切需要的软件平台。只有自己动手,对,就是自己动手,你才有可能重新控制并且掌握你的计算机,才能享受到开源软件提供给你的自由。Ubuntu 6.04推出的时候,它最成功的地方不是它的liveCD,而是那个有大约3000多行的HOWTO——一个简洁明快的Wikipage。它提供给用户一个运行良好的基础系统,并且提供了多达2万的可选软件包。它还写了一份详实的文档帮助你定制自己的系统。这就是最初的Ubuntu。如果它要模范Windows,或者像Mac OS那样仅仅将开源软件作为架子想“给用户一切”,那它就完全错了。

一声看似潇洒的沙扬挪拉不会解决任何问题。作为一个Linux User我只有自己救自己。