第 2 章...
什么是 Unix?什么是 Linux? (What Is Unix? What Is Linux?)
- 什么是操作系统?
- 什么是内核?
- Unix = 内核 + 实用工具
- "Unix" 曾经是一个具体的名字
- "Unix" 如今是一个通用的名字
- 自由软件基金会
- 《GNU 宣言》节选
- GPL 与开源软件
- 20 世纪 70 年代的 Unix:从贝尔实验室到伯克利
- 20 世纪 80 年代的 Unix:BSD 与 System V
- 1991 年的 Unix:等待...
- ...等待意中人,Linus Torvalds
- Linux 发行版
- BSD 发行版
- 你应该使用哪一种 Unix?
- 如何获得 Linux 或 FreeBSD?
- 什么是 Unix?什么是 Linux?
- 练习
什么是 Unix,什么是 Linux?简短的 回答是:Unix 是一类计算机 系统,而 Linux 是某个特定 Unix 系统家族的名字。
如果你奶奶碰巧问你"你在学的这些 Unix 到底是什么?",这个答案就够用了。 但出于实际目的,你需要了解的 更多。
在本章中,我要解释构成 Unix 整体以及 Linux 这个特例的最重要 思想,而且我做这件事有两个 原因。第一,我想你会觉得这场讨论 很有意思。对我而言,Unix 是有史以来 最精彩的计算机系统,我希望你也能 有同样的感受。
第二,一旦你对 Unix 有了基本的 理解,你就拥有了一个理解本书内容的 背景。这样,当我们进入硬核的 技术内容时,你会发现记住那些 细节要容易得多。
到本章结束时,我会给出一个关于 Unix 和 Linux 的、可靠而实用的 定义。不过,在那之前,我得先解释 若干重要的概念。为了打下基础, 我要从讨论任何计算机系统的根本 组成部分开始:操作系统。
什么是操作系统?
(What Is an Operating System?)
计算机通过遵循指令来自动完成 任务。一份指令清单称为 程序(PROGRAM)。当计算机遵循这些 指令时,我们说它正在 运行(RUNS)或执行(EXECUTES)该程序。一般而言, 程序被称为软件 (SOFTWARE),而计算机的物理部件被称为 硬件(HARDWARE)。硬件 包括主板、磁盘驱动器、 键盘、鼠标、显示器、屏幕、 打印机等等。
操作系统(OPERATING SYSTEM,它是一种 软件)是运行计算机的那个复杂的 主控程序。操作系统的 主要功能是高效地 使用硬件。为此,操作系统充当 硬件的首要接口,既服务于 你工作时的需要,也服务于 你的程序执行时的需要。
只要你的计算机开机运行,操作系统 就在那里,随时准备为你服务,并管理 你计算机的资源。
举例来说,假设你输入一条命令, 要求显示你所有文件的名称。正是 操作系统负责处理这些细节:找到 文件名并把它们显示在你的屏幕上。 当你运行的程序需要打开一个新 文件时,也是操作系统划出 存储空间并处理所有细节。
更准确地说,操作系统最重要的功能有:
• 在每次机器启动或重新启动时 接管计算机并完成自身初始化。 这个初始化过程是引导 (BOOTING)过程的一部分。
• 支持你用来与计算机交互的 接口(文本接口或图形接口)。
• 为需要使用计算机资源 (磁盘空间、文件分配、处理时间、 内存等等)的程序提供接口。
• 管理计算机的内存。
• 维护并管理文件系统。
• 安排待完成工作的日程。
• 提供记账与安全服务。
此外,所有操作系统都附带了 大量供你使用的程序。例如,有些 程序帮助你创建、修改和管理文件; 有的管理你的工作环境;有的 与他人通信;有的用于访问 互联网;有的用于编写程序;诸如此类。 Unix 自带一千多个这样的 程序,每一个都是完成某项 特定工作的工具。
作为一个家族,各类 Unix 操作系统都 有两个重要特性:多任务和 多用户。多任务 (MULTITASKING)指 Unix 系统可以 同时运行多个程序。多用户 (MULTIUSER)指 Unix 可以同时 支持多个用户。(顺便说一句, Microsoft Windows 是一个多任务、 单用户的操作系统。)
名称的由来
Booting(引导)
"booting"这个词是 bootstrapping (bootstrap 的动名词)的简称,它源自 一句老话"pulling yourself up by the bootstraps"(拉着自己靴子的鞋带把自己 提起来)。举个例子: "Bartholomew 输光了所有的钱, 于是穷了很久。然而,通过努力 工作,他成功地'拉着自己的鞋带 站起来',成为一名成功的麦片饼 商人。"
显然,拉着系在自己靴子上的带子 把自己提起来,在物理上是不可能的。 这个说法的含义是:一个困难的、 复杂的目标,往往可以通过一个 小小的行动开始,然后以此为基础, 一步一步地积累,直到达成 期望的目标。
计算机系统的启动正是这样开始的。 当你打开电源(或重新启动 计算机)时,一个单一的小程序 会自动运行。这个程序再启动另一个 更复杂的程序,如此下去。 最终,操作系统(一个非常 复杂的程序)接管一切并完成 初始化。
因此,我们把整个过程称为 bootstrapping,或者说引导 (booting)计算机。
什么是内核?
(What Is the Kernel?)
计算机启动时,会经历一系列 构成引导过程的动作。这个过程 的最后一步,是启动一个非常复杂的 程序,称为内核(KERNEL)。
内核的工作是接管计算机,并充当 操作系统的核心。因此,内核 始终在运行。的确,在你关机 之前它不会停止。这样,内核就 能随时可用,在需要时提供 必要的服务。
内核是操作系统的心脏, 因此非常重要,所以我想花点 时间告诉你几个细节。我会有些 技术化,所以如果你完全被搞糊涂了, 就明智地点点头,装作你懂了。
尽管内核的本质会因操作系统 而异,但它提供的必要服务在各种 系统之间基本相同。它们是:
• 内存管理(虚拟内存管理,包括分页)
• 进程管理(进程创建、终止、调度)
• 进程间通信(本地、网络)
• 输入/输出(通过设备驱动 程序(DEVICE DRIVERS),即与实际物理设备 完成通信的程序)
• 文件管理
• 安全与访问控制
• 网络访问(例如 TCP/IP)
如果这些技术术语对你来说意味 着什么,那很好。如果不是,也不必 担心。真正关心内核内部细节的,只有 最像书呆子的程序员。对于像你 和我这样的人,关键是要认识到: 内核是操作系统中最重要 的部分。事实上,我们稍后会看到, Linux 与其他类型的 Unix 之间的主要 区别在于,Linux 使用一个特定的 内核,它不同于其他 Unix 内核。
内核有许多不同的类型,但基本 上可以分为两类:较大的称为 宏内核(MONOLITHIC KERNELS),较小的称为 微内核(MICROKERNELS)。
宏内核由一个非常大的程序 组成,它独自包办一切。微内核 是一个小得多的程序,只能 执行最基本的任务。为了完成 其余功能,微内核会调用一组 其他程序,称为服务器 (SERVERS)。
宏内核的优点在于速度快: 所有工作都在一个程序内完成, 这很高效。缺点是宏内核庞大 而笨重,这使得它们难以设计 和维护。
微内核要慢一些,因为它必须 调用服务器来完成大部分工作, 这不太高效。然而,由于模块化 设计,微内核让程序员容易理解 得多,而且可以相对快速地 修改它们,以便在新的系统上 工作。与宏内核相比,微内核还有 一个优点:它们更易于定制。
举例来说,假设你正在为手机或 机器人开发一个操作系统。 存储空间非常宝贵,所以小内核 比大内核更好。而且,对于 专用设备,你可能不需要宏内核 的全部功能。在这种情况下, 一个微内核加上一组精心挑选的 服务器,可能是最好的选择。
当开发一个新的操作系统时,设计者 面临选择。他们可以使用单个 庞大的宏内核,也可以使用 带服务器的小型极简微内核。 大多数 Unix 系统使用某种类型的 宏内核。然而,我们将会看到, 有些 Unix,比如 Macintosh 的 Unix (称为 OS X),使用的是微内核。
名称的由来
Kernel(内核)
想象一颗开心果。外面是一层 坚硬的壳。里面是一粒柔软的、 可以吃的种子,在生物学上,这粒 种子称为 kernel(果仁)。因此,如果 我们要说得精确些,可以说:当我们 吃开心果时,我们敲开外壳(shell) 以便吃到果仁(kernel)。
如果我们把 Unix 想象成一颗坚果, 内部就是内核(kernel),外部就是 shell;事实上确实如此。
我们刚刚讨论的内核,就是我们所说的 操作系统核心。而 SHELL(我们将在第 11 章讨论) 是我们给一类特殊程序(命令处理器) 起的名字,它"包围"着内核,充当 我们进入系统的个人接口。
Unix = 内核 + 实用工具
(Unix = Kernel + Utilities)
我已经解释过,内核是操作系统 的中心部分。内核始终在运行, 它的工作是执行那些必要的任务。
但其他的一切呢?
在 Unix 中,"其他的一切"由大量 辅助程序组成,这些程序作为 Unix 软件包的一部分而被包含在内。这些 程序可以分成若干不同的 类别。
最重要的程序是为你提供 使用计算机接口的程序。它们是 Shell 和 GUI。Shell 是提供文本接口的程序:你 一个接一个地输入命令;Shell 读取你的命令,并完成执行它们 所需的工作。GUI(图形用户界面)是 更精细的程序,它提供带有窗口、 鼠标指针、图标等的图形 接口。我们将在第 5 章和第 6 章 讨论 Shell 和 GUI,并在第 11 章 详细讨论 Shell,所以眼下我只需 提到它们的存在。
其余的程序称为 Unix 实用工具(UTILITIES),其数量有数百个。每个 实用工具(也就是每个程序)都是一个 独立的工具。所有 Unix 系统都随 操作系统附带数百个这样的 工具。其中一些是给程序员用的, 但许多对任何人都有用,即使是 偶尔使用的普通用户。而且,正如我们 将在第 15 章讨论的,Unix 提供了 把现有工具组合起来解决新出现 问题的方法。这种丰富的工具储备 是每个 Unix 系统的一部分,也是 Unix 如此强大的主要原因。
Unix 实用工具在各种 Unix 系统上 的工作方式几乎相同。这就是说, 从实际目的来看,如果你会一种 Unix,你就会用所有 Unix。 事实上,本书大部分篇幅都在 教你如何使用最重要的 Unix 实用工具。我的目标是,当你读完 本书时,你将熟悉那些最重要的 工具,也就是说,你日常使用 Unix 时会感到得心应手。
那么,什么是 Unix?
一个好的回答是:Unix 是一类 使用 Unix 内核、并带有 Unix 实用工具和 Unix Shell 的操作 系统。事实上,大多数(但不是所有) Unix 都带有一组 Shell 和至少一个 GUI。
在非正式的说法中,我们常常用 "实用工具"一词把 Shell 也包括 进来,所以此时我们可以这样定义 Unix:
Unix = 一个 Unix 内核 + Unix 实用工具
"Unix" 曾经是一个具体的名字
("Unix" Used to Be a Specific Name)
在第 1 章中,我描述了第一个原始 Unix 系统是如何在 1969 年由一位 程序员 Ken Thompson 开发出来的。 这项工作是在贝尔实验室完成的,它是 AT&T 的研究部门。自那以后,许多人 把 Unix 发展成为一个现代的操作系统 家族。但"Unix"这个名字本身 究竟归谁所有?
多年来,它归 AT&T 所有,而 AT&T 坚持 Unix 必须一律用大写字母拼写: UNIX。更准确地说,AT&T 的律师 规定"UNIX 商标必须以在 排版上与众不同的形式出现。"
此外,律师们还规定,你不能 把 UNIX 当作名词来谈论。 你必须说 UNIX 操作系统。 ("UNIX 商标不得用作名词,而必须 始终用作修饰普通名词的形容词, 例如 'UNIX operating system'。")
多年来,贝尔实验室一直是 Unix 开发的中心之一,而这种荒唐事也 持续着。1990 年,AT&T 成立了一个 新组织,名为 Unix 系统实验室 (Unix Systems Laboratory,USL),接管 Unix。1993 年 6 月,AT&T 把 USL 卖给了 Novell 公司。1993 年 10 月, Novell 把"UNIX"这个名字的权利 转让给一个名为 X/Open 的国际 标准组织。最后在 1996 年,X/Open 与开放软件基金会(一个由 计算机公司组成的联合体)合并, 成立了 The Open Group(开放组织)。 因此,UNIX 商标现在归 The Open Group 所有。
那么,The Open Group 说 UNIX 意味着什么?他们说"UNIX"是一个 品牌,指任何经他们认证为符合 他们所谓"Single UNIX Specification"(单一 Unix 规范)的 操作系统。
其中的细节令人头疼,我们还是 继续往下讲吧。
"Unix" 如今是一个通用的名字
("Unix" is Now a Generic Name)
尽管 The Open Group(以及 AT&T、 USL、Novell 和 X/Open)心里怎么想, "Unix"这个词多年来一直被非正式地 用来指任何类 Unix(Unix-like)的 操作系统。在这个意义上,存在 许许多多种不同的 Unix,而且 每年都有新的 Unix 被开发出来。
然而,这一切都绕开了一个问题: 所谓"类 Unix"到底意味着什么?
有两个答案,都不够精确。第一个 答案是:如果一个操作系统 (1)由 Unix 内核和 Unix 实用工具 组成,并且 (2)它能运行在其他 Unix 系统上运行的 Unix 程序,那么 这个操作系统就是 Unix。
第二个答案是:如果懂 Unix 的人 说某个操作系统是 Unix,那它就是 Unix。
我明白,对于纯粹主义者 — 比如 苏格拉底或正统派拉比 — 这样非正式的定义并不令人满意。 不过在现实世界中(我们不在 学校时所处的地方),并不总能 做到完全精确。
举个例子,看看美国最高法院的 Jacobellis v. Ohio, 378 U.S. 184 (1964) 案。此案涉及一家电影院 经理的上诉,他因放映一部淫秽 影片而被定罪。在正式的书面 判决中,大法官 Potter Stewart 讨论了什么是淫秽的问题。它 究竟是什么?
他写道:"今天我不再试图进一步 定义我所理解的、被这一简称 (硬核色情)所涵盖的那类 [材料];也许我永远无法 清楚地把它说清楚。但当我 看到它时,我知道那就是它, 而本案所涉及的这部影片 并不是那样。"
所以,如果我告诉你实话,我想自己 并不孤单:要真钻牛角尖的话, 我说不清 Unix 是什么 — 也许谁也说不出 — 但当我看到它时,我知道那就是 Unix。(而且,总有一天你也会 认得它。)
自由软件基金会
(The Free Software Foundation)
现在你已经知道 Unix 是什么了, 我想回答下一个问题:什么是 Linux?为此,我得先从自由软件 基金会和开源软件的概念讲起。
假设你喜欢本书到了这样的程度: 你希望你所有的朋友都有一本。 你可以怎么做?你可以买上一整套 书,发给你的朋友(这主意不错, 尤其当你想让所有认识你的人 刮目相看时)。当然,那要花 不少钱。不过,每个人都会得到 一本真正的印刷书,至少你会觉得 钱花得值。
另一种做法是你自己复印这本书。 例如,你可以影印 30 份,然后 把这些复印件送人。这能省下 一些钱,但与原书相比,复印件 远算不上完美。而且,影印、 整理、装订和分发复印件要 花很多时间和精力,当你的 朋友拿到它们时,他们会知道 自己拿到的是次品。更糟的是, 如果某个朋友想再自己复印, 质量会更差,因为复印件的 复印件远不如原件。
现在,假设你读的是本书的 电子版,而你想与朋友分享 这本书。你要做的只是复制 几个文件,用电子邮件发给他们, 或者刻到一张光盘上送人。这样 不仅花费很少(甚至可能免费), 而且副本与原件完全相同。 此外,你的朋友也可以轻松地把 副本再复制成副本。
确实,制作这样的副本是违法的, 但暂且把法律放到一边。从 道德上讲,复制并分发电子数据 (书籍、软件、音乐、视频等等) 是对还是错?
这里没有简单的答案。这一切 取决于你的观点,而每一方都 有充分的论据。有一件事我可以 告诉你:因为电子复制既廉价又 可靠,我们往往低估一切电子 格式的东西的价值。例如,想想 你为本书付了多少钱。你愿意 为一张装着这本书的光盘付 同样的价钱吗?或者,为一个 可以在线阅读本书的网站访问权 付同样的价钱吗?
因为电子数据太容易复制(或 窃取),人们往往觉得电子数据 不值什么钱。出于这个原因, 软件公司传统上不愿在没有 严格许可证协议(禁止复制和 修改)的情况下发布程序。
然而,如果你能说服许多有才华的 程序员以这样一种方式分发他们的 软件:它鼓励复制,会怎样 呢?这会让世界变得更美好吗? 20 世纪 80 年代初,一位名叫 Richard Stallman 的富有远见的人 问了自己这个问题。
自 1971 年起,Stallman 一直在 MIT 的人工智能(AI)实验室工作。 AI 实验室有与人自由共享软件的 悠久传统,不仅实验室内如此, 对其他机构也是如此。然而 1981 年情况变了,许多 AI 实验室的 人离职去加入一家初创公司。 主力计算机被换掉了,操作系统 也被换成一个专有系统。 Stallman 发现自己工作的环境 变了,他和同事都失去了查看 操作系统内部并修改它的权利。
碰巧的是,Stallman 不只是一个 技术精湛的程序员。他还是一个 善于思考的社会批评家,他把 改用专有操作系统看作是对他 作为创造者的社会权利的 限制。用他自己的话说,一种 "专有软件的社会制度,在这种 制度中,你被禁止共享或修改 软件",不仅"反社会",而且 "不道德"、"错误"。他观察到, 这样的制度会在程序员与软件 公司之间制造不健康的权力斗争。
解决办法是:创建大量写得优秀、 有用的软件,从一开始就设计成 可以自由分发的。
1984 年 1 月,Stallman 辞去了 工作,把自己奉献给这个项目。 没过多久,他吸引了一批其他 程序员,1985 年,他们创办了一个 组织,称为自由软件基金会 (FREE SOFTWARE FOUNDATION,简称 FSF)。 Stallman 的指导原则是"计算机 用户应当有权修改程序以满足 自己的需要,并且有权共享软件, 因为帮助他人是社会的基础"。 Stallman 相信,程序员的本性就是 乐于分享自己的工作,而他们这样 做时,所有人都会受益。
重要的是要理解:当 Stallman 谈论"自由软件"时,他指的不是 价格,而是自由。自由软件 (FREE SOFTWARE)任何人都可以查看、 修改、共享和分发。不过,按照 Stallman 的说法,如果有人为自己的 服务收费,或者让别人为软件 分发付钱,那也是可以的。 Stallman 的解释方式是:把它想成 "言论自由(free speech),而不是 免费啤酒(free beer)"。
由于 "free" 一词既指自由也指 免费,所以存在某种歧义。因此, 为避免任何可能的混淆,自由软件 现在被称为开源软件 (OPEN SOURCE SOFTWARE)。
(这个名字来自一个编程术语。当 程序员编写一个程序时,他实际 写出的指令称为源代码 (SOURCE CODE),更简单地称为 SOURCE 或 CODE。
(举个例子,假设你正在和英国 女王谈话,她抱怨说,她用来从 CD 抓取音乐的那个程序总是崩溃。 "我要是有代码就好了,"她说, "我就能让 Charles 把这个 bug 修好。" "别担心,"你回答,"我知道去哪儿 弄源代码。我把 URL 用电子邮件 发给 Chuck。")
由于任何计算机的核心都是操作 系统,所以 FSF 的第一个主要目标, 就是创建一个可以自由共享、 任何人都可以修改的操作系统。 为了让这个新的操作系统能够 自由分发,Stallman 意识到它必须 从零开始重写。
Stallman 希望 FSF 的产品能顺利 融入当时主流的编程文化,所以他 决定新操作系统应当与 Unix 兼容:它看起来应当和 Unix 一样, 并且应当能够运行 Unix 程序。 按照他所处的那个编程社区的 传统,Stallman 为这个尚未建成的 操作系统选了一个古怪的名字。 他把它叫作 GNU。
名称的由来
GNU
GNU 是 Richard Stallman 为自由软件 基金会开发完整类 Unix 操作系统 的项目所选的名字。这个名字本身 是一个首字母缩略词,意思是 "GNU's Not Unix"(GNU 不是 Unix), 读作"ga-new"(嘎纽)。 (它与你打喷嚏时发出的声音押韵。)
注意,在"GNU's Not Unix"这个 表达式中,GNU 一词可以无限地 展开:
GNU
(GNU's Not Unix)
((GNU's Not Unix) Not Unix)
(((GNU's Not Unix) Not Unix) Not Unix)
((((GNU's Not Unix) Not Unix) Not Unix) Not Unix)
如此等等。因此,GNU 实际上是一个 递归缩略词。递归(RECURSIVE)指 用自身来定义自身的东西。
《GNU 宣言》节选
(Excerpts from the GNU Manifesto)
正如我在上一节提到的,自由软件 基金会的创始人 Richard Stallman 不只是一名程序员。他是一位 有教养的社会批评家,他对 未来的构想对世界产生了巨大的 影响。
创办 FSF 后不久,Stallman 写了 一篇短文,解释他推动自由软件 理念的理由。他把这篇文章称为 GNU 宣言(GNU MANIFESTO)。
他的基本理念 — 一切软件都应当 自由共享 — 往最好里说也是幼稚的。 然而,随着互联网的兴起,开源 软件(Stallman 称之为"自由软件") 的开发与分发,已经成为我们 世界中一股重要的经济和社会 力量。可以免费使用的程序实际 上有数以万计,它们对整个世界 (以及对程序员自身的幸福)的贡献 无法衡量。
我们会在下一节更多地讨论这个 理念。在那之前,我想花点时间 给你看 1985 年原文中的几段 文字。
作为哲学家,Stallman 算不上 重量级人物。他的公开宣言 不如其他著名的宣言那样精妙, 比如 《九十五条论纲》(Martin Luther, 1517)、《共产党宣言》 (Karl Marx 与 Frederick Engels, 1848), 或者 《花花公子哲学》(Hugh Hefner, 1962-1966)。尽管如此, 自由软件基金会的工作非常重要, 而且直到今天,它仍在为我们的 文化做出重要贡献。出于这个 原因,你也许会感兴趣读一读 Stallman 那篇 1985 年文章的 几段节选。
(顺便说一句:Stallman 在 MIT 工作 期间,创建了 Emacs 文本编辑器。 如果你能用到 GNU 版本的 Emacs (使用 Linux 的话就是这种情况), 你可以启动 Emacs 并输入命令 <Ctrl-H> <Ctrl-P> 来显示 关于 GNU 计划的信息。)
《GNU 宣言》节选
"我认为,金律(golden rule)要求: 如果我喜欢一个程序,我就必须 把它与其他喜欢它的人共享。软件 卖家想把用户分化并征服他们,让 每个用户都同意不与他人共享。我 拒绝以这种方式破坏与其他用户 的团结。我不可能在问心无愧的 情况之下签署保密协议或软件许可 协议。多年来,我在 [MIT] 人工 智能实验室内工作,抵制这类 倾向以及其他种种不近人情的 做法,但最终他们做得太过分了:我不能 留在一个违背我的意愿对我做 这种事的机构里。
"为了让我能继续有尊严地使用 计算机,我决定汇集出足够庞大的 自由软件库,这样我就不需要 任何非自由的软件也能过得下去。 我已经从 AI 实验室辞职,以便让 MIT 找不到任何法律借口来阻止我 分发 GNU...
"许多程序员对系统软件的商业化 感到不满。这也许能让他们赚到 更多钱,但却让他们感到自己 与一般意义上的其他程序员处于 冲突之中,而不是感到彼此是 同志。程序员之间最基本的友好 行为就是共享程序;而如今普遍 采用的营销安排,实质上禁止 程序员把他人当作朋友。软件的 购买者必须在友谊与守法之间 做出选择。自然地,许多人断定 友谊更重要。但那些尊崇法律的 人,常常对两种选择都感到不安。 他们变得愤世嫉俗,认为编程 不过是一种赚钱的手段...
"复制一个程序的全部或部分内容, 对程序员来说就像呼吸一样自然, 也一样富有成效。它应当是 自由的...
"从长远看,让程序自由是通向后 稀缺时代(post-scarcity world)的 一步,在那里,没有人必须为了 谋生而拼命工作。人们可以自由地 投身于有趣的活动,比如编程, 只需在每周必要的十小时里完成 那些必须做的事,例如立法、 家庭咨询、机器人维修和小行星 勘探。人们不再需要靠编程 谋生..."
GPL 与开源软件
(The GPL and Open Source Software)
多年来,Stallman 和支持自由软件 基金会的众多其他程序员努力 创造了一个庞大的开源软件库。 事实上,正如我提到的,Stallman 就是 Emacs 文本编辑器最初的作者。
今天,FSF 并不是唯一推广开源 软件的组织;事实上这样的组织 有很多。然而,FSF 一直是其中的 领导者之一,不仅有 Emacs,还有 一个 C 编译器(gcc)、一个 C++ 编译器(g++)、一个强大的调试器 (gdb)、一个 Unix shell(Bash), 以及许许多多其他工具。所有这些 软件 — 它们都是 GNU 计划的 一部分 — 在全世界被使用,并被 认为质量最高。
20 世纪 80 年代末,Stallman 的 一些经历让他明白:如果他要想 创建一个庞大的自由软件库,他 就需要一个合适的许可证来分发 这些软件。为此,他发明了 著佐权(COPYLEFT)的概念。(这个名字 来自 Stallman 的一位朋友,他在 80 年代中期给 Stallman 寄了一封信, 信封上写了几句俏皮话。其中 一句是"Copyleft — all rights reversed"(著佐权 — 一切权利均相反)。)
在软件界,传统的版权被用来 限制软件的使用。著佐权的目的 恰恰相反。用 Stallman 的话说, "著佐权的核心思想是:我们允许 每个人运行程序、复制程序、 修改程序,并分发修改后的 版本 — 但不允许他们加上 自己的限制。"
为了实现著佐权的理念,Stallman 撰写了通用公共许可证(GENERAL PUBLIC LICENSE,即 GPL),并于 1989 年 发布。GPL 本身相当复杂,所以 我不去讲细节。基本上,当应用于 软件时,GPL 规定:任何人都可以 分发该软件、查看源代码、修改 它,并分发修改后的成果。此外 — 这是关键所在 — 任何重新 分发该软件(包括修改版本)的人, 都不得剥夺任何自由,也不得 加上自己的任何限制。
GPL 确保:每当有人用自由软件 创造新作品时,这个新作品只能 在 GPL 之下分发。就实际意义而言, 这就是说,如果有人从自由软件 出发,修改它并再分发,他也 必须发布源代码。
GPL 变得流行起来,多年来又发展出 各种类似的许可证。事实上,著佐权 许可证与互联网(让全世界的程序员 能够共享并协同工作)相结合,带来 了共享创造力的空前繁荣,也就是 所谓的开源运动(OPEN SOURCE MOVEMENT)。
开源运动的重要性怎么强调都不 过分,它在编程世界乃至整个 世界的影响都难以夸大。举例 来说,如果所有开源软件都消失, 我们所知道的互联网会在一瞬间 不复存在。(例如,世界上大多数 Web 服务器由一个名为 Apache 的 开源程序运行。)
在 Unix 世界里,开源运动的影响 是重大的。原因有很多,其中 最重要的一条是:如果没有 FSF 和 GPL,没有它们给编程文化带来 的改变,你我很可能从来就没 听说过 Linux。
20 世纪 70 年代的 Unix:
从贝尔实验室到伯克利
(Unix in the 1970s: From Bell Labs to Berkeley)
在第 1 章开头,我解释了第一个 Unix 版本是 1969 年在 AT&T 位于 新泽西的贝尔实验室开发出来的。 20 世纪 70 年代初,少数几个人 (都来自贝尔实验室)重写并改进 了 Unix。
1973 年,一个 Unix 开发支持小组 成立了;同年晚些时候,Ken Thompson (两位主要的 Unix 开发者之一)在 一次计算机专业人士的会议上 宣读了第一篇关于 Unix 的论文。 这激发了人们对 Unix 的兴趣, 六个月之内,运行 Unix 的站点 数量从 16 个增加到 48 个。
1974 年 7 月,Thompson 和 Dennis Ritchie(另一位主要的 Unix 开发者) 在《ACM 通讯》(Communications of the ACM)(*)上发表了论文 "The UNIX Time-Sharing System", 这是世界上读者最广的计算机科学 期刊。那是 Unix 第一次被介绍给 全世界,而全世界也开始做出回应。 大学的学者和企业内部的研究人员 索要 Unix 的副本,开始在自己的 计算机上运行它。某些情况下,他们 把 Unix 移植(PORTED)到新型硬件 上运行(也就是说,他们对它做了 适配)。
* 脚注
一个月后,也就是 1974 年 8 月, 同一本期刊发表了我的第一篇 技术论文。当时我是加拿大 滑铁卢大学的本科生,我赢得了 ACM 的 George E. Forsythe 学生 论文奖。论文的标题是 "A New Technique for Compression and Storage of Data"(一种数据压缩与 存储新技术)。
(如果你想知道:ACM 是计算机 科学家的主要专业协会。这个名字 可以追溯到 1947 年,全称是 Association for Computing Machinery, 即美国计算机协会。)
这里有个有趣的事。如果你去查 CACM(这本期刊通常这样简称)的 过刊,你会发现 1974 年 7 月那期 载有原始 UNIX 论文的那一期常常 找不到,无疑是过于热情的纪念品 收集者所为。而 1974 年 8 月那期 (也就是刊登我论文的那一期), 却一直都能找到。
在贝尔实验室之外,最重要的 Unix 开发中心是加利福尼亚大学 伯克利分校的计算机科学与 系。1974 年,伯克利的一位教授 Bob Fabry 弄到了一份 AT&T 的 UNIX 第 4 版,伯克利的学生们 开始做出重大改进。1975 年, Ken Thompson 到伯克利休假一年, 这成为伯克利 Unix 开发的催化剂。
同年,AT&T 正式开始向大学授权 许可 UNIX。(如你所记得的,AT&T 坚持"UNIX"必须一律拼作大写, 当我特指 AT&T UNIX 时,我 就会这样拼写。)
大约就在这个时候,伯克利的 研究生 Bill Joy 对 Unix 产生了 浓厚的兴趣。虽然当时没人知道, Joy 的工作将产生深远的 影响。
Joy 所做的这一切,为伯克利成为 Unix 世界的重要角色铺平了道路, 他们创造并分发自己版本的 Unix。 事实上,今天几种重要的 Unix 都是伯克利 Unix 以及 Bill Joy 工作的直接后代。
此外,Joy 是一位技术精湛且多产的 程序员,在几年的时间里,他 单枪匹马创造了大量重要的软件。 直到今天,世界上也不存在一个 没有深受 Joy 在 1975 至 1982 年间 于伯克利所做工作影响的 Unix 系统。1982 年,Joy 成为 Sun Microsystems 的联合创始人之一, 这家公司在它那个时代是世界上 最重要的 Unix 公司之一。
也许我可以这样说明 Joy 工作的 重要性。Joy 在伯克利工作已经是 二十多年前的事了,然而本书中 有好几章都在讨论他那时开发的 程序:vi 编辑器(第 22 章), 写于 1976 年;以及 C-Shell (第 11-14 章),写于 1978 年。
(趁我在感慨之际,让我也提一下 这个令人吃惊的事实:两个最 流行的 Unix 文本编辑器,至今仍被 广泛使用,而它们都是在非常 久以前写成的:vi 由 Bill Joy 于 1976 年写成,Emacs 由 Richard Stallman 于 1975 年写成。)
1977 年,Bill Joy 发布了伯克利 Unix 的第一个版本。那正是我 开始使用 Unix 的同一年。(当时我 是加利福尼亚大学圣迭戈分校 计算机科学的研究生。)
Bill Joy 发布的这个系统被称为 伯克利软件分发(Berkeley Software Distribution),后来简称为 BSD。 总共,Joy 最终向伯克利之外的 用户发出了大约 30 份。虽然这 看起来是个小数目,但它被认为是 一次成功,于是 1978 年中,Joy 发布了下一个版本 2BSD。
1979 年,AT&T 终于认识到 UNIX 的 潜力,并宣布他们要开始把它作为 商业产品出售。第一个商业版本 称为 UNIX System III("系统三号")。 后来它被 UNIX System V ("系统五号")取代。
到了 1979 年,所有 BSD 用户都 必须向 AT&T 购买许可,而且 AT&T 一年年地提高这个许可的价格。 BSD 的程序员们越来越难以忍受 AT&T 限制这副枷锁。
20 世纪 80 年代的 Unix:BSD 与 System V
(Unix in the 1980s: BSD and System V)
第一个 Linux 版本开发于 1991 年, 我们一会儿就会讲到。不过,要理解 Linux 在整个图景中的位置,我们 需要看看 20 世纪 80 年代 Unix 经历了什么。具体来说,我想解释 事情是如何发展到这样的地步: 到 80 年代末,Unix 有两个主要 分支:BSD 和 SYSTEM V。
到 1980 年,东海岸的 Unix (AT&T UNIX)与西海岸的 Unix (BSD)之间已经出现分野,而且 这种分野正在迅速扩大。
伯克利的程序员和 BSD 用户 痛恨仅仅为了安装 BSD 就不得不 向 AT&T 付钱。另一方面,AT&T 决心把 UNIX 做成一个成功的商业 产品,一个面向那些愿意花大钱 购买许可的公司需求的产品。
1980 年,我早先提到的那位伯克利 教授 Bob Fabry,从 DARPA(美国 国防高级研究计划局)得到了一份 开发 Unix 的大合同。DARPA 建立了 一个连接其所有主要研究中心的 全国性计算机网络。因此,他们 需要一个能在不同类型硬件上运行 的操作系统。伯克利这项资助的 目的,就是为此开发 Unix。
(顺便说一句:DARPA 正是同一个 机构,从 1965 年到 1988 年,它资助了 最终促成互联网诞生的研究。1972 年 之前,该机构名为 ARPA。因此, 互联网的祖先被称为 Arpanet (阿帕网),这个名字你也许听说过。 Arpanet 作为一个独立的实体于 1989 年关闭。)
Fabry 拿到 DARPA 合同之后,组建了 一个组织,称为计算机系统研究组 (Computer Systems Research Group, CSRG)。虽然 Fabry 当时不可能 知道,CSRG 将一直存在到 1994 年, 而在那些年里,它对 BSD 以及 全世界 Unix 的增长都产生了重大 影响。
然而 1980 年,Fabry 关心的只有 开发 BSD,CSRG 也全力投入这项 任务。多年来,他们发布了若干个 版本,这些版本在学术和研究界都 备受推崇。BSD 用户的数量开始 增长。到 1982 年,4.1BSD 支持 TCP/IP,而 TCP/IP 正是后来成为 互联网基础的那套系统。1983 年, 4.2BSD 发布,并被认为非常受欢迎, 在全世界近 1000 个安装点 上被使用。
在商业世界,AT&T 朝另一个方向 推进。AT&T 的目标是把 UNIX 作为 商业产品来营销。1982 年,他们 发布了 UNIX System III,这是 UNIX 在贝尔实验室之外的第一次公开发布。 1983 年,他们发布了 System V, 这是第一个提供官方支持的版本。 与此同时,AT&T 把三个内部小组 合并,成立了 UNIX 系统开发实验室 (UNIX System Development Lab)。
到年底,System V 的安装量达到 45000 套。1984 年,System V Release 2(SVR2)推出时,UNIX 的 安装量已达 100000 套。
于是,到 1985 年,Unix 有两条 主流的思想脉络。当然还有其他 形式的 Unix,但它们全都源自 BSD 或 System V,或两者兼有。(*)
* 脚注
事实上,这种局面一直持续到 90 年代中期,直到 Linux 和开源 运动日益增长的影响力,才永久地 改变了 Unix 的世界。
例如,在本书的前两版(1993 年和 1996 年)中,我讲的是 Unix 基本上 有两种变体:BSD 和 System V。
在 Unix 世界里,20 世纪 80 年代 末的特征有两点:Unix 整体的增长, 以及不同类型 Unix 的激增。
图 2-1 列出了 80 年代及其之后 使用过的最重要的商业 Unix。 (其中一些操作系统今天仍在出售。) 这些 Unix 无一例外,都基于 BSD 或 System V,或两者。
图 2-1(Figure 2-1):最重要的几种商业 Unix
| 名称 | 公司 | BSD 还是 System V? |
|---|---|---|
| AIX | IBM | BSD + System V |
| AOS | IBM | BSD |
| A/UX | Apple | BSD + System V |
| BSD/OS | Berkeley Software Design | BSD |
| Coherent | Mark Williams Company | System V |
| Dynix | Sequent | BSD |
| HP-UX | Hewlett-Packard | System V |
| Irix | Silicon Graphics | BSD + System V |
| MachTen | Tenon Intersystems | BSD |
| Nextstep | Next Software | BSD |
| OSF/1 | Digital Equipment Corp | System V |
| SCO Unix | Santa Cruz Operation (SCO) | System V |
| Solaris | Sun Microsystems | BSD + System V |
| SunOS | Sun Microsystems | BSD |
| Ultrix | Digital Equipment Corp | BSD + System V |
| Unicos | Cray Research | System V |
| UNIX | AT&T | System V |
| Unixware | Novell | System V |
| Xenix | Microsoft/SCO/Altos/Tandy | System V |
尽管所有重要的 Unix 都源自 BSD 或 System V,但版本 变得五花八门,而且有 好几年,其间充满了内斗与争执。
20 世纪 80 年代后半段,我是一名 撰稿人和顾问,我记得那些明争 暗斗和混乱。Unix 世界的特征就是: 各家公司结盟、毁盟、组建联合体、 解散联合体,并提出一个又一个 技术方案,全都旨在"标准化"Unix 并主导市场。
与此同时,在大学和研究机构中, Unix 用户越来越不安分。他们中 许多人使用某种 BSD 的变体,而 AT&T 对他们所做的事拥有部分 控制权,这让他们很不高兴。解决 办法是把 BSD 中基于 AT&T UNIX 的 部分从零开始重写。
这花了很长时间,但伯克利的 程序员们勤勉地工作,一次一个 部件地替换掉 BSD 中的 UNIX 部分。 创建一个完全独立的 BSD 版本是 一个崇高的目标,但直到 1992 年 它才实现。
1991 年的 Unix:等待...
(Unix in 1991: Waiting for...)
到 1991 年,PC 机已经问世十年 了。然而,仍然没有一种 PC 操作 系统能吸引黑客(hackers) — 那种 喜欢把东西拆开、纯粹为了好玩而 加以改装的程序员。DOS(用于 PC) 简单而让人不满足。Apple Macintosh 的操作系统更好一些, 但机器本身对爱好者来说太贵了。
Unix 本来是可以的。毕竟,世界上 一些最优秀的 hacker 多年来一直 在为之工作。然而,BSD(此时还) 不能在 PC 上运行,而商业版本的 Unix 贵得令人却步。
计算机科学教授们有类似的 难题。AT&T UNIX 本可以成为讲授 操作系统课程的好工具,只是 1979 年 AT&T 改变了他们的政策。 从他们所谓的 UNIX 第七版 (Seventh Edition)开始,AT&T 之外的 任何人都不允许查看 UNIX 的 源代码。
AT&T 的新政策意味着,不幸的是, UNIX 不能再用于教学了,因为 学习操作系统的学生需要能够查看 源代码,看看系统是如何工作的。
计算机科学教授们需要的,是一个 免费、随取随用的操作系统,一个 适合教学、并且源代码唾手可得 的系统。
有一位这样的教授,叫 Andrew Tanenbaum,他在阿姆斯特丹的 自由大学(Vrije Universiteit)任教。 他买了一台 IBM PC,着手从零 开始构建自己的操作系统。这个 新操作系统很像 Unix,但小得 多,所以 Tanenbaum 叫它 Minix ("minimal Unix",极简 Unix)。
Minix 不包含任何 AT&T 的代码, 这意味着 Tanenbaum 可以按照自己 的意愿分发这个新操作系统。 1987 年发布的第一个 Minix 版本, 设计上与 UNIX 第七版兼容。它 主要用于教学,而作为教学工具, 它是不错的(但并非完美)。
几年来,Minix 是想学习操作系统、 想动手实验的程序员所能用到最好 的工具。世界各地的人开始使用它, 尤其是在大学里。与此同时,大量 热心的志愿者开始自行修改 Minix。
然而,Minix 并没有满足人们的 期望。许多程序员喜欢它,并且 希望增强正式版本,但版权归 Tanenbaum 所有,而他否决了大多数 请求。他坚持认为,Minix 应当 保持为一个简单的、适合教学的 操作系统。
Minix 用户心怀不满。当 Richard Stallman 在 1985 年创立自由软件 基金会时,他激励了全世界的 程序员,他们渴望有一个强大的 自由操作系统,好让他们把集体的 能量施展出来。
当初,Stallman 就把一个自由的、 与 Unix 兼容的操作系统列为他的 第一个主要项目。他甚至为它想了 一个名字:GNU。到 1991 年,Stallman 和 FSF 已经创造了大量高质量的 自由软件,但 GNU 本身离完成还 差得远。
正如我们前面讨论的,构成 Unix 的 程序有两类:内核,以及其他一切, 我们称之为"实用工具"。到 20 世纪 80 年代末,FSF 已经编写了 许多重要的实用工具,其中包括一个 Shell。然而,他们没有一个完成的 内核(操作系统的核心)。
Stallman 和 FSF 的程序员们已经 工作了一段时间,但 GNU 内核 (他称之为 HURD)远未完成。事实上, HURD 的工作实际上直到 1990 年 才真正开始,多年来,全世界的 程序员每晚都哭着入睡,哀婉地 唱着:"总有一天,我的 HURD 会来..."
那么,把这一切汇总起来:到 1991 年,PC 机已经上市十年,成千上万 的程序员、学生和计算机科学家都 强烈渴望一个开源的、类 Unix 的 操作系统。
然而,AT&T 已经把 UNIX 商业化到了 无以复加的地步。BSD 是可以得到, 但它被 AT&T 的许可所拖累。Minix 还过得去,但远非完美。虽然它的 源代码唾手可得,但仍然需要许可, 而且不能自由共享。另一方面,GNU 是在 GPL 著佐权的庇护下分发的, 这很棒。然而,内核 — 操作系统 最重要的部分 — 离完成还很远 很远。
命中注定般,芬兰一位名叫 Linus Torvalds 的年轻学生刚刚开始了 一个项目:纯粹为了好玩,他决定 编写自己的操作系统内核。
Torvalds 全然不知,十年之内, 他个人的操作系统将成长为历史上 最重要的开源事业,一个富有创新 精神的项目,终有一日将汇聚 数十万程序员,而且真真切切地 改变了世界。
名称的由来
Hurd
在我们讨论内核时,我解释过, 大多数操作系统要么使用宏内核 (单个大型程序),要么使用微内核 加上若干称为服务器的小程序。 对于 GNU,Richard Stallman 选择 使用一个名为 Mach 的微内核, 再加上一组他称为"the Hurd"的服务器。 (这个名字由主要的内核程序员 Thomas Bushnell 所起。)
严格来说,GNU 内核应当描述为 运行在 Mach 之上的 Hurd(服务器)。 不过在通常用法中,整个内核 通常都被称为 Hurd。
你已经知道,当 Stallman 为自由 软件基金会版本的 Unix 起名时, 他决定叫它 GNU:"GNU's not Unix" 的递归缩略词。轮给内核起名时, Stallman 超越了自己。
Hurd 这个名字代表 "HIRD of Unix-Replacing Daemons"(取代 Unix 的守护进程之 HIRD)。(在 Unix 中, "daemon"(守护进程)是一种自己在 后台运行的程序。)HIRD 这个名字 代表 "HURD of Interfaces Representing Depth"(以层次化接口 表示深度的 HURD)。
因此,Hurd 是一个间接递归的 缩略词。(希望它也是你这辈子 唯一会遇到的一个。)
...等待意中人,Linus Torvalds
(...Mr. Right, Linus Torvalds)
Linus Torvalds 是这样一个典型的 人:带着对的想法,出现在对的 地方,而且时机也对。
1991 年,Linus(发音为 "Lee'-nus")是赫尔辛基大学计算机 科学专业的二年级学生。和数以 万计热爱捣鼓的编程学生一样, Linus 读过 Andrew Tanenbaum 的书 Operating Systems: Design and Implementation,该书解释了 Minix 设计背后的原理。作为书的附录, Tanenbaum 收录了构成该操作系统的 12000 行源代码,Linus 花了大量 时间研读细节。(此时,你也许想 花点时间想想,通读 12000 行代码 需要什么样的功夫,再把它和你在 本书附录中找到的信息类型比较 一下。)
和许多其他程序员一样,Linus 想要 一个自由(开源)版本的 Unix。与 其他程序员不同的是,Linus 不愿 等待。
1991 年 8 月 25 日,Linus 向 用作 Minix 论坛的那个 Usenet 新闻组(comp.os.minix)发出了 一条消息。事后看来,这条简短的 消息被认为是 Unix 世界的历史 文献之一,所以我要把它完整地 展示给你。阅读时请记住,英语 是 Linus 的第二语言,而且他写的 是非正式的文字。
Linus Torvalds 宣布他的新项目...
From: torvalds@klaava.Helsinki.FI (Linus Benedict
Torvalds)
Newsgroups: comp.os.minix
Subject: What would you like to see most in minix?
Summary: small poll for my new operating system
Date: 25 Aug 91 20:57:08 GMT
Organization: University of Helsinki
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. This has been brewing since
april, and is starting to get ready. I'd like any
feedback on things people like/dislike in minix,
as my OS resembles it somewhat (same physical
layout of the file-system (due to practical
reasons) among other things).
I've currently ported bash(1.08) and gcc(1.40),
and things seem to work. This implies that I'll
get something practical within a few months, and
I'd like to know what features most people would
want. Any suggestions are welcome, but I won't
promise I'll implement them :-)
Linus (torvalds@kruuna.helsinki.fi)
PS. Yes - it's free of any minix code, and it has
a multi-threaded fs [file system]. It is NOT
protable (uses 386 task switching etc), and it
probably never will support anything other than
AT-harddisks, as that's all I have :-(.
显然,Linus 只是想通过构建自己的 操作系统找点乐子。他认识到自己 的主要工作将是编写一个内核, 因为绝大多数实用工具已经由 自由软件基金会提供,到时候他 可以按自己的用途加以改造。
1991 年 9 月,Linus 发布了他 内核的第一个版本,他把它称为 LINUX。Linux 通过互联网分发, 没过多久,Linus 就开始一个版本 接一个版本地发布。全世界的 程序员开始加入 Linus:先是几十个, 然后几百个,最终几十万个。
有意思的一点:Linus 选择用宏内核 来设计 Linux。Andrew Tanenbaum 写的 Minix 使用的是微内核。Linux 开始引起关注后不久,Tanenbaum (一位著名的教授)公开痛批 Linus (一个几乎默默无闻的学生)的这个 设计决定。直到今天,在 Linux 内核已经成为历史上最成功的 Unix 形式的基础之后,Tanenbaum 仍然批评 Linus 使用宏内核。 (就个人而言,我读过 Tanenbaum 的论述,我认为他错了。)
最终,Linux 流行到可以在各种 类型的计算机上运行:不仅是 PC, 从带有小型内置处理器的手持 设备,到大规模并行的超级计算 集群 — 世界上最快、最强大的 系统,无所不包。事实上,到 2005 年,计算机世界的几乎每一个 角落都将被运行某种 Linux 的机器 占据,Linux 将成为世界上最受欢迎 的操作系统。(Windows 分布更广, 但 Linux 更受欢迎。)
Linux 为什么如此成功?有四个 原因,而且它们都与 Linus 本人 有关。
第一,Linus Torvalds 是一位技术 极其精湛、学识极其渊博的程序员。 他干活很快,而且热爱编程。换句 话说,他正是那种会以编写自己的 操作系统内核为乐的人。
第二,Linus 是一个没有尽头的 完美主义者。他全心投入自己的工作, 当一个问题落到他头上时,不找到 解决方案,Linus 绝不罢休。在 Linux 的早期,Linus 的修改做得 极快,有时他一天之内发布的 新内核就不止一个!
第三,Linus 有着讨人喜欢的 性格。人们形容他低调、谦逊: 一个地地道道的好人(见图 2-2)。 无论是在现实中还是在网络上, Linus 几乎和所有人都相处融洽, 因为他太好说话了。正如他在 一次采访中提到的,"与 Richard Stallman 不同,我真的没有什么 '理念'要宣扬。"
第四 — 也是最重要的 — Linus 有一种天才:他善于利用互联网, 去开掘编程才华的活水源头: 那千千万万愿意志愿投入精力 来修改和扩展 Linux 内核的人。
|
|
图 2-2(Figure 2-2):Linus Torvalds Linus Torvalds。1991 年,Linus 发起了一个创建新操作系统内核的 项目,我们现在称之为 Linux 内核。 Linux 内核是各种 Linux 操作系统的 基础,这使得 Linus 的事业成为 历史上最重要的软件项目之一。 从照片中你可以看出,Linus 并不 把自己当回事。 |
Linux 有多大?今天,Linux 内核 整体由一万七千多个文件和数百万行 代码组成。每天,志愿程序员会 提交数百个补丁(patches,即 改动或更正)。(把这一点和最 初的内核作个对比很有意思: 0.01 版由 83 个文件组成,代码 总共不到 9000 行。)
有这么多人在做这项工作,也给 Linus 带来了不同寻常的机会,因为 他有足够的脑力来应对出现的任何 新问题。例如,每当一种新硬件 问世,总有某个地方的某人知识 足够渊博,能写出代码让新设备 在 Linux 下工作。
很早,Linus 就做出了一个战略 决定:在 GNU GPL 的庇护下发布 Linux 内核。这个决定证明是 至关重要的,因为它鼓励程序员 志愿贡献自己的时间。他们知道, 他们所做的一切都将被自由地 与全世界共享。此外,GPL 确保 任何最终使用 Linux 内核的操作 系统本身也将在 GPL 的庇护之下, 因而可以自由分发。
从一开始,Linus 就尽可能频繁地 发布内核的新版本。通常,程序员 喜欢把新软件攥在手里,以便在 程序公开发布之前彻底测试它, 并尽可能多地修复 bug。
Linus 的天才之处在于他认识到: 既然他是向庞大的受众发布软件, 就会有那么多人在测试和阅读 新代码,任何 bug 都藏不了 多久。这个思想体现在如今所称的 LINUS 定律(LINUS'S LAW)中: "只要眼睛够多,所有 bug 都浅显可见。"
Linus 发布内核新版本的频率远非 前人可比,bug 被迅速识别并修复, 常常在几小时之内。结果是,Linux 的进展比世界历史上任何大型软件 项目都快、都好。
名称的由来
Linux
Linux 的正确发音是与"Bin'-ex" 押韵。
从一开始,Linus Torvalds 就非正式 地使用 Linux 这个名字,"Linux"是 "Linus's Minix"(Linus 的 Minix)的 缩合。不过,他原本打算在发布 内核的第一个公开版本时使用 Freax("free Unix",自由 Unix) 这个名字。
碰巧,另一位程序员 Ari Lemmke 说服了 Linus 把文件上传到 Lemmke 运行的一台服务器上,以便通过 一个称为"anonymous FTP"(匿名 FTP) 的系统轻松访问。Lemmke 对 Freax 这个名字不满意,所以当他建立一个 存放这些文件的目录时,他把 目录取名为 linux,这个名字 就留下来了。
Linux 发行版
(Linux Distributions)
严格说来,Linus Torvalds 和 Linux 项目所创造的是一个内核,而不是 一个完整的操作系统(现在依然如此)。 内核第一次发布时,你需要成为 Unix 专家才能使用它,因为你必须 找到所有必需的零碎部件,把它们 组装成一个操作系统。
然而,在 Linus 首次发布内核后 五个月之内,就有人提供基于 Linux 内核的自由操作系统。这样的 作品称为 Linux 发行版 (Linux DISTRIBUTION,有时简写为 DISTRO)。
你可以想象,最初的几个发行版 受到 Linux 社区的欢迎,但不幸的是, 它们没有得到良好的维护。不过 1993 年 7 月,一位名叫 Patrick Volkerding 的程序员宣布了一个新 发行版,他称之为 SLACKWARE。这个名字 来自 "slack" 一词,指的是实现 个人目标时那种兴奋与满足的 感觉。(想了解更多信息,可以去 查一查 Church of the SubGenius。)
Slackware 之所以成功,是因为多年来 Volkerding 始终设法维护着它。今天, 它是仍在积极开发的最古老的 Linux 发行版。事实上,Slackware 如此受欢迎,以至于它衍生出 整整一个发行版家族和自己的支持 团体。
今天的现代 Linux 发行版提供的是 完整的产品:内核、实用工具、 编程工具,以及至少一个 GUI。就我 写作此书之时,这样的发行版实打实 有数百个。(如果你愿意,一旦你 精通 Unix,你也可以做一个属于 你自己的 Linux 发行版。)
在离开本节之前,我要确保你 理解"Linux"这个词有两层 含义:第一,"Linux"指的是一 个内核,是无数在 Linux 项目上 工作的程序员的产品。
第二,"Linux"是任何基于 Linux 内核的操作系统的名字。这是 大多数人说话时的用法,也是本书 将采用的用法。
大多数 Linux 发行版使用自由软件 基金会的 GNU 实用工具 (GNU UTILITIES)。出于这个原因,FSF 坚持认为基于 Linux 的操作系统 实际上应当称为 GNU/Linux。我 不认识任何这样称呼的人,但你 也许该记住这一点,万一你在某家 Unix 酒吧闲逛,恰好碰上了 Richard Stallman。
BSD 发行版
(BSD Distributions)
正如我们早先讨论的,在 20 世纪 80 年代,BSD 是 Unix 的两大主流 之一。(另一个是 System V。)BSD 在加利福尼亚大学伯克利分校的 计算机科学系内开发,自 1980 年起,其开发由 CSRG(计算机 系统研究组)管理。
到 80 年代末,BSD 的狂热爱好者 对 AT&T 把 Unix 商业化的做法 心怀不满。由于 BSD 包含 AT&T UNIX 的某些专有成分,又由于 CSRG 随操作系统一起发布源代码, 每个 BSD 用户都被迫向 AT&T 购买昂贵的源代码许可。
因此,CSRG 给自己定了一个目标: 彻底重写 BSD 中所有基于 AT&T 的 部分。这样做就能把 BSD 一劳永逸 地从 AT&T 律师(以及 AT&T 市场部) 的魔爪中解放出来。
1989 年,CSRG 提供了第一个完全 开源的 BSD 发行版,称为 Networking Release 1(更正式的 名称是 4.3BSD NET/1)。然而, NET/1 主要由网络工具组成 — 这些工具独立于 AT&T UNIX — 而不是完整的 BSD 操作系统。
要创建一个真正独立的 BSD 版本, 就需要重写数百个 AT&T 的实用 工具和编程工具,但这必须做。 CSRG 借助互联网向外部程序员 征集帮助,一年半之内,所有 AT&T 的实用工具都被换成了全新 的程序。
对代码的仔细检查表明,BSD 中 一切都没问题,只有六个内核 文件除外。重写这六个文件将是 一项大工程,所以 1991 年,CSRG 发布了 BSD 的一个新版本,它几乎 不含 UNIX。他们称之为 NET/2。
1992 年,一位名叫 Bill Jolitz 的 程序员重写了最后六个有问题的 文件,并用它们为 PC 创建了一个 BSD 版本。他把这个操作系统称为 386/BSD,并开始通过互联网分发。
这是一项巨大的成就。经过这 许多年,伯克利的圣杯 — 一个独立 于 AT&T Unix 的操作系统 — 终于 存在了。最后,BSD 可以作为开源 软件自由地分发给世界上任何 人。
这很重要,因为 BSD 包含了有史 以来最优秀的 Unix 软件中的 一部分。直到今天,世界上也几乎 没有什么 Unix 不包含 BSD 代码。 事实上,大多数 Linux 发行版都 使用大量 BSD 实用工具。出于这个 原因,386/BSD 的创建是 Unix 历史上的里程碑之一。
没过多久,386/BSD 变得流行起来, 维护它的人数也在不断增加。 然而,Jolitz 有一份全职工作, 他无法处理源源不断涌入的补丁和 增强功能。因此,一个志愿者团体 成立,接过了这项工作。这个团体 做的第一件事,就是把操作系统 改名为 FreeBSD。
最初,FreeBSD 只能在 PC 硬件上 运行,这对大多数用户来说没问题。 然而,有些人希望在其他类型的 机器上运行 BSD,于是成立了新的 团体,目标是把 FreeBSD 移植到 尽可能多的其他类型计算机上。 这个新团体提供的版本称为 NetBSD。
20 世纪 90 年代中期,NetBSD 团体 又衍生出另一个团体,他们想专注于 安全和密码学。他们的操作系统 称为 OpenBSD。
你可以看到,BSD 的世界只有三个 主要发行版(FreeBSD、NetBSD 和 OpenBSD),这与 Linux 的世界 大不相同,后者实打实地有数百个 不同的发行版。
到这里,你也许在想:如果 FreeBSD 完全开源,并且通过互联网免费 分发,那么,为什么最终变得如此 流行的 Unix 版本是 Linux?
有两个原因。第一,Linux 是在 GNU GPL 的庇护下分发的,而 GPL 鼓励共享。由于 GPL 禁止任何人 用 Linux 创造并分发专有系统, 用 Linux 所做的一切都属于全 世界。
BSD 许可证的限制远比 GPL 宽松。 在 BSD 许可证之下,你可以使用 BSD 的一部分来创造新产品,而 不必共享它。当这种情况发生时, 整个世界就得不到使用和修改 这个新产品的好处。出于这个 原因,许多程序员更愿意参与 Linux。
(另一方面,正因为 BSD 许可证如此 灵活,FreeBSD 被广泛用在形形色色的 机器和设备上,也被用在世界上 大量的 Web 服务器上。)
Linux 比 FreeBSD 更成功的第二个 原因,与时机有关。事后来看很 清楚:到 80 年代末,全世界的 程序员都强烈需要一个完全开源 的 Unix 版本。由于 Linus Torvalds 在 1991 年就发布了 Linux 内核, 而 386/BSD 直到 1992 年才发布, Linux 因此抢得了先机。结果是, Linus 能够吸引大量程序员,他们 正等着为世界上第一个自由的 Unix 版本工作。
现在你就知道,为什么本书叫 Harley Hahn's Guide to Unix and Linux,而不叫 Harley Hahn's Guide to Unix and FreeBSD 了。
(现在你也知道了,为什么我说 Linus Torvalds 是对的想法、对的 地方、对的时间出现的对的人。)
你应该使用哪一种 Unix?
(What Type of Unix Should You Use?)
Unix 的种类如此之多,于是一个 问题产生了:你应该使用哪一种 Unix?
答案(有好几个)其实相当简单。 不过在我往下讲之前,先告诉你: 就实际目的而言,基本的 Unix 就是基本的 Unix:如果你会用一种 Unix,你就会用所有 Unix。特别是, 当你阅读本书时,你用的是哪一种 Unix 真的无关紧要(只要你别 嘴里塞满东西读书)。
我 1977 年第一次使用 Unix,当时 学到的所有东西到今天仍然一样 管用。如果你在 1977 年就用过 Unix,然后掉进了时间隧道,2005 年在一台 Linux 或 FreeBSD 计算机 前醒来,你会有什么感觉?你得 学习如何使用一些新工具,包括 一种新的、精密的 GUI(图形用户 界面)。然而,你不会觉得自己 醒来时身处一个全新的世界。 Unix 就是 Unix。
话虽如此,以下是我的建议。
很多时候,你用哪种 Unix 并由 不得自己。例如,你也许在一家 使用商业 Unix(比如 IBM 的 AIX 或 Sun 的 Solaris)的公司工作;或者 你也许在上一门课,课上每个人 都必须使用同一种 Linux;或者你 也许正和你奶奶一起捣鼓计算机, 她坚持使用 FreeBSD,因为它让她 想起 70 年代在伯克利度过的 快乐时光。
如果是这样,随大流就好,不用 担心。Unix 就是 Unix。
如果你在选择自己的 Unix,可以这样 决定:
1. 如果你使用 Unix 是因为你想 了解它的工作原理、想学会定制 自己的环境、想学编程,或者只是 想找乐子,那就用 Linux。
为了帮你做选择,图 2-3 列出了 最重要的 Linux 发行版。这些 发行版在互联网上都 很容易找到。大多数发行版都可以免费 下载。
如果你拿不准该用哪一个,就用 Ubuntu。
图 2-3(Figure 2-3):最重要的 Linux 发行版
| 名称 |
|---|
| Debian |
| Fedora Core |
| Gentoo |
| Knoppix |
| Mandriva(前身为 Mandrake) |
| MEPIS |
| Red Hat |
| Slackware |
| SuSE |
| Ubuntu |
| Xandros |
2. FreeBSD 非常稳定可靠,往往 开箱即用。所以,如果你在一家 公司工作,想要一个尽可能不需要 你操心的系统,就用 FreeBSD。 同样,如果你在家工作,想运行 一台服务器(比如 Web 服务器), 就用 FreeBSD。
如果你的系统不被 FreeBSD 支持, 就用 NetBSD。如果你对安全极为 感兴趣,就用 OpenBSD。
为了完整起见,图 2-4 列出了最 重要的 BSD 发行版。
图 2-4(Figure 2-4):最重要的 BSD 发行版
| 名称 |
|---|
| FreeBSD |
| OpenBSD |
| NetBSD |
3. 如果你想在 Microsoft Windows 下 运行 Unix,可以使用一个名为 Cygwin 的免费产品。一旦安装了 Cygwin,你只要打开一个 Cygwin 窗口,在那个窗口里,一切看起来 都像 Linux。
我喜欢 Cygwin。尽管我有好几台 Unix 计算机,我经常使用 Windows, 有了 Cygwin,我随时都能用上我 最喜欢的 Unix 程序。
4. 最后,如果你想要 Unix,但又 想它看起来像 Windows,那就买一台 Macintosh,运行 OS X。
OS X 是 Macintosh 的操作系统。 尽管它有 Mac 风格的外观和手感, 但其实骨子里是 Unix。具体说, OS X 使用一个基于 Mach 的微内核、 FreeBSD 的实用工具,以及一个 名为 Aqua 的专有 GUI。
要在 OS X 之下直接访问 Unix, 只要打开一个 Terminal 窗口。 (你可以在 Applications/Utilities 文件夹里找到 Terminal。)
名称的由来
OS X
OS X(Macintosh 的操作系统)读作 "O-S-ten"。这个名字是一个双关。
前一个 Mac 操作系统 — 它不是 基于 Unix 的 — 称为 OS 9。因此, "X"代表罗马数字 10,但同时也让 你联想到 Unix。
如何获得 Linux 或 FreeBSD?
(How Do You Get Linux or FreeBSD?)
大多数时候,Unix 是从一张或多张 CD 上安装的。要安装 Linux 或 FreeBSD,你要做的就是找一个免费 下载站点(很容易),下载文件, 刻成 CD,然后用这些 CD 安装 操作系统。
更好的是,如果你四处问问, 也许能找到已经有这些 CD 的人。 由于 Linux 和 FreeBSD 都是自由 软件,借用 CD 或者自己刻一份 拿去与他人分享,都不成问题。
当你以这种方式安装 Linux 或 FreeBSD 时,操作系统就驻留在 你的硬盘上。如果你的 Unix 系统是你计算机上唯一的 操作系统,情况就很简单。每当你 打开计算机,Unix 都会自动引导。
另一种做法是,你可以在计算机上 安装多个操作系统。例如,你也许 同时想要 Windows 和 Unix,这样 你就可以按需来回切换。不过, 你一次只能运行一个操作系统, 而要从一个切换到另一个,你需要 重新启动计算机。这样的设置称为 双重引导(DUAL BOOT)系统。
使用双重引导系统时,你会用到一个 称为引导加载程序(BOOT LOADER)的 特殊程序。每次你启动或重新启动 计算机时,引导加载程序都会接管 控制权。它的工作是向你显示一份 可用操作系统的清单,让你选择 想要的那一个。然后引导管理器把 控制权交给相应的内核,内核再 启动操作系统的其余部分。(一般 来说,如果你的 PC 用一分钟完成 引导,其中大约 15 秒由引导 加载程序使用,大约 45 秒用于 加载操作系统。)
最常见的 Linux 引导加载程序是 GRUB(Grand Unified Bootloader)和 LILO(Linux Loader)。LILO 很久以前 作为 Linux 发行版的一部分开发 出来,多年来维护得很好。GRUB 较新,是作为 GNU 的一部分开发 的。两种引导加载程序都不错,但 如果你有选择,用 GRUB,因为它 更强大、更灵活。
要把你的机器设置成双重引导 系统,你必须把硬盘划分成称为 分区(PARTITIONS)的部分。为此,你要 使用所谓分区管理器(PARTITION MANAGER)。每个操作系统都必须 安装在它自己的分区上(如果需要 不止一个,则安装在多个分区上)。
最常见的双重引导系统是 Windows 与某种 Unix 共存的系统。然而, 你完全可以把磁盘分区,在同一台 计算机上使用两个以上的操作 系统。例如,你可能装有 Windows、 Fedora Core Linux 和 FreeBSD。 这时引导加载程序会给你三个 选择,而不是两个。在这种情况下, 我们会说你有一个多重引导 (MULTI-BOOT)系统。
运行 Unix 的第二种方式,是不把 它安装到你的硬盘上。相反,你可以 从一种称为 LIVE CD(活光盘)的特殊 CD 引导。
活光盘是一张被制作成可引导的 CD-ROM,它包含运行一个完整 操作系统所需的一切:内核、 实用工具等等。当你从活光盘 引导时,你绕过了硬盘。这让你 可以随时随地使用第二个(或第三、 第四个)操作系统,而不必在磁盘上 安装任何东西。
例如,如果你是 Windows 用户, 你可以试用 Linux 或 FreeBSD,而 不必重新分区并安装一整套新的 操作系统。同样,如果你是 Linux 用户,你可以试试 FreeBSD,而不必 对系统做任何改动。有些还拿不准 自己想长期用哪种 Linux 的人, 会用活光盘来试用不同的发行版。
当你使用不属于自己的 PC 时, 活光盘也很有用。例如,如果你在 一家强迫你使用 Windows 的公司 工作,你可以用一张 Linux 活光盘 在没人注意时运行 Unix。或者,如果 你在替朋友修计算机,你可以引导 自己的操作系统、用上你最喜欢的 工具,而不必对你朋友的计算机 做任何改动。
要制作一张活光盘,只要挑一张你 想要的,下载文件,然后刻成 CD。 你甚至可以做好几张活光盘,用来 试验不同的系统。
互联网上有许多不同的活光盘 可以免费获得。为了帮你挑选, 图 2-5 列出了最重要的几种。如果你 拿不准该用哪一个,就用 Knoppix (发音为 "Nop'-pix")。
图 2-5(Figure 2-5):最重要的 Linux 与 FreeBSD 活光盘
| 名称 |
|---|
| Damn Small Linux |
| FreeBSD |
| Kanofix |
| Knoppix |
| MEPIS |
| PCLinuxOS |
| SLAX |
| SuSE |
| Ubuntu |
— 提示 —
如果即使驱动器里放了 CD,你的 计算机仍从硬盘引导,请检查 BIOS 设置。
你可能需要修改某个设置,告诉 计算机先寻找可引导的 CD,再寻找 可引导的硬盘。
如何在完整的硬盘安装与活光盘 之间做选择?
完整的安装是一种"承诺",因为它 要求你对硬盘做出持久的改动。 (当然,如果你愿意,这些改动 也可以撤销。)完整安装的优点是, 操作系统永久地待在你的磁盘上。 这不仅方便,而且你可以定制你的 系统、永久保存文件。
用活光盘,需要做出的承诺就少 一些。然而,除非你预留一个专门的 磁盘分区给活光盘存放数据,否则 你无法做出永久的修改,也无法 保存 Unix 数据文件。
而且,从活光盘运行 Unix 会略微 降低你计算机的性能。从 CD 引导 不仅比从硬盘引导慢,活光盘系统 还必须创建一个 RAM 磁盘,用来存放 平时放在硬盘上的文件。这会占用你 的一部分内存。(RAM 磁盘是内存中 用来模拟真实磁盘的那一部分。)
一个不错的折中办法,是把 Unix 安装到某种可移动存储设备上, 例如 USB 钥匙盘(有时称为 USB 闪存盘)。这是一种很小、可携带的 设备,插到 USB 端口上,表现就像 一块小硬盘。
一旦你把 Unix 安装到钥匙盘上, 你要做的只是把它插入 USB 端口, 打开(或重新启动)计算机,Unix 就会自动引导。(你可能需要改变 计算机的 BIOS 设置,告诉它先从 钥匙盘引导,再从硬盘引导。)
通过安装到钥匙盘,你在不必修改 硬盘的情况下,就获得了永久 Unix 系统的大部分好处。例如,当你从 钥匙盘引导时,你可以修改系统、 可以保存文件,如此等等。与只读的 CD-ROM 不同,钥匙盘是可读可写的。 而每当你想使用硬盘上的操作系统时, 只要拔出钥匙盘重新启动即可。
尽管如此,一旦你决定长期使用 某个操作系统,你会发现把它安装 在硬盘上更快、更实用。灵活固然 好,但从长远看,和生活中大多数 事情一样,投入承诺效果更好。
— 提示 —
下载并安装任何类型的 Unix 都会 比你预想的耗时更长,所以别在 赶时间的时候动手。
例如,如果今晚是你的洞房花烛夜, 而你有半小时的空当可以让妻子去 换衣服、收拾一下,那么此时开始 一次全新的 Linux 安装可不是好主意。
什么是 Unix?什么是 Linux?
(What Is Unix? What Is Linux?)
在我们离开本章之前,我想再次回答 这两个问题:什么是 Unix?什么是 Linux?以此来总结我们的讨论。
Unix 是一种多用户、多任务的操作系统, 它由类 Unix 内核、类 Unix 实用工具和类 Unix Shell 组成。 任何使用 Linux 内核的 Unix,都被 称为 Linux。(正如我们讨论过的, "Unix-like"(类 Unix)这个说法 并没有一个确切的定义。你只有在见到它 的时候才认得出它。)
不过,看待 Unix 还有另一种方式。
多年来,许许多多极其聪明的人为 Unix 付出努力,只为给自己打造尽可能最好的 工具。作为 Unix 用户,你我都将从 他们的成果中受益。
在我看来,Unix 是一个抽象的概念:一种 实实在在、指导人们以特定方式解决问题的 应用哲学。在使用 Unix 的过程中,你会 学会用 Unix 的方式去接触问题、解决 问题。例如,你会学会把简单的工具像积木 一样组合成精巧的结构,用来解决复杂的 问题;你会学会自力更生,自己学会大部分 需要掌握的知识;你还会学会以合乎逻辑的 方式组织自己的想法和行动,把自己的时间 和精力用在刀刃上。
这样一来,你就在追随巨人的脚步,你的 心智也会因此变得更好。这也许现在难以 理解,但别担心。只要和 Unix 相处得 足够久,你就会亲眼看到这一点。
因此,让我再给你一个 Unix 的定义。 这是我所知道的关于 Unix 最好的定义, 也是我希望你在阅读本书时牢记的定义。
我会以提示的形式送给你:
— 提示 —
Unix 是为聪明人准备的一套工具。
练习
(Exercises)
复习问题 #1:
什么是操作系统?
复习问题 #2:
什么是内核?说出内核所执行的 四项任务。
复习问题 #3:
什么是开源软件?为什么它很重要?
复习问题 #4:
什么是 Linux?
第一个版本的 Linux 是什么时候发布的? 由谁发布?
进一步思考 #1:
如果没有 Unix,互联网还可能出现吗?
如果没有互联网,Linux 还可能出现吗?
进一步思考 #2:
1985 年,Richard Stallman 创立自由 软件基金会时,他调动起了全世界许多 程序员的热情,他们都希望为一个自由的 操作系统出力。后来,在 20 世纪 90 年代初,Linus Torvalds 同样找到了 愿意帮助他的程序员,在这个案例中, 他们是来开发 Linux 内核的。
为什么有这么多程序员愿意在一个艰难的 项目上长期工作,然后把自己的劳动成果 无偿送人?这种情况在年轻程序员中是不是 比在年长程序员中更常见?如果是,为什么?
进一步思考 #3:
按照传统,人们期望律师无偿提供一定 数量的工作作为公共服务,这类工作被 称为 pro bono publico(拉丁语: "为了公共利益")。编程行业是否也应该 对自己的成员抱有同样的期望?如果应该, 为什么?如果不应该,又为什么?
© 本书全部内容,2026 年版权所有,Harley Hahn
完整的商标与版权信息