Linux 系统的始末

笔者每每跟随最新版的 Linux From Scratch 走构建流程的时候就会想起下面的三个场景:R 站在旁边看着 K 坐在 PDP-7 前工作,RMS 用着 HHKB 敲代码,以及 Linus 日常竖起的中指。前者是初识计算机时的经典老照片,中间是学习 Linux 到疯魔时候的力量源泉,后者则是同学同事之间日常提及的名场面。无疑是这些人为 Linux 系统如今的发展奠定了基础,非常巧合的是,他们可以串联起概括 Linux 系统发展过程中最重要的三个阶段。

1.1.1 梦的缘起 —— UNIX

说起 Linux 那就不由让人想起 UNIX,作为 Linux 系统的起源,可以说是这个梦开始的地方。正如读者所想,UNIX 的开发者便是自制了一套系统。 1969 年,AT&T 旗下著名的贝尔实验室迫于开发速度过慢退出了 Multics 的开发计划。Multics 是一个 1964 年开始的项目,早期由通用电气和麻省理工学院合作计划,打算打造出一套多用户、多任务、多层次的 Multics 操作系统。贝尔实验室于 1965 年加入该项目,经过了 4 年的努力,这个糅合了太多的特性的 Multics 虽然发布了一些产品,但是性能都很低,AT&T 最终选择撤出了投入 Multics 项目的资源,退出这项合作计划。

虽然 Multics 计划已然行将就木,但被用于开发 Multics 项目的大型主机 GE-645 仍然保留在贝尔实验室。这可能就是命运,此时一个刚刚被招募加入该计划的年轻人在 GE-645 上,写出了一个仿真器,可以让文件系统与内存分页机制运作起来。他同时也写了一个程序语言 Bon,并用其编写了一个太空旅行游戏。在 GE-645 被搬走后,他在实验室中寻找没人使用的机器,并在长他两岁的同事丹尼斯·里奇 1 的帮助下,成功的在 PDP-7 上用汇编语言重写了这个游戏。他进入 Multics 计划不久,计划就中止了,但为数不多的项目经验促使着他在 PDP-7 上继续研究如何开发系统。熟悉这段历史的人应该知道,这位年轻人就是大名鼎鼎的肯·汤普逊 2

在肯·汤普逊和丹尼斯·里奇的主导下,加上近乎 Multics 计划的原班人马的不懈努力,UNIX 先后经历三个版本,终于在 1973 年用 C 语言重写的第三版中稳定下来。用 C 语言编写的 UNIX 代码简洁紧凑、易移植、易读、易修改,为此后 UNIX 的发展奠定了坚实基础。

1.1.2 梦的延续 —— GNU 工程

理查德·马修·斯托曼(Richard Matthew Stallman),同时也是自由软件运动的推动者,唤吾大 RMS,江湖上无人不知无人不晓,就是好名声多还是坏名声多就不知道了。不过有一说一 GNU 工程对于 Linux 系统的影响是不能被磨灭的,整本书大半构建的都是 GNU 工程的产物,但凡看到 g 开头的软件包,脑海里都是 RMS。

RMS

1971 年,彼时的 RMS 刚刚在 MIT 开始他的职业生涯。那个时代是甜蜜的时代,当时的计算机公司都经常发布自由软件,程序员们可以自由地相互合作。上一个故事的 UNIX 也属于这个时代,并在这样的环境中茁壮成长。但随着时间来到 20 世纪 80 年代,放眼望去,几乎所有的软件都是专属软件了。专属软件的出现意味着软件有了拥有者,不再共享源码甚至随意使用,它们是属于个人或者组织的私有财产。这种商业形式摧毁了之前十余年的合作模式,这导致给予他人帮助变得越来越难,社区也开始日益萎缩。

当时摆在 RMS 面前的选择有很多,以他的才华随便找一家专属软件的公司或者自立门户做软件生意都是不错的选择,值得庆幸的是他选择了坚守自己的本心。为了重建社区,首当其冲的就是他和他的社区需要一个操作系统,一个自由的操作系统。为了致敬 UNIX,他将着手的系统命名为 GNU,意为 GNU's Not UNIX。而 GNU 工程也就是开发 GNU 系统的工程。

GNU 操作系统的开发进度是很快的,从 1984 年 RMS 离开 MIT 算起,直到 1990 年 GNU 系统除了内核,其他的部分基本上都完成了。当时决定采用的内核是 Hurd,但最后的结果显而易见,如果成功了显然本书的标题就要改了。

GNU 工程的努力和成果是值得铭记的,我们构建的过程中会逐渐理解到 GNU 工程的伟大,硕果累累的 GNU 工程留下来大量自由软件,这些软件是 Linux 的基石,也是我们构建过程的重点。每个在构建过程中涉及到的自由软件,或多或少会有介绍。你也可以访问 GNU 的官网 https://www.gnu.org/home.zh-cn.html 获取到相关的信息。

1.1.3 注入灵魂 —— Linux 内核

1991 年,Linus Torvalds 开发了一个和 UNIX 兼容的内核,并称之为 Linux。一开始 Linux 是专有软件,但是在 1992 年,Linus 将 Linux 变成了自由软件。把 Linux 和还不完整的 GNU 系统结合在一起就形成了一个完整的自由软件操作系统。

关于这个完整的自由软件操作系统的称呼其实还有 GNU/Linux 这种叫法。GNU 工程为了这个系统努力多年,最后因为使用了 Linux 内核而把自己的名字也丢了,这点确实让人难以接受,所以他们提出用 GNU/Linux 这一提议也是情理之中。有很多人表示支持,GNU 也确实配的上。不过事与愿违,不仅有不少的一部分认为系统的关键是内核,并不认同这一提议,而且大众更喜欢使用 Linux 操作系统,因为这样更顺口。GNU 工程的贡献是值得铭记的,不过本书采用的还是“Linux 系统”这种容易理解的称呼,或者省去系统使“用 Linux”来指代“Linux 系统”或 GNU/Linux,若单指内核会采用“Linux 内核”加以区分。

Linux 内核之所以称之为内核,它所要完成的任务是实现多任务处理、虚拟内存、共享库、请求分页、共享写时复制可执行体、内存管理以及线程等操作系统具体的核心功能。从实现的功能就可以看得出,一个内核对于系统的重要性,就相当于是在在凹凸不平的路面上铺上一层平坦的水泥,这样程序才能在你的计算机里有序的运行。所以 Linux 内核之于 Linux 系统,便如同注入灵魂。决定了系统的性格,也决定了系统的内在基因。

Linux 内核对于 Linux 系统来说固然重要的,但是要做到让 Linux 系统持续保持流行,仅仅是这一点显然不够。Linux 是一个宏内核架构,与之相对的是微内核架构。使用此架构的内核是一个单一的二进制可执行文件,在内核态以监管者模式运行。其优点是内核之中的通信成本很小,内核可以直接调用内核态内的函数,因此性能很好。20 世纪 80 年代前的所有操作系统都采用这种方式实现,也包括 UNIX。但是也有一个很大的缺点,就是移植性不好。

这一点 Linus 自己也承认,他的初衷也并不是使 Linux 成为一个可移植的操作系统。不过有趣的是,事与愿违,Linux 是世界上被移植的最广泛的操作系统内核。服务器、手机、游戏机,即使是被 Windows 制霸的桌面端,相信本书的读者中也有很大一部分用的是 Linux 的某个发行版。

Linux 内核之所以能在如此漫长的岁月中稳步发展,有很大一部分原因是它的开发模式。这种人人都有机会贡献出自己能量的开发模式,吸引到了众多的开发者加入到完善 Linux 内核的过程中。在书写本小节的同时我又重看了一边 Linus 在 2017 年北京的 LC3 的采访。当时笔者也在会场,他说的有些话至今记忆犹新,其中有一些特别适合放在这,这里摘抄两段:

“我觉得有趣的是我认为已经稳定的代码仍然在不断的得到改进,有些东西我们已经很多年没有碰了,然后有人来改进了它们,或者在我以为根本就不会有人用的东西上提交了 Bug 报告。我们有了新的硬件,开发了新的功能,但是 25 年后,我们仍然有老的、非常基础的东西,并且人们依然在关心和改善着它们。”

“当我坐下来开始写 Git,一个首要的原则就是你应该能 fork 并且在此基础上做你自己的事情。如果你有友好的 fork(能证明我错了,并且能够改进内核),在这种情况下,人们可以回来说我们实际上改进了内核,这没有什么不好的感觉。我会采纳你的改进并且将其合并进来。这就是为什么你应该鼓励 fork。你也想让良好的回馈变得很简单。”

采访的视频链接:https://linux.cn/article-8638-1.html

从 Linus 的话中,我们可以看出他对于开发维护 Linux 内核的态度。真的十分感谢 Linus、内核的开发维护人员以及为 Linux 内核提交过贡献的人们。没有他们,Linux 不可能发展的如此迅速,也不可能在特性稳定之后仍能持续完善。

1.1.4 Linux 系统的发行版

说起 Linux 系统的发行版,那可真的是百花齐放,自由软件和开源软件的特性就传播门槛低,Linux 又是其中的明星项目,分支不可谓不多,由于原图过大,书中图片 3 截取的是分支中比较小众的一部分作为展示。

Linux 系统的发行版是通常指的是由一些组织、团体、公司或者个人制作并发行的。Linux 内核主要作为发行版系统的一部分而使用。 根据软件包管理方式进行分类的话,流行的发行版有:

  • 基于 RPM(Red Hat 系)的 RHEL(Red Hat Enterprise Linux)、Fedora、CentOS 和 OpenSUSE 等;
  • 基于 Dpkg(Debian 系)的 Debian、Ubuntu 和 Linux Mint 等;
  • 不同于以上两类的 ArchLinux、Gentoo 和 Slackware 等。

通常来讲,一个 Linux 发行版包括以下部分。

  • Linux 内核;
  • 将整个软件安装到计算机上的一套安装工具;
  • 各种 GNU 软件以及其他的一些自由软件和开源软件;
  • 在一些 Linux 发行版中可能会包含一些专有软件。

自此为止,对于如何自制 Linux 系统这个问题,已经解答了一半了。那便是要构建出如同 Linux 系统的发行版一样,包含以上要件的 Linux 系统。

1

全名丹尼斯·麦卡利斯泰尔·里奇,英文名为 Dennis MacAlistair Ritchie。

2

全名肯尼斯·蓝·汤普逊,英文名为 Kenneth Lane Thompson。

3

源自 https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg。