Linux 和 GNU 系统
理查德·斯托曼 著每天都有许多计算机用户使用一个被改动过的 GNU 系统,但是他们并没有意识到。经过一系列的事件,现在被广泛使用的 GNU 版本则经常被称作 “Linux”,而且许多用户并 不了解 它基本上就是 GNU 系统,是由 GNU 工程 开发的。
Linux 确实存在,许多人都在使用它,但它仅仅是所用系统的一部分。Linux 是内核:它是为你运行的其他程序分配计算机资源的程序。内核是操作系统的基本部分,但是它自己并无用处;它只能在完整的操作系统框架下才能发挥作用。Linux 一般和 GNU 操作系统一起使用:整个系统基本上就是 GNU 加上 Linux,或叫 GNU/Linux。所有被叫做“Linux”的发行版实际上是 GNU/Linux 发行版。
许多用户并不了解作为内核的 Linux 和也被称作 “Linux” 的整个系统的区别。而不加区别地使用该名称并不能帮助人们对此的理解。这些用户常常认为 Linus Torvalds 在 1991 年凭借一些帮助完成了整个操作系统的开发。
程序员一般知道 Linux 是一个内核。但是他们一般也听到整个系统叫“Linux”,他们通常会设想的历史是整个系统要以内核命名。例如,许多人相信一旦 Linus Torvalds 完成了 Linux 内核,其用户就搜索一些自由软件来和内核一起工作,此时他们发现(没有特别的原因)构成一个类似 Unix 系统的大多数必要组件已经有了。
他们的发现不是巧合—它正是还没有全部完成的 GNU 系统。这些已经完成的 自由软件 加在一起就构成了完整的系统,因为 GNU 工程从1984年起就在做这件事。在 GNU 宣言 中,我们已经阐明了开发一个自由的类似 Unix 的系统的目标,它叫做 GNU。GNU 工程的 初始声明 也勾画了 GNU 系统的一些原始计划。在 Linux 开始时,GNU 几乎已经完成。
大多数自由软件项目以完成某项具体工作为目标。例如,Linus Torvalds 编写一个类似 Unix 的内核(Linux);Donald Knuth 编写一个文本排版软件(TeX);Bob Scheifler 开发一个窗口系统(X Window系统)。测量该工程里各个程序的贡献是一件自然的事情。
如果我们这样测量 GNU 工程的贡献,我们会得出什么结论?一个 CD-ROM 提供商发现在他们的 “Linux 发行版”中,GNU 软件 占单一最大的比重,大约是整个源代码的28%,其中包括一些关键性主要部件,没有它们,就没有整个系统。Linux 自身占大约3%。(这个比例在 2008 年也差不多:在 gNewSense 的“主”库中,Linux 占1.5%,而 GNU 包占15%。)所以如果你要根据谁的代码多来命名系统,最合适的单个选择是 “GNU”。
但是这不是考虑此问题的最深刻方法。GNU 工程过去不是、现在也不是,一个开发专门软件包的项目。它不是一个 开发 C 编译器 的工程,不过我们做了。它也不是一个开发文本编辑器的工程,我们也做了。GNU 工程是要开发一个完全自由的类似 Unix 的系统:GNU。
许多人已经为系统中的自由软件作出了重大贡献,他们都应该获得荣誉。但 GNU 是一个整合系统——而不是一些实用程序集合的原因是,GNU 工程的最初目标就是做一个完整系统。我们曾经为完成一个完整的自由系统列了一个所需程序的清单,而且我们系统地寻找、编写、或者征询别人编写清单上的每一个程序。我们编写了关键的但是十分枯燥的 [1] 主要部件,因为这是系统所必需的。有些系统部件,比如编程工具,自己也变成程序员使用的流行工具,但是我们还编写了许多不是工具的部件 [2]。我们甚至还开发了一个国际象棋游戏,叫GNU Chess,因为一个完整的系统也需要游戏。
到了90年代初期,我们曾经把除了内核以外的东西放到一起组成了一个系统。我们也在开始开发一个内核,称为 GNU Hurd,运行在 Mach1之上。开发这个内核比我们的预期要难得多;GNU Hurd 在2001年开始可以稳定工作,但是距离能够被人们正常使用还有很长的路要走。
庆幸的是,我们不必再等 Hurd 了,因为有了 Linux。当 Linus Torvalds 在 1992 年使 Linux 成了自由软件,它填补了 GNU 系统的一个重要空白。人们可以 把 Linux 和 GNU 系统结合起来 组成一个完整的自由系统——一个带有 Linux 的 GNU 系统。换句话说,就是 GNU/Linux系统。
把它们组合到一起并不是一个简单的工作。有些 GNU 部件 [3]需要作大量的修改才能适应 Linux。把系统集成到一个完整的发行版本中、使之“能够直接安装并工作”也是一项艰巨的工作。它需要考虑如何安装和启动系统——我们那时还未处理此问题,因为我们还没有走到那一步。因此,那些开发了不同的发行版的人们作出了许多重要的工作。但是这些工作的属性是,它们终究会被某些人做的。
GNU 工程支持 GNU/Linux 系统,就像支持其 GNU 系统一样。FSF 为重写与 Linux 相关的 GNU C 库提供资金,以至于它们现在可以很好地集成在一起,最新版本的 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 是一个内核,是系统的主要基本部件之一。整个系统基本上是 GNU 系统,加上 Linux。如果你说的是这个组合,请称之为“GNU/Linux”。
如果你想为“GNU/Linux”提供参考链接,本页面和 https://www.gnu.org/gnu/thegnuproject.html 是好的选择。如果你说的是作为内核的 Linux,要为它提供参考链接,https://foldoc.org/linux是一个好的 URL。
后记
除了 GNU,还有一个独立进行的工程开发了一个自由的类似 Unix 的操作系统。这个系统是 BSD,它是由 UC Berkeley 开发的。在80年代,BSD 还不是自由的,但是它在90年代初变成了自由软件。今天,一个自由的操作系统 [4]差不多如果不是 GNU 系统的派生版本,就是 BSD 系统的派生版本。
人们有时会问 BSD 是否也是一个 GNU 的派生版本,像 GNU/Linux 那样。BSD 的开发者受到 GNU 工程的激励而将他们的代码变成了自由软件,尤其受到来自 GNU 的活动家的明确吸引和帮助,但是他们的代码和 GNU 并不重合。BSD 系统现在也使用一些 GNU 程序,正如 GNU 系统及其派生版使用一些 BSD 程序一样;然而,整体来看,他们是两个独立发展的不同系统。BSD 的开发者并没编写一个内核,并将之添加到 GNU 系统,进而起个譬如叫 GNU/BSD 的名字,并不是这个情况 [5]。
脚注
- 这些关键但枯燥的部件包括 GNU 汇编器(GAS)和连接器(GLD),他们现在都是 GNU Binutils 软件包的一部分,以及 GNU tar,还有其他许多软件。
- 比如,Bourne Again SHell(BASH),PostScript 解释器 Ghostscript 和 GNU C 库 都不是编程工具。其他诸如 GNUCash、GNOME 和 GNU Chess 等常用的软件包也不是。
- 例如,GNU C库。
- 自从本文出版以来,有一个几乎完全自由的类似 Windows 的系统已经开发完成,但是从技术上说,它根本不像 GNU 或 Unix,所以它不影响这个问题。Solaris 内核的大部分都变成了自由软件,但是如果你要根据这些制作一个自由系统,除了要添加内核缺少的部分,你还需要把它添加到 GNU 或 BSD 中去。
- 另一方面,自从本文发表之后,GNU C 库已经移植到多个 BSD 内核版本,这就使组合 GNU 系统和这些内核变得直截了当。正如 GNU/Linux 一样,这些也是 GNU 系统的派生版本,而且他们也因此根据内核的不同,被称为,比如,GNU/kFreeBSD 和 GNU/kNetBSD。普通桌面版本用户很难分辨出 GNU/Linux 和 GNU/*BSD。
更多信息,请同时参看GNU/Linux常见问题和为什么是GNU/Linux?