Linux 0.01 发布35周年:第一版首先是给人读的
1991年9月17日,Linux 0.01 发布。35年后的今天,最值得回顾的并不是它已经拥有多少功能,而是它向读者发出的邀请:打开源码,看清限制,一起把尚未完成的内核向前推进。

把时间拨回那个时刻,先别急着想到服务器、发行版或熟悉的安装界面。一位开发者让自己的电脑运行起来了,另一位读者则刚拿到一份代码,需要摸索怎样在另一台机器上复现结果。这两件事之间,还有很长的一段工程距离。Linux 的第一次发布并没有把这段距离藏起来。
它交给外界的,是一个可以检查、讨论和继续修改的设计。在极客日历记录的这个纪念日里,我们不妨换个问题:当软件还不能让陌生人轻松使用时,公开它究竟有什么价值?Linux 0.01 的文档给出的答案,比一条从起点直通成功的时间线更有意思。
Linux 为什么有不止一个“生日”?
1991年8月25日、9月17日和10月5日,分别对应不同阶段。8月,Linus Torvalds 在 MINIX 新闻组征求意见;9月,最早的源码版本 0.01 对外发布;10月,他又公开介绍了一个已经更能实际使用的系统。把它们合并成一次盛大的产品发布,会抹去“宣布正在做”“把代码交出来”和“让别人用起来”之间的区别。
Linux 0.01 的历史归档条目记录了1991年9月17日,同时也标明了2007年的 Git 导入时间。这并不矛盾:后来的仓库可以保存更早的发布日期,但页面上的记录并不意味着1991年就有人为这个项目提交了 Git 代码。
Torvalds 在1992年整理早期新闻组帖子时,回忆第一版大约在9月中旬发布。精确的归档日期与大致的个人记忆,是两种不同证据。今天纪念的是源码发布,而不是这个项目第一次进入公众视野。
下载 0.01,实际拿到的是什么?
Linux 0.01 的原始发布说明描述了一个面向 386 AT 电脑的内核。读者需要修改配置,再自行编译。VGA 或 EGA 显示器、合适的硬盘控制器,甚至直接写在代码里的芬兰键盘布局,都是文档提到的现实条件。Torvalds 说,他已经在两台机器上生成了能够运行的内核。
这些看似琐碎的细节,恰好能说明原型与产品的差别。一台电脑上的成功,并不能自动证明另一位读者也能重现它。设备支持、文件准备、构建工具和说明文字,各自都是需要完成的工作。给项目标上一个版本号,不会让这些问题自行消失。
内核负责管理资源,并在程序与硬件之间进行协调。但要形成能用的操作环境,还需要程序、库和工具。早期说明明确区分了这些部分,也指出 GNU 软件是重要的工具来源。因此,不能把 0.01 想象成今天某个 Linux 发行版的缩小版:它发布的是其中一个关键组成部分。
需要 MINIX,并不等于使用了 MINIX 的代码
发布说明同时写了两件事:Linux 不包含 MINIX 代码,但当时需要 MINIX 帮助建立最初的运行环境。只有把“实现本身”和“准备它所用的环境”混为一谈,这才像个矛盾。一个程序完全可能借助另一个系统完成构建,而不复制那个系统的实现。
这就像借用工作台制作一件设备。设备是在工作台上做出来的,却不等于它是从工作台上拆下的一块木头。早期 Linux 需要现成环境来准备文件、完成构建;与 MINIX 文件系统的兼容,也方便两边处理相同的数据。
这种区别对理解软件项目仍然有用。所谓“独立”,究竟指源码独立、构建工具独立、可以单独安装,还是维护组织独立?这几道问题可能得到不同答案。第一次公开一个新设计,并不要求它在同一天解决所有依赖。
第一版到底能不能运行?
这里值得保留一个真实的措辞差异。1991年的发布说明提到两台可以运行内核的电脑,同时强调这次发布主要供人阅读。Torvalds 后来的回顾却把 0.01 源码描述为并不能真正运行。只挑其中一句,都会让历史显得过于整齐。
能够稳妥得出的结论是:0.01 是一份带有严重实际限制的源码发布,并不是给任意读者准备的可靠安装包。仅凭这些文档,无法完全确认需要哪些准备、是否涉及本地修改,以及不同预期如何造成了表述差异。没有必要为这段空白编造一个解释。
相反,我们可以借此学会区分三种说法:“作者的机器能运行”“归档中的代码能够构建”“另一位读者可以复现结果”。它们并不等价。好的发布文档应该说明,究竟验证了哪一层。知道 Linux 后来取得成功,也不代表早期每一步都已具备成熟产品的可复现性。
后来能够移植,不代表最初就为所有机器设计
早期 Linux 有意利用 386 的特性,发布说明也承认这会增加移植难度。文档还解释,内核主体、文件系统和内存管理会在同一代码与数据空间中运行。这体现了它早期的单体式内核设计。
因此,“尚未完成”并不只意味着缺几个功能。有些限制来自实际取舍:先让一台具体机器工作,才能检验真实的实现。等到目标扩大,再回头检查哪些处理器假设已经进入设计深处。局部可行的办法可以成为起点,却还不是普遍适用的方案。
我们关于Dennis Ritchie、C 与 Unix 可移植性的文章提供了另一面。大量使用 C 语言,不会自动消除所有处理器依赖。语言可以让修改更容易,但系统架构仍可能紧紧依赖某一种硬件。把这两层分开,才能准确理解早期 Linux 的选择。
GPL 是后来的里程碑
今天谈 Linux 很容易立刻想到 GPL,但不能把后来的许可安排直接放回1991年9月。0.01 的条件要求提供源码、保留版权声明,同时禁止为分发收费,连手续费也不允许。这还不是后来采用的 GPL 安排。
Linux 0.12 的发布说明提出取消收费限制,转向 GNU copyleft 条件,同时让参与编写代码的人有机会提出异议。文档将2月1日列为预定生效时间。放在1992年初的语境中,这显然是第一次源码发布之后的另一个节点。
这里最重要的历史区别是:把代码公开,与决定别人可以如何再分发它,是两项不同选择。规则会影响参与者能够开展哪些工作。承认第一次发布的重要性,不需要假装它已经带齐后来形成的整套协作条件。观察条件怎样逐步变化,反而更能看清一个项目如何成长。
用阅读来纪念一次面向读者的发布
想认识 0.01,可以先读发布说明,分别标出三类内容:作者确认能做什么、哪些地方尚未完成、哪些要求只适用于特定硬件。随后再对照 Torvalds 的后期回忆。这个练习不需要在日常电脑上安装古老系统,却能帮助我们把历史材料与后来形成的故事分开。
Linux 0.01 的价值,在于设计尚有明显限制时,就让其他人有机会接触它。读者可以开始理解、质疑和改进。35年后,值得纪念的正是这一刻的开放:第一版不必装下整个未来,也能为下一步创造条件。
