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

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

本节书摘来自异步社区《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发行公司也会加以雇佣。

相关文章
|
7天前
|
项目管理 敏捷开发 开发框架
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
23 1
|
7天前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
15天前
|
Ubuntu 安全 Unix
在Linux中,有哪几种linux/unix发行版本?
在Linux中,有哪几种linux/unix发行版本?
|
20天前
|
Linux 程序员 开发者
源社区的兴起:从“代码隐士”到Linux引领的“全球编程嘉年华”
在编程的古老森林中,曾有“代码隐士”默默耕耘,惧怕智慧外泄。直到“开源”春风拂过,源社区如全球编程嘉年华盛开!开源文化颠覆了“独门秘籍”的传统,像“武林秘籍共享”般在网络上公开,鼓励知识传播与智慧碰撞。程序员组队开发,分享代码,提升科技实力。Linux则从“首席大厨”变身为“总导演”,以强大内核调制出诱人应用,引领潮流并推动技术创新。加入这场没有血腥厮杀,只有知识盛宴的“编程版《饥饿游戏》”吧!与全球开发者共享编程的乐趣与成就感!别忘了带上你的“独门秘籍”,可能下一个改变世界的创意就在其中!
48 7
|
17天前
|
Ubuntu Unix Linux
在Linux中,Unix和Linux之间的关系是什么?
在Linux中,Unix和Linux之间的关系是什么?
|
1月前
|
监控 Shell Linux
探索Linux操作系统下的Shell编程之魅力
【8月更文挑战第4天】本文旨在通过一系列精心设计的示例和分析,揭示在Linux环境下进行Shell编程的独特之处及其强大功能。我们将从基础语法入手,逐步深入到脚本的编写与执行,最终通过实际代码案例展现Shell编程在日常系统管理和自动化任务中的应用价值。文章不仅适合初学者构建扎实的基础,同时也为有一定经验的开发者提供进阶技巧。
37 11
|
1月前
|
Ubuntu Linux 开发工具
深入探索Linux内核模块编程
【8月更文挑战第4天】在这篇文章中,我们不仅将探讨Linux内核模块的基础知识,还将通过一个实际的例子来展示如何编写一个简单的内核模块。我们将从理论出发,逐步过渡到动手实践,最终实现一个可以在Linux系统上运行的模块。文章的目标是为读者提供足够的信息和知识,以便他们能够自己编写内核模块,从而对操作系统的内部工作原理有更深入的了解。
|
7天前
|
网络协议 Linux Shell
探索Linux操作系统:从基础到高级编程
【8月更文挑战第31天】本文旨在为读者提供一条清晰的路径,从Linux操作系统的基础知识出发,逐步深入到高级编程技巧。我们将一起揭开Linux神秘的面纱,了解其内部工作原理,并通过实际代码示例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你带来新的视角和技能提升。
|
7天前
|
Linux
探索Linux操作系统:命令行与脚本编程基础
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段旅程,深入探索Linux操作系统的奥秘。通过学习命令行的使用和编写简单的脚本,你将能够更高效地与你的计算机进行交流。无论你是新手还是有经验的用户,本文都将为你打开一扇通往Linux世界的大门。准备好了吗?让我们开始吧!
|
2月前
|
Linux C语言 Windows
C语言文件编程-Linux环境下运行
本文介绍了在Linux环境下使用C语言进行文件编程时的两种主要接口:C标准库函数与Linux系统调用。C标准库提供了`fopen`, `fread`, `fwrite`, 和 `fclose`等函数,适用于普通文件操作;而Linux系统调用如`open`, `read`, `write`, 和 `close`则更适合处理设备文件,同时也可用于普通文件。这两种方法的主要区别在于前者使用文件指针,后者使用文件描述符。文章还给出了两个示例程序:一个使用C标准库函数实现文件复制,另一个则使用Linux系统调用完成相同任务。
30 2
下一篇
DDNS