《Linux/UNIX系统编程手册(上、下册)》——1.2 Linux简史

  1. 云栖社区>
  2. 博客>
  3. 正文

《Linux/UNIX系统编程手册(上、下册)》——1.2 Linux简史

异步社区 2017-05-02 16:22:00 浏览4002
展开阅读全文

本节书摘来自异步社区《Linux/UNIX系统编程手册(上、下册)》一书中的第1章,第1.2节,作者:【德】Michael Kerrisk著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.2 Linux简史

术语Linux通常用来指代完整的类UNIX(UNIX-like)操作系统,Linux内核只是其中的一部分。这么定义多少有些措辞不当,因为一般商业Linux发布版中所含的诸多关键组件实际上发源于另一项目,早在Linux问世前几年就已经启动了。

1.2.1 GNU项目
1984年,Richard Stallman之前一直供职于MIT的一位天赋异禀的程序员,开始着手创建一个“自由的(free)”UNIX实现。Stallman的观点属于道德层面,而对“free”一词的定义则属于法律范畴而非经济范畴。然而,Stallman所描述的这一法律意义上的“自由(freedom)”却蕴含着言外之意:应可免费或以低价获得诸如操作系统之类的软件。

对于那些在专有操作系统上强加限制条款的计算机厂商来说,Stallman 的这一举动无疑妨害了他们。所谓的限制条款是指:在一般情况下,计算机软件的消费者不但无权阅读自己所购软件的源码,而且还不能复制、更改及重新发行所购软件。Stallman指出,在这种体制之下,只会造成程序员之间勾心斗角、敝帚自珍的局面,无法实现工作协同和成果共享。

与之针锋相对,为开发出一套完整而又可自由获取,包含内核以及所有相关软件包的类UNIX系统,Stallman发起了GNU项目(“GNU’s not UNIX”的递归缩写形式),并积极邀请有志之士加盟。1985年,Stallman创立了非盈利机构——自由软件基金会(FSF),以支持GNU项目和广义意义上的自由软件开发。

GNU项目启动之时,BSD还不具备Stallman所指的那种“free”属性。使用BSD不但仍需获得AT&T的许可,而且用户不得随意修改并重新发布BSD中AT&T拥有产权的代码部分。
GNU项目的重要成果之一是制定了GNU GPL(通用公共许可协议),这也是Stallman倡导的自由(free)软件概念在法律上的体现。Linux发布版中的大多数软件,包括Linux内核,都是以GPL或与之类似的许可协议发布的。以GPL许可协议发布的软件不但必须开放源码,而且应能在GPL条款的约束下自由对其进行重新发布。可以不受限制的修改以GPL许可协议发布的软件,但任何经修改后发布的软件仍需遵守GPL条款。若经过修改的软件以二进制(可执行)形式发布,那么软件的修改者必需满足软件使用者的以下要求:以不高于发行成本的价格,获得修改后的软件源码。GPL的第一版发布于1989年。当前的许可协议版本为2007年发布的第三版。此许可协议的第二版于1991年发布,至今仍在广泛使用,Linux内核就是以该版许可协议发布的。(对各种自由软件许可协议的讨论可见诸于[St. Laurent, 2004]和[Rosen, 2005]。)

最初,GNU项目未能开发出能够有效运作的UNIX内核,但却开发了大量其他程序。由于这些程序全都针对类UNIX系统而设计,因此(理论上)均有可能在现有的UNIX实现上运行(实际情况也的确如此),更有甚者,有时还被移植到了其他操作系统上。Emacs文本编辑器、GCC(原名为GNU C编译器,现更名为GNU编译器集合,集C、C++,以及其他编程语言的编译器于一身)、bash shell以及glibc(GNU C语言库)便是GNU项目结出的硕果。

到了20世纪90年代早期,GNU项目已经开发出了一套几乎完整的操作系统,除了还缺少其中最重要的一环:能够有效运转的UNIX内核。于是,GNU项目以Mach微内核为基础,发起了一项雄心勃勃的内核设计计划,史称GNU/HURD计划。然而,时至今日,HURD的发布还遥遥无期(写作本书之际,HURD的研发尚在进行中,该内核目前只能运行于x86-32架构之上)。

在构成通常所说的“Linux系统”的程序代码中,由于有相当一部分都源自GNU项目,因此Stallman更愿意用“GNU/Linux”一词来称呼整个系统。这一称谓问题(Linux Vs. GNU/Linux))也在自由软件社区中引发了一些口舌之争。因为本书主要关注Linux内核的API,故而通常会采用术语“Linux”。
万事具备,独缺内核。只要再拥有一个能够有效运作的内核,就能使GNU项目开发出的UNIX系统“功德圆满”。

1.2.2 Linux内核
1991年,Linus Torvalds,一位芬兰赫尔辛基大学的学生,在外界的激励下为自己的Intel 80386 PC开发了一个操作系统。在一门学习课程中,Torvalds开始接触Minix——由荷兰大学教授Andrew Tanenbaum于20世纪80年代中期开发的一款小型、类UNIX的操作系统内核。Tanenbaum将Minix连同源码完全开放,作为大学操作系统设计课程的教学工具。人们可以在386系统上构建并运行Minix内核。当然,正因为其主要用于教学,Minix在设计上几乎独立于硬件架构,故而也未对386处理器的能力充分加以利用。

因此,为了开发出一个高效而又功能齐备的UNIX内核,Torvalds开始“自力更生”。数月之后,Torvalds开发出一个内核“雏形”,可以编译并运行各种GNU程序。随之,于1991年10月5日,为求得其他程序员的帮助,Torvalds在Usenet新闻组comp.os.minix上就其内核0.02版发表了如下申明,如今已被广为引用。

还在念叨 minix1.1 的好日子——人人都能给自个儿写设备驱动,不用看别人的脸色?手头没有称心的项目?是不是特想有一个操作系统,能依着自个的想法来回折腾,还能长见识?瞧瞧 minix 上面跑的那些玩意吧,是不是挺没劲?不想再为调个酷毙了的程序,一宿一宿熬个没完?真这样,那我可找对人了。一个月前在帖子里就提过,我正在写一个操作系统,在AT-386上面跑,免费的,挺像minix。现在总算到了这份上,凑合能用(当然,这得看您想干吗)。现在,我愿意公布系统的源码,请大家多瞅瞅,多用用。系统版本只是0.02,不过bash、gcc、gnu-make、gnu-sed还有compress等等倒是都跑通了。
为了传承UNIX历史悠久的光荣传统,在为UNIX系统克隆命名时,总以字母“X”结尾,故而,人们最终将这一内核命名为Linux。最初,Linux的使用许可协议要严格得多,但Torvalds很快就将其归于GNU GPL阵营。

Torvalds做到了一呼百应。其他程序员与Torvalds一起加入到Linux的开发行列,添加了很多新特性,诸如:改进型的文件系统、对网络的支持、设备驱动程序以及对多处理器的支持等。到了1994年3月,开发者们发布了Linux 1.0版本。随之,Linux 1.2发布于1995年3月,Linux 2.0发布于1996年6月,Linux 2.2发布于1999年1月,Linux 2.4发布于2001年1月。对内核2.5版本的开发始于2001年11月,并最终于2003年12月发布了Linux内核2.6。

题外话:BSD
值得一提的是,20世纪90年代初,另一种可以免费获得的UNIX也能在x86-32硬件架构上运行。Bill和Lynne Jolitz将业已成熟的BSD系统移植到32位的x86 cpu上,命名为386/bsd。这项移植工作基于BSD Net/2(发布于1991年6月),即4.3BSD源码的版本之一,该版本中残存的所有AT&T专有源码要么被全部替换,要么予以删除——主要针对6个无法轻易更换的源码文件而言。Jolitzes夫妇将Net/2代码移植到了x86-32硬件架构,重写了缺失的源码,并于1992年2月发布了386/BSD的首个版本(0.0版本)。

在初战告捷后,对386/BSD的开发工作便出于各种原因而停滞不前。面对日渐积压的大量补丁程序,另外两组开发团队相机而动,基于386/BSD分别创建了自己的版本:NetBSD和FreeBSD。前者侧重于对大量硬件平台的可移植性;后者则主要关注性能,并成为如今应用最为广泛的BSD。1993年4月,NetBSD首版(版本号为0.8)发布。FreeBSD的首个CD-ROM版本(版本号为1.0)则发布于1993年12月。1996年,OpenBSD在从NetBSD项目分离出去之后,也发布了最初版本(版本号2.0)。相比较而言,OpenBSD偏重于安全性。2003年中段,在与FreeBSD 4.x分道扬镳之后,一款新型BSD——DragonFly BSD又浮出水面。DragonFly BSD采用的设计方法与FreeBSD 5.x有所不同,能够支持对称多处理器(SMP)架构。

若是不提及20世纪90年代初UNIX System Laboratories(USL,派生自AT&T的子公司,专门从事UNIX的开发和销售)和Berkeley之间的那场官司,那么对BSD的介绍恐怕就算不得完整。1992年初,Berkeley Software Design, Incorporated公司(BSDi,如今隶属于Wind River公司)开始发行受商业支持的BSD UNIX——BSD/OS——以Net/2发布版以及Jolitze夫妇所开发的386/BSD特性为基础。BSDi的发布版包含二进制和源代码,售价995美元,此外,BSDi还建议潜在客户使用其电话号码1-800-ITS-UNIX。

1992年4月,USL对BSDi发起诉讼,诉状称BSDi售出产品中含有USL专有源码及商业机密,要求其停止销售。此外,诉状还指称BSDi的电话号码容易误导消费者,要求BSDi停止使用。这场诉讼愈演愈烈,最终还加入了对加州大学的索赔请求。法院最终驳回了USL几乎所有的诉讼请求,仅对其中的两项请求予以支持。随后,加州大学又针对USL发起发诉,诉称:USL没有为System V中使用的BSD代码支付费用。

这场诉讼悬而未决之际,USL 已被Novell收购,Novell时任CEO——Ray Noorda公开声称:较之于法庭辩论,自己的公司更愿意参与市场竞争。双方最终于1994年1月达成庭外和解。在删除Net/2 release 源码18000个文件中的3个文件,对若干其他文件做出细微改动,并为其他大约70个文件添加USL版权注意事项后,加州大学仍可继续自由发布BSD。1994年6月,经过修改的系统以4.4BSD-Lite之名发布(1995年6月,加州大学发布了最后一版4.4BSD-Lite,版本号为Release 2)。此时,根据和解条款,BSDi、FreeBSD以及NetBSD纷纷以经过修改的4.4BSD-Lite源码替换了各自的Net/2基础源码。据[McKusick et al., 1996]一书记述,尽管这在一定程度上延误了BSD衍生系统的开发,但也有其积极意义。加州大学计算机研究组(Computer Systems Research Group)自Net/2发布后3年的开发成果,被重新同步到上述系统中。

Linux内核版本号
与大多自由软件项目一样,Linux也遵循及早、经常的发布模式,因而对内核的修订会频繁出现(有时甚至是每天都有)。随着Linux用户群的激增,对这一发布模式有所调整,意在降低对现有用户的干扰。具体来说,在Linux1.0版本之后,内核开发者针对每次发布所采用的内核版本编号方案为x.y.z。x表示主版本号,y为附属于主版本号的次版本号,z是从属于次版本号的修订版本号(细微的改进和BUG修复)。

采用这一发布模式,内核的两个版本会一直处于开发之中。一个是用于生产系统的稳定(stable)分支,其次版本号为偶数;另一个是经常变动的开发(development)分支,其次版本号为奇数(当前稳定版次版本号+1)。指导思想是(在实践中并未严格执行)应将所有新特性添加到内核当前的开发分支系列中,而对内核稳定分支系列的修订应严格限定为细微的改进及bug修复。当开发者认为当前的开发分支已宜于发布时,会将该开发分支转换成新的稳定分支,并为其分配一个偶数的次版本号。例如,内核开发分支2.3.z会“进化”为内核稳定分支2.4。

随着2.6内核的发布,内核开发模式再次发生改变。稳定内核版本之间发布间隔过长,因而导致诸多问题和不便,这是内核开发模型改变的主要原因(从Linux 2.4.0到2.6.0的发布历时近3年)。虽然还会就该模型的微调定期开展讨论,但基本细节已经确定如下。

不再有稳定内核和开发内核的概念。每个新的2.6.z发布版都可以包含新特性,其生命周期始于对新特性的追加,然后历经一系列候选发布版本让新特性稳定下来。当开发者认为某个候选版本足够稳定时,便可将其作为内核2.6.z发布。一般情况下,发布周期约为3个月。
有时,也可能需要为某个稳定的2.6.z发布版打上些小补丁程序,以修复bug或安全问题。如果这样的修复工作具有足够高的优先级,并且补丁程序的正确性也“毋庸置疑”,那么无需等待下一个2.6.z发布版,可以直接应用补丁创建一个版本号形如2.6.z.r的发布版本,其中,r作为该2.6.z内核版本的次修订版序号。
额外责任将转嫁给Linux发行厂商,由他们来确保随Linux发行版一同发行内核的稳定性。
本书后续各章有时会提及API发生特定变化(比如,新增了系统调用或者系统调用发生变化时)的相应内核版本。在2.6.z系列之前,虽然大多数内核变化都见诸于具有奇数版本号的开发分支,但本书通常所指的是那些变化初次出现的稳定内核版本,这是因为大多数应用开发者一般都会使用稳定版的内核,而非开发版本。很多情况下,手册页会注明某一具体特性出现或发生变化时开发版内核的确切版本号。

对2.6.z系列内核所发生的改变,本书会注明确切的内核版本号。当书中言及2.6版本内核的新特性,且版本号又不带“z”这一修订版本号时,意指该特性是在2.5开发版内核中实现,并首度出现于稳定内核版本2.6.0。

写作本书之际,Linux内核2.4的稳定版尚处于维护期,维护者们仍在将关键性的补丁和缺陷修正合并起来,定期发布新的修订版。这使得已安装系统能继续使用2.4内核,而不必非要升级到新的内核系列(有时候,升级起来并不轻松)。
向其他硬件架构的移植
Linux开发之初,主要目标是针对Intel 80386的高效系统实现,而非向其他处理器架构迁移的可移植性。然而,随着Linux的日益普及,针对其他处理器架构的移植版本开始出现,首先就是向Digital Alpha芯片的移植。Linux所支持的硬件架构队伍在持续壮大,其中包括:x86-64、Motorola/IBM PowerPC和PowerPC64、Sun SPARC和SPARC64(UltraSPARC)、MIPS、ARM(Acorn)、IBM zSeries(formerly System/390)、Intel IA-64(Itanium,请参阅[Mosberger & Eranian, 2002])、Hitachi SuperH、HP PA-RISC,以及Motorola 68000。

Linux发行版
准确说来,术语Linux只是指由Linus Torvalds和其他人所开发出的内核。可是,也常使用该术语来指代内核外加一大堆其他软件(工具和库)所构成的完整操作系统。Linux草创之际,需要用户自行组装上述所有软件,创建文件系统,在文件系统上正确地安置并配置所有软件。用户不但要具备专业知识,还需为此耗费大量时间。如此一来,这便为Linux发行商们开启了市场,他们创建软件包(发行版),来自动完成大部分安装过程,其中包括了建立文件系统以及安装内核和其他所需软件等。

Linux的发行版最早出现于1992年,包括MCC Interim Linux(英国,曼彻斯特计算机中心)、TAMU(德克萨斯A&M大学)以及SLS(SoftLanding Linux System)。至今健在的商业发行版Slackware诞生于1993年。几乎与此同时,也诞生了非商业的Debian发行版,SUSE和Red Hat紧随其后。时下最流行的Ubuntu发行版问世于2004年。如今,对于那些在自由软件项目中表现活跃的程序员,许多Linux发行公司也会加以雇佣。

网友评论

登录后评论
0/500
评论
异步社区
+ 关注