Linux 往事

2023-04-17 ⏳8.5分钟(3.4千字)

最近读到 Lars Wirzenius1 写的文章2,他是 Linus 的同学,参与并见证了 Linux 系统从无到有的历史。想想人家上的大学,再比较一下自己的学生时代,真是让人唏嘘呀。今天把文章编译成中文分享给大家。

我叫 Lars Wirzenius,我参与了 Linux 系统的创造过程。Linux 当前在全世界范围内已经非常成功,但当作它起源却很微不足道。本文分享我自己关于早期 Linux 的回忆,包括的诞生,以及它是如何开始走向今天的成功之路的。

1988年秋天,我开始在赫尔辛基大学学习计算机科学。并且在那里遇到了 Linus Torvalds。当年计算机专业的学生中,只有他跟我讲瑞典语。在第一年快要结束的时候,我们开始使用 Unix 服务器。有一次我把 rm 误输入为 rn,结果意外发现了网络新闻组3。这是一种网络讨论系统,rn 就是 Unix 上新闻组的阅读器。我把这个发现告诉了 Linus,然后我们花了大量的时间来探索新闻组里的内容。

到了第二年,我们都离开学习服兵役,但是在不同的地方。我们重返大学校园已经是1990年秋天了。而且两个人都选修了 C 语言和 Unix 编程这门课。这门课也包含了相当多关于 Unix 内核架构的理论内容。这也让我们开始学习其他操作系统内核,比如 QNX 和 Plan 9。就如何设计操作系统这个问题,Linus 和我有过热烈的讨论。我们跟其他二十岁的大学二年级学生一样,自信心爆棚。其实大家都太愿意回首那段青春岁月。

在1991年的1月份,Linus 从本地一家组装电脑商店买到了他的第一台电脑。那是一台 386 机器,在当时相对来说比较时髦,因为 Linus 体验它的多任务功能。而且,他之前使用一台 Sinclair QL 电脑,用的是摩托罗拉的 68008 CPU,这是一种 32 位处理器。所以新电脑也应该是 32 位的,他不想再用回 16 位设备,也就不会考虑 286 CPU 了。Linus 的第一台电脑的内存达到了惊人的 4 MB,而且有一块硬盘。

他搞到了一份游戏拷贝,名叫波斯王子。接下来的几个月的时间一直沉迷其中。他后面买了一份 MINIX4 拷贝,因为用完大学的 Unix 之后,他也想在自己的房间里使用类似的功能。

游戏通关之后,Linus 开始学习 Intel 汇编语言。有一天,他给我展示了一个多任务程序。一个任务或者线程不断在屏幕上输出字母 A,同时另一个输出字母 B。当屏幕上的字符流由 A 变成 B 的时候,我们能明显从视觉上感受到上下文在切换。这段程序后来演变成了大家熟知的 Linux 内核。

Linus 接下来就会扩展这个程序,而且主要用 C 语言编写。与此同时,也就是 1991 年春,我帮他实现了 C 语言的 sprintf() 函数,因为他还没学会怎么写变长参数函数。当时他为每个类型变量都写了一个输出函数。我希望自己写的函数能缓解他的痛苦。该函数的核心代码目前还在 Linux 内核的snprintf()函数5中。

随着时间的推移,Linus 不断优化这个内核雏形并为之添加新的功能。过了一段时日,他已经写好了键盘和串口的驱动程序,实现了 VT100 终端的模拟软件, 这样就可以在屏幕上显示终端转义序列。而且他还可以控制猫拨号到大学网络,这样就能在自己房间浏览新闻组了。简直就是科幻小说。有一天,Linus 搞了一个事故。他在拨号连接大学的时候误把硬盘当成了调制解调器,结果就用 “ATDT”6 和大学的电话号码覆盖了硬盘的启动分区。数据恢复之后,他立马给自己的内核实现了文件权限功能。

到了 1991 年 8 月,Linus 在 comp.os.minix 新闻组首次提到自己的的新内核7。 Linus 在原文中写道:

I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu).

多么谦虚呀。这个系统最早叫 Freax。几周之后,Linus 请求 Ari Lemmke,这是 ftp.funet.fi 的管理员,将 Linux 内核的首个 tar 包上传到 FTP 服务器。Ari 给新软件取名为 Linux。最初版本中有一个源文件8还提到 Freax 这个名字。

这个时候,人们都有兴趣尝试这个新系统。所以 Linus 需要提供安装方法和指导。但他只有一台 PC,所以就跑来用我的电脑来尝试安装。因为它的电脑一直用于开发 Linux,而且是从安装 Minix 升级到 Linux 上的,所以它从来没有经历 Linux 的安装过程。也就是说我的电脑成了第一台从头安装 Linux 的设备。系统安装的时候我打了个盹。所以后来我就推荐的安装方法就是睡一觉,困难的活让 Linus 搞定。

Linux 的第一个版本禁止商业用途。但一些早期的贡献者提议要改成自由软件授权。到了 1991 年秋天,Richard Stallman 访问芬兰。于是我带 Linus 参加了 Stallman 的讨论会。 Stallman 的介绍、加上来自贡献者的压力,以及我的絮叨,最终说服 Linus 在 1992 年开始的时候选择了 GLP 授权。

在那年的圣诞假期,Linus 为 Linux 实现了虚拟内存。这让 Linux 成为更加实用的操作系统,可以在低内存但廉价的机器上运行。

Linus 在 1992 年跟 Andrew Tanenbaum 之间发生了著名的论战9。Andrew Tanenbaum 是一名大学教授,而且是 MINIX 的作者。他对 Linux 系统和 Linux 的架构有自己的观点。 Linux 对 MINIX 也有看法。这场论战被描述为火药味实足,但事后看来都相当地礼貌。

Linux 后来的成功很大程度上源自 X11 系统的移植。这使得 1992 年成了 Linux 桌面之年。

我当时决定专心于社区方面的贡献,相比给直接给内核提交代码,我选择帮助大家回答问题、撰写文档之类的工作。我短暂运营过一个 Linux 相关的新闻列表,主要的兴趣是发布 Linus 的首次采访。后来被 comp.os.linux.announce 取代。

首个 Linux 发行版也是在 1992 年开始,叫 Softlanding Linux System 或者 SLS。第二年,SLS 变成 Slackware,它又启发 Ian Murdock 于 1993 年发起 Debian 项目,为的是建立一种更加基于社区的开始结构。在那之后的几年里,其他发行版也陆续出现。

到了 1993 年,Linus 和我都被大学雇为助教。我们俩共用一间办公室。房间里有一台PC,被 Linus 霸占了,当然是用来开发 Linux。我则很情愿地使用一台 DEC 终端访问新闻组。

有一天,Linus 有点无聊,而且 PC 感觉反应有点迟钝。他花了一天的时间用汇编语言重写了内核的命令行解析器,为的是提高响应速度。(显然这样做相当没有意义,而且解析器后来又用 C 语言重写,为了方便移植。速度不是主要矛盾。)多年以后,他花了好几天来玩游戏 Quake,看起来是为了对内核的内存管理功能做压力测试,虽说那是一台新电脑。那个房间里充满了乐趣,没有任何恶作剧,一点也没有。

在某个时候,Linux 开始支持以太网和 TCP/IP 协议。这意味着人们不通过拨号就能阅读新闻组。不过早期 Linux 的网络代码非常粗糙,后来被从头重写了。有某个时候,Linus 提交了一些有问题的补丁,结果网络中所有的 Sun 机器都无法正常工作。因为那个时候很难修复 Sun 内核的问题,大学在 Linux 系统的 bug 修复之前禁止其连接网络。不能在办公桌上访问新闻组对 Linus 来说就是最大的驱动力。

到了 1994 年春,我们觉着 Linux 差不多已经完善了。完工。不需要再添加新功能了。人们可以用 Linux 来编译 Linux,可以浏览新闻组,还可以一次性运行多个 xeye10 程序。我们决定发布 1.0 版,而且还安排了一次发布活动11。我们邀请了芬兰计算机出版社,一家电视台甚至还派来了摄制组。发布活动主要包括在后台编译 Linux 1.0 内核的仪式,同时 Linus 和其他人畅谈 Linux 是什么以及 Linux 好在哪里。Linux 解释说 PC 上的商业 Unix 系统太昂贵了,自己写一个内核很简单。

到了 1995 年,Linus 跟我开始指导一门软件工程课程。这主要包括大型项目实践。显然课程基于 Linux 系统。我坚持认为应该使用版本控制系统。我也见证了在课程前期学生们使用嗓门版本控制法:学生们通过 NFS 共享源码,有人要修改时就会大喊说「我在编辑这个文件」。这对我来说不是一种有效的办法,所以我坚持使用 CVS,也是当时新学的工具。这段经历让 Linus 非常讨厌 CVS 而且有很多年都拒绝使用版本控制,只是把压缩包直接上传到 FTP 站点。

也是在那一年,Linus 首次把 Linux 移植到一种新的架构上。他搞到了一台 DEC Alpha 机器。那台机器后来给了我,用来当成终端浏览新闻组。还有别人把 Linux 系统移植到其他架构,但我并没有再得到新的机器。

到 1997 年,Linus 毕业并且到美国的 Transmeta 找到一份工作。我在赫尔辛基地区的另一所大学找到一份工作。

接下来的几年里发生了很多事。人们发现 Linux 缺很多功能,所以大家继续开发。人们创造了「开源软件」这个词,而且 IBM 投入大量资金支持 Linux 开发。Netscape 发布了它自己的开源 web 浏览器。简单来说,开源软件基本上接管了整个世界。LWN 也开始运营并且一周一周记录这些历史。

在 1991 年,Linus 写到 Linux 不会像 GNU 那样成为一个大而专业的系统。到了 2023 年,在每个大陆,每个大洋,在数以百万计的设备上,在太空轨道中,甚至在火星上,都有 Linux 在运行。这对于一个开始只有两个线程只能在屏幕上输出 A 和 B 的程序来说已经非常好了。


  1. https://liw.fi↩︎

  2. https://lwn.net/SubscriberLink/928581/841b747332791ac4/↩︎

  3. 英文名为 Usenet,是一种按目录结构组织的内容服务,用户可以自由发布和查询内容。可以理解为早期的论坛,现已淘汰。↩︎

  4. MINIX 是一种为教学而设计的类 Unix 系统。当时 Unix 系统为商业软件,个人很难负担的起。↩︎

  5. https://elixir.bootlin.com/linux/v6.3-rc6/source/lib/vsprintf.c#L2911↩︎

  6. 这是调制解调器的拨号指令,后面接电话号码。↩︎

  7. https://www.cs.cmu.edu/~awb/linux.history.html↩︎

  8. https://elixir.bootlin.com/linux/0.01/source/kernel/Makefile↩︎

  9. https://moss.cs.iit.edu/cs450/assign00-paper.html↩︎

  10. 一种 X11 图形系统下的程序,两只大眼睛👀,会随着鼠标转来转去。↩︎

  11. https://www.youtube.com/watch?v=qaDpjlFpbfo↩︎