Unix与Linux的历史:从1969年至今
了解Unix如何在1969年诞生于贝尔实验室,经历AT&T授权、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 随后加入 | 运算符,使一个程序的输出成为下一个程序的输入。之后,1973 年晚些时候发布的 Version 4 改用 C 重写。使用可移植语言编写的操作系统可以迁移到最初并非为其设计的硬件上,这也是 Unix 比它最初运行的所有机器都更长久的原因。
Unix 为何传播开来:AT&T 不得销售 Unix
1956 年,一项同意令了结了针对 AT&T 的反垄断案件。AT&T 保住了电话行业的垄断地位,同时接受了一项限制:不得经营电信以外的业务。软件就是其中一种业务。因此,当各大学提出 Unix 需求时,Bell Labs 不能将其作为产品销售。它只能以象征性费用授予源代码许可,且不提供支持和保修。
这带来了巨大影响,而且并非 AT&T 原本计划的结果。1975 年发布的 Sixth Edition Unix 及其完整源代码进入了数百个计算机科学系。新南威尔士大学的 John Lions 打印了该内核源代码,并逐行撰写注释,以此开展教学。整整一代人通过阅读一个真实的操作系统,学会了操作系统的工作原理。
随后,许可条款发生了变化。1979 年的 Seventh Edition 许可禁止在课堂上使用源代码,因此 Lions 的注释只能以复印件的复印件形式流传。这就是整个故事的特点。Unix 同时无处不在,又不具备自由软件的许可,因此任何人做出的改进,都是对他人专有代码的改进。
伯克利:您实际输入的 Unix 各部分
Ken Thompson 在 1975 到 1976 学年就读于加利福尼亚大学伯克利分校,并在那里留下了一个非常活跃的 Unix 小组。伯克利计算机系统研究组(CSRG)发布了包含本地改进的磁带,这些磁带后来成为 BSD,即伯克利软件发行版。Bill Joy 编写了早期的大部分代码:1978 年发布 1BSD,随后在 1979 年发布包含 vi 编辑器和 C shell 的 2BSD。
C shell 是 !! 和 !$ 的来源。Bash 继承了这种语法,因此四十多年后的今天,在双引号中输入感叹号时,bash 历史扩展仍会让人感到意外。
随后,DARPA(美国国防高级研究计划局)资助伯克利,将新的互联网协议加入 Unix。4.2BSD 于 1983 年 8 月发布,包含 TCP/IP(互联网协议上的传输控制协议)和套接字应用程序编程接口。服务器上的每项网络服务仍会依次调用 socket()、bind()、listen() 和 accept(),因为这些名称是伯克利在 1983 年确定的。
有一个细节决定了之后十年的发展。BSD 磁带不是完整的系统,而是对 AT&T Unix 的一组补充;要合法运行它,必须拥有有效的 AT&T 源代码许可证。伯克利用了数年时间,逐个文件地用自己的代码替换 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 的 AT&T 子公司 Unix System Laboratories(USL)在新泽西州联邦法院起诉 BSDi,指控其侵犯商业秘密和 Unix 商标权。此后,诉状修改,将加利福尼亚大学董事会列为被告。1993年,该大学在加利福尼亚州反诉,称 AT&T 已将 Berkeley 代码包含在 System V 中,却未按其自身许可证的要求注明来源。
法律争议的核心在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 律师提出的有效诉讼主张,与一名芬兰学生编写、无人可以据此起诉的内核之间作出权衡。正是在这段时间里,Web 开始普及,最早的 Linux 发行版也相继出现:Slackware 于 1993 年 7 月发布,Debian 于 1993 年 8 月发布,随后是 Red Hat 和 SUSE。Red Hat 将这一先发优势转化为商业标准,而从 Red Hat Linux 到 CentOS,再到 Rocky 和 AlmaLinux 的发展路径说明了为什么一个成立于 1993 年的发行版,至今仍决定着大量企业服务器运行的系统。
另外 4 个因素与诉讼同样重要。
- 硬件。Linux 从第一行代码开始就面向大众化的 386 PC,而这种硬件后来变得价格低廉。BSD 的重心在 VAX 和工作站,386 移植工作则由两个人在项目外完成。
- 许可证。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、jails、ports tree,以及第三方软件在多大程度上默认依赖 Linux。将 FreeBSD 15 用作服务器意味着选择一个当前仍受维护的系统,而不是一件博物馆展品。至于Linux 与 Windows Server 的比较,这是另一个问题,答案取决于您的应用技术栈。
您今天在 VPS 上使用的 1969 年设计
以下每一项都比大多数使用者的年龄更大。
- 管道。
who | wc -l会统计已登录用户,因为 1973 年的 Version 3 Unix 允许一个程序的输出成为另一个程序的输入。 - 手册章节。
man 1 ls和man 5 crontab使用 1971 年 11 月手册中的编号方案。 - 文件系统拆分。
/usr的存在源于 1971 年那台 PDP-11 的根磁盘已被占满,开发人员随后将文件移到了第二个磁盘包。此后,各发行版逐渐撤销了这种拆分:在 Ubuntu 24.04 或 Debian 13 上运行ls -ld /bin,会得到一个指向usr/bin的符号链接。 - 套接字调用。Berkeley 在 1983 年为 4.2BSD 编写了这些调用,之后每个网络守护进程仍在使用它们。
- POSIX。根据该标准编写的
#!/bin/sh脚本无需修改即可在 Linux、FreeBSD、macOS 和 Solaris 上运行,因为这些系统都实现了这一标准。
有一项继承下来的设计未能延续至今:Linux 从 System V 继承的 shell 脚本启动流程如今已从几乎所有发行版中消失,而用 systemd 取代它的理由是围绕类 Unix 系统应有形态展开的最近一场争论。
当您租用虚拟专用服务器并登录时,您是在对着一个为配备 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。在这两年中,BSD 的采用受到抑制,而全世界正在选择一种自由 Unix。
Linux 为什么取代 BSD,成为服务器上的主流?
法律确定性是原因之一:在 1992 年和 1993 年期间,Linux 没有面临诉讼,而 BSD 面临诉讼。其他原因包括从第一天起就以 386 为目标平台、GPL 将厂商修改重新汇入同一代码树,以及足够快速的合并流程,使贡献者能够持续参与,而 386BSD 却分裂成三个分支。技术优势并不是决定因素,因为在 1994 年,BSD 是完成度更高的系统。
FreeBSD 今天仍然值得运行吗?
值得,原因很具体:ZFS 已集成到基础系统中,jails 提供成熟的隔离模型,基础系统作为一个统一整体开发,并且文档能够保持准确。代价是需要投入兼容性工作,因为大多数第三方服务器软件、容器工具和厂商支持都默认使用 Linux。如果 FreeBSD 的存储和网络功能足以抵消这些成本,就应选择 FreeBSD,而不是出于对旧有系统谱系的忠诚。