Menu Close

Linux 是如何诞生的?从 Unix、GNU、BSD 到开源运动

引言

Linux 是如何诞生的?从 Unix、GNU、BSD 到开源运动

每当你在 Linux 终端里输入一条命令,你使用的其实都是经过几十年发展积累下来的计算机思想。这个看似简单的命令行窗口背后,有开发 Unix 的研究人员,有希望自由学习和分享软件的程序员,也有将无数个人贡献组织成完整操作系统的社区。

了解这段历史,可以帮助我们回答几个常见问题:Linux 为什么和 Unix 很像?为什么 Linux 发行版中经常出现 GNU 工具?BSD 又是什么?为什么我们可以合法地下载、修改和重新发布这些软件?

Linux 并不是某个人从头到尾独自编写了一整套操作系统的结果。它的发展来自多个项目、技术思想和社区的相遇。理解 Linux,既要了解技术,也要了解人们使用、修改和分享技术的权利。

本文将从 Unix 的诞生讲起,介绍 BSD、GNU 与 Linux 之间的关系,再解释开源共享精神以及几种常见的软件许可证。

第一章:Unix 的诞生

故事开始于 1969 年的贝尔实验室。肯·汤普森(Ken Thompson)、丹尼斯·里奇(Dennis Ritchie)和同事们开始开发一个后来被称为 Unix 的操作系统。早期工作在一台 DEC PDP-7 计算机上展开,当时贝尔实验室已经退出了规模庞大的 Multics 项目。

Unix 逐渐发展为能够支持多个用户、管理多个运行中程序的系统。它采用了层次化文件系统、进程以及称为 Shell 的命令解释器。这些概念至今仍然是理解 Linux 的基础。

Unix 最有影响力的思想之一,是让功能专一的小工具相互配合。与其编写一个包办所有任务的庞大程序,不如让每个工具做好自己的工作,再通过适当的接口把它们组合起来。

例如,一个工具负责读取文本,另一个工具筛选符合条件的行,第三个工具统计结果。单独看,每个工具的功能都很简单;组合起来,却能完成更复杂的任务。今天在 Linux 终端中使用管道连接命令,仍然可以看到这种思想。

另一个重要转折发生在 1973 年,Unix 的大部分代码被改写为 C 语言。C 语言由丹尼斯·里奇开发,相比主要依靠特定机器汇编语言编写的系统,使用 C 语言让 Unix 更容易移植到不同的计算机上。

这并不意味着所有代码都可以直接跨平台运行,但它减少了迁移时需要重写的底层代码。可移植性的提高,使 Unix 得以走出最初的硬件环境,传播到更多计算机系统中。

第二章:Unix 的传播与软件授权

Unix 逐渐进入大学、研究机构和商业组织。获得源码授权的用户可以研究它的实现,学习操作系统设计,并开发自己的改进。

但是,能够获得 Unix 源代码,并不意味着可以不受限制地分享这些代码。 AT&T Unix 是受许可证约束的软件。早期 BSD 发行内容中如果包含 AT&T 的代码,同样需要相应的 Unix 源码许可证。

这里必须区分两件事:能够阅读代码,与拥有重新发布代码的权利,并不是一回事。

随着 Unix 的商业价值提高,不同厂商开发了各自的版本。这些版本之间的差异带来了兼容性和移植问题,也推动了共同标准的建立。开发者希望程序能够在不同系统之间运行,而不必每换一个平台就大规模修改。

与此同时,另一个问题开始受到关注:一个系统即使在技术上非常优秀,也可能严格限制用户修改和分享它。

人们关心的不再只是“这个软件是怎样工作的”,还包括“我获得这个软件之后,究竟可以对它做什么”。这个问题后来成为自由软件运动的核心。

第三章:GNU 与自由软件运动

1983 年 9 月,理查德·斯托曼(Richard Stallman)宣布启动 GNU 项目,实际开发工作于 1984 年开始。它的目标是建立一套兼容 Unix 的完整操作系统,让用户可以自由地使用、研究、修改和分享软件。

GNU 是“GNU’s Not Unix”的递归缩写,可以理解为“GNU 不是 Unix”。这个名字强调了项目的方向:提供类似 Unix 的使用环境,同时避免依赖专有 Unix 代码。

GNU 的重点并不是让所有软件都不收钱,而是保障用户获得软件之后的自由。这些自由包括:按照自己的需要运行程序,研究程序如何工作,修改程序,以及分享原始版本或修改后的版本。

源代码对于这些自由至关重要。如果只能运行程序,却无法研究或修改它的实现,用户能够掌握的主动权就非常有限。

因此,自由软件中的“自由”主要指权利,而不是价格。软件可以收费出售,同时仍然允许接收者研究、修改和分享。 GNU 通用公共许可证,也就是 GPL,明确允许对软件副本收费。

GNU 开发了许多重要组件,包括编译器、Shell 和系统工具。编译器帮助开发者将源代码转换为可执行程序,Shell 提供与系统交互的方式,各种工具则负责文件处理等日常任务。

不过,一套操作系统还需要内核。内核负责管理处理器、内存和设备等资源,并向程序提供服务。后来,Linux 内核与 GNU 工具及其他软件的结合,成为这段历史的重要发展。

第四章:BSD——Unix 历史的另一条分支

在 GNU 推进自由软件目标的同时,加利福尼亚大学伯克利分校也在 Unix 的发展中发挥了重要作用。

伯克利开发和发布的软件被称为 BSD,全称是 Berkeley Software Distribution,即“伯克利软件发行版”。早期 BSD 主要用于扩展已有的 Unix 系统,之后在网络、系统工具和操作系统实现方面作出了重要贡献。

由于早期发行内容包含 AT&T 的代码,BSD 最初并没有完全摆脱 Unix 的授权限制。通过分离和替换受限制的代码,开发者逐步为可以自由再分发的 BSD 系统奠定了基础。

FreeBSD、NetBSD 和 OpenBSD 等项目,都来自这段更广泛的发展历史。它们不是 Linux 发行版,而是拥有各自内核和开发传统的操作系统项目。

对于初学者,可以这样理解:BSD 与 Linux 是类 Unix 世界中不同的发展路线。BSD 与伯克利 Unix 存在历史上的源码传承关系;Linux 则最初是独立开发的类 Unix 内核。

因此,命令相似、操作习惯接近,或者能够运行一些相同的软件,都不代表两个系统使用同一个内核。

第五章:Linux 的诞生

1991 年,林纳斯·托瓦兹(Linus Torvalds)开始开发后来被称为 Linux 的内核。1992 年,Linux 改用 GNU GPL 授权,成为自由软件。

Linux 借鉴了 Unix 风格的设计思想,但它并不是把 AT&T Unix 改个名字后重新发布,而是一个新的内核实现。

内核非常重要,却不能独自满足用户使用计算机的全部需要。用户还需要 Shell、程序库、系统工具、开发工具和应用程序。

Linux 与 GNU 软件以及其他项目组件的结合,使实用的操作系统成为可能。这也是为什么人们使用“GNU/Linux”这个名称,来强调 GNU 在许多通常被简称为 Linux 的系统中所作的贡献。

随着发展,不同发行版项目开始将这些组件组织成可以安装和维护的系统。发行版不仅收集软件,还负责软件包选择、安装工具、默认配置、更新机制和维护政策。

学习时,应当区分三个概念:

  • **Linux 内核:**管理硬件资源,并向程序提供底层服务的核心组件。
  • **GNU 工具:**GNU 项目开发的编译器、Shell、系统工具及其他软件。
  • **Linux 发行版:**将内核、工具、程序库、应用软件,以及安装和维护机制组合起来的操作系统。

Linux 内核整体采用 GNU GPL 第二版授权,并明确限定为该版本,同时具有系统调用例外。普通应用程序不会仅仅因为运行在 Linux 上、通过系统调用使用内核服务,就自动变成必须采用 GPL 的软件。

同样,一个发行版中的所有软件也不一定采用同一种许可证。修改或重新发布其中的组件时,需要查看各组件的具体授权条件。

第六章:从自由软件到开源

在“开源”这个词流行之前,软件共享实践已经存在多年。1998 年,人们开始采用“Open Source”这一名称,向更广泛的群体介绍这种软件开发与授权方式,开源促进会(Open Source Initiative,简称 OSI)也在这一时期成立。

自由软件与开源软件存在很大程度的重叠,但支持者强调的理由有所不同。自由软件运动更重视用户的自由;开源讨论则经常强调协作开发、实际收益和开发方法。

对于初学者,首先应当记住:把源代码放到网站上,并不自动等于开源。

按照开源定义,许可证需要允许修改和重新发布,也必须允许商业使用,不能歧视特定的人、群体或应用领域。

如果一个项目允许阅读源码,却禁止商业使用,那么它可能属于“源码可见”或“源码可用”的软件,但这项限制使它不符合上述开源定义。

另外,开源不等于公有领域,也不意味着软件没有版权。作者通常仍然保留版权,只是通过许可证明确授予他人使用、修改和分享的权利。

第七章:什么是开源共享精神

开源共享精神,是愿意让别人从自己的工作中学习,并在此基础上继续改进。

学生可以研究真实的软件实现,开发者可以调查程序中的问题,企业可以根据业务需求调整组件,社区也可以在原维护者退出后继续维护项目。

但分享要能够长期持续,就需要责任感。保留规定的声明、尊重原作者、记录修改内容,以及礼貌地沟通,都是合作的一部分。

参与开源并不要求你已经是编程高手。清晰的错误报告可以帮助维护者节省调查时间,更好的文档可以帮助大量初学者,翻译、测试和耐心解答也能让软件变得更有价值。

同时,开源维护者并不欠所有用户无限量的免费支持。一个人愿意分享程序,不代表他承诺立即解决每个使用者遇到的问题。

健康的开源文化,应当同时包含慷慨与尊重:学习别人分享的成果,认可他们的劳动,并在自己有能力的地方作出贡献。

第八章:简单理解开源许可证

开源许可证将分享的理念转化为明确的权利和义务。理解不同许可证时,可以先认识两种基本方式。

**宽松许可证(Permissive License)**允许广泛复用,包括将代码用于专有产品,但仍然需要遵守保留声明等条件。

Copyleft 许可证则要求在分发时,让特定范围内的受覆盖代码继续按照相应的 copyleft 条款提供。不同许可证覆盖的范围并不相同,不能一概而论。

GNU GPL:保留受覆盖软件的自由

GNU 通用公共许可证是一种 copyleft 许可证。当你分发经过修改、受 GPL 覆盖的程序时,需要遵守适用版本的要求,包括许可证和相应源代码的提供义务。

仅供自己使用的修改,通常不需要公开。把一个 GPL 程序与其他独立程序放在一起分发,也不会自动让所有程序都受到 GPL 的约束。

GPL 允许商业使用和收费销售。它所保护的是接收者的自由,而不是要求软件的价格必须为零。

BSD:允许广泛复用,但需要保留声明

BSD 是一组许可证,而不是唯一的一份文本。常见的两条款和三条款 BSD 许可证允许广泛复用,包括用于专有产品,同时要求保留规定的版权声明、许可条件和免责声明。

三条款 BSD 许可证还规定,未经许可,不得利用版权持有者或贡献者的名字,为衍生产品背书或进行推广。

这类许可证通常不要求公开你的修改,但不能因此忽略必须保留的声明。

MIT:简短的宽松许可证

MIT 许可证允许使用、修改、重新发布、再许可和销售软件。其核心条件是,在软件副本或实质性部分中保留版权声明和许可声明。

采用 MIT 许可证的代码可以被整合进专有应用程序,通常不会因此要求公开整个应用程序的源代码。

“宽松”意味着授权范围较广,并不意味着没有需要遵守的条件。

Apache 2.0:包含明确专利条款的宽松许可证

Apache License 2.0 允许商业使用,也允许将代码用于专有产品。它还包含贡献者授予的明确专利许可,具体范围和条件由许可证规定。

重新发布时,需要提供许可证、保留适用声明、标明修改过的文件,并在适用情况下保留相关 NOTICE 信息。

Apache 2.0 并不要求所有衍生产品都必须整体采用 Apache 许可证发布。

MPL 2.0:文件级别的 Copyleft

Mozilla Public License 2.0,简称 MPL 2.0,通常在文件层面实施 copyleft。

分发包含 MPL 覆盖文件的软件时,需要按照许可证要求,提供这些受覆盖文件的源代码,包括对它们所作的修改。

独立的其他文件通常可以继续使用不同的许可证,包括专有许可证。因此,MPL 允许开放组件被整合进更大的产品,而不一定要求公开整个产品的所有源代码。

对于初学者,不必一次背下所有条款。更重要的是形成一个习惯:使用代码的许可附带条件,在重新发布前,应检查具体许可证及其版本。

第九章:今天的开源——商业、信任与责任

开源与商业活动可以相互支持。企业可以投入资金推动开发,也可以通过托管、技术支持、培训、定制和维护获得收入。

一个开放的项目仍然可能需要领取薪酬的工程师、测试基础设施、安全审查和长期规划。公开代码并不会让这些成本消失。

同样,开源也不会自动保证质量和安全。源码公开让检查成为可能,但仍然需要有人真正进行检查,并根据发现的问题采取行动。

2024 年的 XZ Utils 事件就说明了这一点:5.6.0 和 5.6.1 版本的发布归档中被发现存在后门。开放的开发方式,并没有自动阻止攻击者破坏软件发布过程。

因此,评价软件时,不能只看它有没有“开源”标签,还应考虑项目是否得到维护、版本如何构建和发布、安全问题如何处理,以及维护团队是否有足够的资源继续工作。

从代码仓库、软件包平台或 AI 辅助开发工具中获取代码时,也需要保持同样的判断力。了解自己引入的是什么、它来自哪里,以及适用哪些许可条件。

开源赋予用户更多理解和影响软件的机会,但如何正确使用这些机会,仍然需要知识、投入和责任感。

结论

Unix 奠定了许多延续至今的操作系统思想,BSD 发展了其中一条重要的历史分支,GNU 将软件自由确立为核心目标,而 Linux 提供了一个能够与 GNU 工具和其他组件共同构成系统的内核。

这段历史说明,软件进步不仅依赖技术发明,也依赖知识的开放、在已有成果上继续开发的权利,以及长期持续的合作。

学习 Linux,因此不仅是在记忆命令,也是在理解为什么这个系统可以被研究、如何合法地分享它,以及这些自由伴随着哪些责任。

你不需要先写出一个内核,才能参与其中。认真学习、尊重许可证、帮助其他用户,并贡献有用的改进,都是延续开源共享精神的方式。

Posted in 家庭生活