Linux 和 GNU 系统

许多计算机用户每天都在运行修改版的 GNU 系统,但他们没有意识到这一点。由于一系列特殊的事件,今天广泛使用的 GNU 版本通常被称为 “Linux”,而且它的许多用户 并不知道 它基本上是 GNU 项目 开发的 GNU 系统。

确实存在 Linux,而且这些人正在使用它,但它只是他们所用系统的一部分。Linux 是内核:系统中将机器资源分配给您运行的其他程序的程序。内核是操作系统的重要组成部分,但它本身是无用的;它只能在完整的操作系统上下文中运行。Linux 通常与 GNU 操作系统结合使用:整个系统基本上是添加了 Linux 的 GNU,或 GNU/Linux。所有所谓的“Linux”发行版实际上都是 GNU/Linux 的发行版。

许多用户不理解内核(即 Linux)和整个系统(他们也称之为“Linux”)之间的区别。名称的模棱两可的使用无助于人们理解。这些用户通常认为 Linus Torvalds 在 1991 年开发了整个操作系统,只是稍加帮助。

程序员通常知道 Linux 是一个内核。但是,由于他们通常也听到整个系统被称为“Linux”,他们常常会设想一个可以证明以内核命名整个系统是合理的历史。例如,许多人认为,一旦 Linus Torvalds 完成编写内核 Linux,其用户就会四处寻找其他免费软件来配合它,并发现(没有任何特殊原因)要构建一个类似 Unix 的系统所需的大部分东西都已经可用了。

他们发现的不是偶然——它是尚未完全完成的 GNU 系统。可用的 自由软件 构成了一个完整的系统,因为 GNU 项目自 1984 年以来一直在努力构建一个。在 GNU 宣言 中,我们提出了开发一个名为 GNU 的免费类 Unix 系统的目标。 GNU 项目的最初公告 也概述了 GNU 系统的一些原始计划。到 Linux 启动时,GNU 几乎已经完成。

大多数自由软件项目的目标是为特定工作开发特定程序。例如,Linus Torvalds 着手编写一个类似 Unix 的内核 (Linux);Donald Knuth 着手编写一个文本格式化程序 (TeX);Bob Scheifler 着手开发一个窗口系统(X 窗口系统)。很自然地,通过来自该项目的特定程序来衡量此类项目的贡献。

如果我们尝试以这种方式衡量 GNU 项目的贡献,我们会得出什么结论?一家 CD-ROM 供应商发现,在其“Linux 发行版”中,GNU 软件 是最大的单一组成部分,约占源代码总量的 28%,其中包括一些必不可少的主要组件,没有这些组件就不可能构建系统。Linux 本身约占 3%。 (2008 年的比例类似:在 gNewSense 的“主”存储库中,Linux 占 1.5%,GNU 软件包占 15%。)因此,如果要根据系统中谁编写的程序来选择系统名称,最合适的单一选择是“GNU”。

但这并不是考虑问题的最深刻方式。GNU 项目不是,也不是开发特定软件包的项目。它不是一个 开发 C 编译器 的项目,尽管我们做了这项工作。它不是一个开发文本编辑器的项目,尽管我们开发了一个。GNU 项目的目标是开发一个完整的免费类 Unix 系统:GNU。

许多人为系统中的自由软件做出了重大贡献,他们都值得因其软件而获得赞誉。但它是一个集成系统的原因,而不仅仅是实用的程序集合,是因为 GNU 项目旨在使其成为一个集成系统。我们列出了创建一个完整免费系统所需的程序,并且我们系统地找到、编写或找到人来编写列表中的所有内容。我们编写了必不可少但不引人注目的[1] 组件,因为没有它们就无法构建系统。我们的一些系统组件(编程工具)在程序员中逐渐流行起来,但我们编写了许多不是工具的组件[2]。我们甚至开发了一个国际象棋游戏 GNU Chess,因为一个完整的系统也需要游戏。

到 90 年代初,除了内核之外,我们已经组装好了整个系统。我们还启动了一个内核,即在 Mach 之上运行的 GNU Hurd。开发这个内核比我们预期的要困难得多;GNU Hurd 在 2001 年开始可靠地工作,但距离人们普遍使用还有很长的路要走。

幸运的是,由于 Linux,我们不必等待 Hurd。一旦 Torvalds 在 1992 年发布了 Linux,它就填补了 GNU 系统中最后一个主要空白。然后人们可以将 Linux 与 GNU 系统结合起来,从而创建一个完整的免费系统——一个也包含 Linux 的 GNU 系统版本。换句话说,也就是 GNU/Linux 系统。

使它们协同工作并非易事。一些 GNU 组件[3] 需要进行大量更改才能与 Linux 一起工作。将一个完整的系统集成到开箱即用的发行版中也是一项艰巨的任务。这需要解决如何安装和启动系统的问题——我们尚未解决这个问题,因为我们尚未达到那个阶段。因此,开发各种系统发行版的人做了许多必要的工作。但是,从本质上讲,这项工作肯定会由某人来完成。

GNU 项目支持 GNU/Linux 系统以及这个 GNU 系统。FSF 资助了对 GNU C 库的 Linux 相关扩展的重写,以便现在它们得到很好的集成,并且最新的 GNU/Linux 系统使用当前库版本,没有任何更改。FSF 还资助了 Debian GNU/Linux 开发的早期阶段。

今天,有许多不同的 GNU/Linux 系统变体(通常称为“发行版”)。其中大多数都包含非自由程序——它们的开发者遵循与 Linux 相关的 “开源”理念,而不是 GNU 的 “自由软件”理念。但是,也有 完全免费的 GNU/Linux 发行版。FSF 为其中的一些发行版提供计算机设施支持。

制作免费的 GNU/Linux 发行版不仅仅是消除各种非自由程序。如今,通常的 Linux 版本也包含非自由程序。这些程序旨在系统启动时加载到 I/O 设备中,并且作为长串数字包含在 Linux 的“源代码”中。因此,维护免费的 GNU/Linux 发行版现在也需要维护一个 免费版本的 Linux

无论您是否使用 GNU/Linux,请不要因模棱两可地使用“Linux”这个名称而混淆公众。Linux 是内核,它是系统必不可少的主要组件之一。整个系统基本上是添加了 Linux 的 GNU 系统。当您谈论这种组合时,请称其为“GNU/Linux”。

如果您想在“GNU/Linux”上创建一个链接以供进一步参考,那么本页面和 https://gnu.ac.cn/gnu/thegnuproject.html 是不错的选择。如果您提到 Linux(内核)并想添加一个链接以供进一步参考,那么 https://foldoc.org/linux 是一个不错的 URL。

附注

除了 GNU 之外,另一个项目还独立地开发了一个免费的类 Unix 操作系统。该系统被称为 BSD,它是在加州大学伯克利分校开发的。它在 80 年代是非自由的,但在 90 年代初变为自由的。今天存在的免费操作系统[4] 几乎可以肯定是 GNU 系统的变体或某种 BSD 系统。

人们有时会问 BSD 是否也像 GNU/Linux 一样是 GNU 的一个版本。BSD 开发人员受到 GNU 项目的榜样以及 GNU 活动家的明确呼吁的启发,将其代码制作为自由软件,但该代码与 GNU 的重叠很少。今天的 BSD 系统使用一些 GNU 程序,就像 GNU 系统及其变体使用一些 BSD 程序一样;但是,从整体来看,它们是两个独立演化的不同系统。BSD 开发人员没有编写内核并将其添加到 GNU 系统中,因此像 GNU/BSD 这样的名称不符合实际情况[5]

脚注

  1. 这些不引人注目但必不可少的组件包括 GNU 汇编器 (GAS) 和链接器 (GLD),它们现在都是 GNU Binutils 软件包的一部分,GNU tar,以及更多组件。
  2. 例如,Bourne Again SHell (BASH)、PostScript 解释器 GhostscriptGNU C 库 不是编程工具。GNUCash、GNOME 和 GNU Chess 也不是。
  3. 例如,GNU C 库
  4. 自从写下这篇文章以来,已经开发出几乎完全免费的类似 Windows 的系统,但从技术上讲,它与 GNU 或 Unix 完全不同,因此它实际上不会影响这个问题。Solaris 的大多数内核已被制作为自由软件,但如果您想以此构建一个免费系统,除了替换内核中缺失的部分之外,还需要将其放入 GNU 或 BSD 中。
  5. 另一方面,自从撰写本文以来,GNU C 库已被移植到多个 BSD 内核版本,这使得将 GNU 系统与该内核结合起来变得非常简单。就像 GNU/Linux 一样,这些实际上是 GNU 的变体,因此被称为例如 GNU/kFreeBSD 和 GNU/kNetBSD,具体取决于系统的内核。典型桌面上的普通用户几乎无法区分 GNU/Linux 和 GNU/*BSD。