SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor

Unix 和 Linux 简史:从1969年到今天

了解 Unix 如何从 1969 年 Bell Labs 走向 Linux:AT&T 许可、Berkeley BSD、1992 年诉讼,以及服务器为何最终选择 Linux 而非 BSD。

Unix 和 Linux 的简史

Unix 和 Linux 的历史,长期围绕一个问题展开:谁有权拥有源代码。Unix 于 1969 年起源于 Bell Labs。Linux 于 1991 年在 Helsinki 开始开发,未使用 Unix 的任何原始代码。两者之间传承的是设计理念和一组公开发布的接口:文件、进程、管道,以及用于组合小型程序的 shell。20 世纪 70 年代,Unix 通过大学广泛传播,因为 1956 年的一项反垄断和解协议禁止 AT&T(American Telephone and Telegraph)销售软件,因此 Bell Labs 改为以低价许可源代码。Unix 最终无处不在,但 AT&T 以外没有任何组织拥有它;随后发生的许可争议,决定了哪一种类 Unix 自由系统最终运行在您的服务器机架中。

1969:一台备用 PDP-7,以及经受住时间考验的理念

Bell Labs 于 1969 年退出了 Multics 项目。Multics(multiplexed information and computing service,复用信息与计算服务)是与 MIT 和 General Electric 共同开发的大型分时系统,Bell Labs 认为它规模过大,无法完成。Ken Thompson 保留了其中有用的理念,舍弃其余部分,并在一台淘汰的 PDP-7 小型计算机上编写了一个小型分时系统。Dennis Ritchie 加入了他的工作。Unix 这个名称是拿 Multics 开的玩笑。

1970 年,该系统迁移到 Bell Labs 为专利部门打字员购置的 PDP-11 上,因为文本处理工具比操作系统更容易获得经费。那台机器配备了 24 KB 核心内存,由系统和用户程序共同使用。这次经费安排上的偶然结果,促成了第一份 Unix 手册;该手册的日期是 1971 年 11 月,内容是一组经过排版的文档。这也是您至今仍要输入 man 5 crontab 的原因。该手册中的章节编号,就是本手册使用的章节编号。

两项变更使这一设计得以长期保留。管道在 1973 年的 Version 3 中出现,因为 Doug McIlroy 多年来一直主张,程序应能够首尾连接;Thompson 随后加入了 | 运算符,使一个程序的输出成为下一个程序的输入。同年晚些时候发布的 Version 4 改用 C 重写。使用可移植语言编写的操作系统可以迁移到最初并非为其设计的硬件上,这正是 Unix 比最初运行它的所有机器都更长久的原因。

Unix 为何传播开来:AT&T 不得销售它

1956 年的一项同意令解决了针对 AT&T 的反垄断案件。AT&T 保留了电话垄断地位,同时接受了一项限制:除电信业务外,不得经营其他业务。软件属于这些业务之一。因此,当大学请求获得 Unix 时,Bell Labs 不能将其作为产品销售。它只能以象征性费用授予源代码许可,不提供支持,也不提供担保。

影响非常大,而且这并非 AT&T 的计划。1975 年发布的 Sixth Edition Unix 通过完整源代码进入了数百个计算机科学系。新南威尔士大学的 John Lions 打印了该内核源代码,并逐行编写注释,利用它开展教学。一代人通过阅读真实的操作系统,了解了操作系统的工作方式。

后来,许可条款发生了变化。1979 年的 Seventh Edition 许可禁止在课堂上使用源代码,因此 Lions 的注释只能以复印件的复印件形式流传。这就是整个故事的基本状况。Unix 同时无处不在,又不具备自由软件的许可,因此任何人所作的改进,实际上都是对他人专有代码的改进。

Berkeley:您实际输入的 Unix 部分

Ken Thompson 在 1975 至 1976 学年就读于 University of California, Berkeley,之后留下了一个非常活跃的 Unix 社区。Berkeley 的 Computer Systems Research Group(CSRG)发布了包含本地改进的磁带,这些磁带后来成为 BSD,即 Berkeley Software Distribution。Bill Joy 完成了早期的大部分工作:1978 年发布 1BSD,1979 年发布 2BSD,其中包含 vi 编辑器和 C shell。

C shell 是 !!!$ 的来源。Bash 继承了这套语法,因此即使在四十多年后的今天,在双引号中输入感叹号时,bash 历史扩展仍会让人感到意外

随后,DARPA(美国国防高级研究计划局)出资让 Berkeley 将新的互联网协议加入 Unix。4.2BSD 于 1983 年 8 月发布,其中包含 TCP/IP(传输控制协议 over 互联网协议)和套接字应用程序编程接口。服务器上的每个网络服务仍会依次调用 socket()bind()listen()accept(),因为这些名称是 Berkeley 在 1983 年确定的。

有一个细节决定了接下来的十年。BSD 磁带并不是完整的系统,而是对 AT&T Unix 的一组补充;要合法运行它,您需要有效的 AT&T 源代码许可证。Berkeley 花了数年时间逐个文件地用自己的代码替换 AT&T 的部分。这样的替换是否真正完整,后来成为诉诸法庭的问题。

1984:分拆,随后是 Unix 混战

Bell System 于 1984 年 1 月 1 日分拆,要求 AT&T 不得从事软件业务的同意判决也随之失效。AT&T 现在可以将 Unix 作为产品销售,并且确实这样做了。商业源代码许可证变得十分昂贵,Unix 不再是大学提供给学生的廉价系统。

各家厂商此前已经对 Unix 进行了分叉。每家工作站公司都在自有硬件上提供自己的 Unix,因此到了 1980 年代后期,为某个平台编写的程序需要移植到另一个平台。1988 年,行业分裂为两个标准阵营:一方是 Open Software Foundation,另一方是 Unix International。双方多年间持续发布彼此不兼容的系统,同时争论哪一个 Unix 才是真正的 Unix。

POSIX(可移植操作系统接口)就是在这场混乱中形成的。IEEE 1003.1 于 1988 年发布,明确规定类 Unix 系统必须实现的内容:系统调用、shell 行为、标准实用程序和 C 库接口。这一点的重要性超出表面理解,因为标准是规范,不受任何许可证限制。3 年后,一名学生根据这些文档编写了一个内核。

Minix,以及它留下的空缺

Andrew Tanenbaum 于 1987 年发布了 Minix,作为其操作系统教材配套的教学系统。Minix 是一个小型类 Unix 系统,源代码随教材提供,并且可以运行在学生实际拥有的廉价 PC 上。在课堂中阅读其源代码是合法的,而第七版 Unix 已不再允许这样做。

Minix 有意保持小型,因为它必须能够在教材中讲清楚;Tanenbaum 也拒绝了会使其成为生产系统的补丁。其许可证同样不是自由许可证:用户需要购买教材,而且无权自行决定是否重新分发修改后的 Minix。因此,到 1991 年,学生可以阅读一个可运行的类 Unix 内核,却无法在其基础上构建任何能够长期发展的系统。

GNU 具备除内核之外的一切

Richard Stallman 于 1983 年 9 月宣布启动 GNU 项目,目标是构建一个完整的自由 Unix-like 系统。到 1991 年,GNU 已经完成了内核周边的大部分组件:GCC 编译器、GNU C 库、二进制工具,以及 bash。bash 是 Brian Fox 于 1989 年编写的 shell,也是服务器如今为您启动的 shell。GNU 内核 Hurd 则一直迟迟未能完成。

GNU General Public License version 2 于 1991 年 6 月发布。其规则很简单。您可以使用和修改代码;如果分发修改后的结果,则必须按照相同条款分发源代码。这条规则将在两节之后成为本故事的关键。

1991年8月:发布到 comp.os.minix 的帖子

1991年8月25日,赫尔辛基的一名学生在 Usenet 群组 comp.os.minix 中发布了以下内容:

Hello everybody out there using minix -

I'm doing a (free) operating system (just a hobby, won't be big and
professional like gnu) for 386(486) AT clones.

0.01 版本于1991年9月发布。它既没有与 Unix 共享代码,也没有与 Minix 共享代码。这是一个面向 386 的新内核,在 Minix 机器上开发,按照 POSIX 接口编写,并配合当时已经存在的 GNU 工具使用。1992年1月,Tanenbaum 告诉 Torvalds,单体内核是一种过时的设计。就设计而言,他的观点确有道理;但 Torvalds 回答的是另一个问题:如何让系统在学生拥有的那台廉价计算机上良好运行。

1992年2月,0.12 版本根据 GPL 重新授权。Torvalds 后来称这是他做出的最佳决定。原始的 Linux 许可证禁止任何资金交易,这会阻碍随后出现的 CD 供应商和技术支持公司。GPL 允许商业活动,同时要求所有分发的修改都回到同一份共享代码树中。

诉讼:1992年4月至1994年2月

Berkeley 于1991年6月发布了 Networking Release 2(Net/2):这是一个几乎完整的 BSD 系统,但已移除源自 AT&T 的文件。其中缺少6个内核文件。Bill 和 Lynne Jolitz 编写了替代文件,并于1992年3月发布 386BSD 0.0,随后于1992年7月14日发布 386BSD 0.1。此时,386 平台已经有了一个免费、完整且成熟的 BSD 系统,而 Linux 仍只是一个业余内核。Berkeley Software Design, Inc.(BSDi)销售受支持的商业版本 BSD/386,并使用电话号码 1-800-ITS-UNIX 为其做广告。

1992年4月,Unix System Laboratories(USL)在新泽西州联邦法院起诉 BSDi。USL 当时是 AT&T 旗下、拥有 Unix 的子公司,起诉理由涉及商业秘密和 Unix 商标。之后,诉状修订,将 University of California 的 Regents 也列为被告。该大学于1993年在加利福尼亚州反诉,认为 AT&T 在 System V 中发布了 Berkeley 的代码,却没有按照其自身许可证的要求注明来源。

案件的法律基础在1993年开始瓦解。法官 Dickinson Debevoise 拒绝向 USL 发布初步禁令。他认为,USL 针对较早的 32V 代码提出的版权主张很可能无效,因为 AT&T 多年来发布这些代码时都没有附带版权声明。1993年年中,Novell 从 AT&T 手中收购了 USL,Novell 管理层希望尽快结束这场争端。案件于1994年2月和解。在 Berkeley 发行版大约18,000个文件中,有3个被移除,约70个文件增加了 USL 版权声明。

Berkeley 于1994年6月发布了 4.4BSD-Lite,该版本在法律上不存在问题。FreeBSD 和 NetBSD 都成立于1993年,最初基于存在争议的 Net/2 代码,因此必须以新的代码库为基础重建系统,这项工作占据了1994年余下的大部分时间。Linux 1.0 于1994年3月发布,正值这次重建工作进行期间。

Linux 为什么占据了服务器领域,而不是 BSD?

诉讼是最常见的答案,而且确实是原因之一。1992 年 4 月到 1994 年 2 月期间,任何想为产品选择免费 Unix 的人,都必须在 AT&T 律师提出的有效法律主张,与一名芬兰学生编写的、无人可以据此起诉的内核之间进行权衡。互联网正是在这个时间窗口进入公众视野,最早的 Linux 发行版也在此期间出现:Slackware 于 1993 年 7 月发布,Debian 于 1993 年 8 月发布,随后是 Red Hat 和 SUSE。

另外 4 个因素与诉讼同样重要。

  • 硬件。Linux 从第一行代码开始就面向大众化的 386 PC,而这种硬件后来变得十分便宜。BSD 的重心是 VAX 和工作站,386 移植则是由 2 个人在系统外部完成的工作。
  • 许可证。GPL 要求发布修改版内核的公司公开其修改内容,因此厂商的改动会回流到同一个代码树中。BSD 许可证允许公司保留自己的修改内容,而各家公司确实这样做了。
  • 开发模式。Torvalds 快速合并陌生贡献者提交的补丁,并持续发布新版本。386BSD 的发布速度过慢,以至于其用户在 1993 年先后将其分叉为 NetBSD 和 FreeBSD,并于 1995 年再次分叉出 OpenBSD。
  • 发展势头。开发者会选择其他开发者已经聚集的系统,驱动程序也会优先为用户数量最多的系统编写。

应当客观看待这个技术问题。1994 年的 BSD 是更成熟的系统,拥有一致的基础系统、完整的历史记录,以及 Linux 花费多年才追赶上的网络代码。1994 年没有人因为 Linux 更好而选择它。人们选择 Linux,是因为它已经可用、没有法律负担、能够运行在他们已经拥有的硬件上,并且每周都在改进。

BSD 保留了什么,以及它如今运行在哪里

BSD 延续了下来。它失去的是默认地位。最直接的证据就在您的机器上:OpenBSD 项目于 1999 年编写了 OpenSSH,而如今几乎所有发布的 Linux 系统都将其作为 SSH 服务器,这也是为什么值得学习的 SSH 密钥使用习惯在这两个家族中完全相同。

Netflix 使用 FreeBSD 设备提供视频服务。Juniper 路由器使用的操作系统 Junos,其底层是 FreeBSD。PlayStation 系统软件源自 FreeBSD。Apple 的 macOS 和 iOS 在内核及整个用户空间中都包含 BSD 代码。正是这种宽松许可证,使 BSD 失去了共享服务器代码树,却让 BSD 代码进入了大量从未提及 BSD 的硬件。

如果您现在做选择,问题应从实用角度出发,而不是回顾历史。比较 Linux 和 FreeBSD 作为服务器,关键在于 ZFS、jail、ports tree,以及有多少第三方软件默认依赖 Linux。将 FreeBSD 15 用作服务器意味着使用一个当前仍受维护的系统,而不是参观博物馆展品。至于Linux 与 Windows Server 的比较,这是另一个问题,答案取决于您的应用技术栈。

您今天在 VPS 上使用的 1969 年设计

其中每一项都比大多数使用它的人更早出现。

  • 管道。who | wc -l 会统计已登录用户,因为 1973 年的 Unix Version 3 允许一个程序的输出成为另一个程序的输入。
  • 手册章节。man 1 lsman 5 crontab 使用 1971 年 11 月版手册中的编号方案。
  • 文件系统划分。/usr 的存在,是因为 1971 年那台 PDP-11 的根磁盘已满,开发人员于是将文件移到第二个磁盘组。此后,各发行版逐渐取消了这种划分:在 Ubuntu 24.04 或 Debian 13 上运行 ls -ld /bin,会得到指向 usr/bin 的符号链接。
  • socket 调用。Berkeley 在 1983 年为 4.2BSD 编写了这些调用,此后每个网络守护进程仍在使用它们。
  • POSIX。根据该标准编写的 #!/bin/sh 脚本可以在 Linux、FreeBSD、macOS 和 Solaris 上原样运行,因为这些系统都实现了这一标准。

当您租用虚拟专用服务器并登录时,您是在一个为拥有 24 KB 内存且需要服务专利部门的机器设计的接口上输入命令。它之所以延续至今,是因为这个接口被公开、经过讨论和标准化,随后又由无法查看原始代码的人从头重新实现。

FAQ

Linux 是否包含任何原始 Unix 代码?

不包含。Linus Torvalds 从1991年开始从头编写内核,目标是实现 POSIX 接口,而不是使用任何 AT&T 源代码。Unix 的继承体现在设计和公开接口上,包括文件、进程、管道以及系统调用名称。内核周围的 GNU 工具也从头编写,始于1983年。这种独立性使 AT&T 针对 BSD 代码提起的诉讼完全没有波及 Linux。

AT&T 针对 BSD 的诉讼发生在什么时候?它是否终结了 BSD?

拥有 Unix 的 AT&T 子公司 USL 于1992年4月起诉 BSDi,之后又将加州大学列为被告。1993年,法官拒绝发布初步禁令,认为针对较早版本 32V 代码的版权主张很可能无效。Novell 于1993年年中收购 USL,并于1994年2月解决了此案:约18,000个文件中有3个被移除,约70个文件获得新的版权声明。这并未终结 BSD。在这两年中,全球正在选择一种自由 Unix,而诉讼使 BSD 的采用陷入停滞。

Linux 为什么取代 BSD 成为服务器系统?

法律确定性是原因之一:在1992年至1993年期间,Linux 没有卷入诉讼,而 BSD 正在应诉。其他原因包括从第一天起就以386为目标、GPL 将厂商修改重新纳入同一代码树,以及足够快速的合并流程,使贡献者能够持续参与;与此同时,386BSD 分裂成了三个分支。决定性因素并不是技术优势,因为在1994年,BSD 是完成度更高的系统。

FreeBSD 现在仍然值得运行吗?

值得,原因很具体:ZFS 已集成到基础系统中,jails 提供成熟的隔离模型,基础系统作为一个协调一致的整体开发,并且文档能够保持准确。代价是需要投入兼容性工作,因为大多数第三方服务器软件、容器工具和厂商支持都以 Linux 为前提。应在 FreeBSD 的存储和网络能力足以抵偿这项代价时选择它,而不是出于对旧有 Unix 系谱的忠诚。