1.5 历程:Torvalds的Linux发展
# 5. 历程:Torvalds的Linux发展
在前面的两个章节主要分别介绍了两个背景:
- Unix从诞生到商业化的历程;
- 自由(开源)软件运动的兴起;
可能内容介绍的太过于琐碎,简单提要:
- 史托曼开始的GNU计划目的是:创建一个自由、开放的Unix操作系统 (Free Unix),在此过程中开发了众多GNU 基础软件:
- Emacs
- GNU C (GCC)
- GNU C Library (glibc)
- Bash shell
- 但是以上软件依旧是运行在当时已经日渐封闭的商业化Unix核心上,而GNU的最初构想 “创建一个自由的Unix操作系统“—— hurd,虽然是一个架构相当先进的核心,但是由于开发者在开发的过程中对于系统的要求太过于严谨,因此推出的时程一再延后
- 1991年,芬兰的赫尔辛基大学的Linus Torvalds在BBS上面宣称他以 bash, gcc等 GNU 的工具写了一个小小的核心程序,该核心程序更多是一个可以在Intel的386机器上面运行的玩具
下面具体介绍Linux的历史:
# 5.1 与Minix之间
Linus Torvalds(托瓦兹, 1969年出生, [10])的外祖父是赫尔辛基大学的统计学家, 他的外祖父为了让自己的小孙子能够学点东西,所以从小就将托瓦兹带到身边来管理一些微计算机。 在这个时期,托瓦兹接触了组合语言(Assembly Language),那是一种直接与芯片对谈的 程序语言,也就是所谓的低阶语言。 必须要很了解硬件的架构,否则很难以组合语言撰写程序的。
在1988年间,托瓦兹顺利的进入了赫尔辛基大学,并选读了计算机科学系。在就学期间,因 为学业的需要与自己的兴趣, 托瓦兹接触到了Unix这个操作系统。当时整个赫尔辛基只有一 部最新的Unix系统,同时仅提供16个终端机(terminal)。 还记得我们上一节刚刚提过的, 早期的计算机仅有主机具有运算功能,terminal 仅负责提供Input/Output而已。在这种情况 下, 实在很难满足托瓦兹的需求,因为.....光是等待使用Unix的时间,就很耗时~为此,他不禁想到: “我何不自己搞一部Unix来玩?”不过,就如同Stallman当初的GNU计划一样,要写核心程序,谈何容易~
不过,幸运之神并未背离托瓦兹,因为不久之后,他就知道有一个类似Unix的系统, 并且与 Unix完全相容,还可以在Intel 386机器上面跑的操作系统, 那就是我们上一节提过的,Tanenbaum 教授为了教育需要而撰写的Minix系统! 他在购买了最新的Intel 386的个人计算机后,就立即安装了Minix这个操作系统。 另外,上个小节当中也谈到,Minix这个操作系统是有附上源代码的, 所以托瓦兹也经由这个源代码学习到了很多的核心程序设计的设计概念喔!
# 对386硬件的多任务测试
事实上,托瓦兹对于个人计算机的CPU其实并不满意,因为他之前碰的计算机都是工作站型 的计算机, 这类计算机的CPU特色就是可以进行“多任务处理”的能力。什么是多任务呢?理论上, 一个CPU在一个时间内仅能进行一个程序, 那如果有两个以上的程序同时出现到系统 中呢?举例来说, 你可以在现今的计算机中同时打开两个以上的办公软件,例如电子试算表 与文书处理软件。 这个同时打开的动作代表着这两个程序同时要交给CPU来处理~
当时CPU大多是单核——CPU一个时间点内仅能处理一个程序,那怎么办?没关系,这个时候如果具有多任务能 力的CPU就会在不同的程序间切换~ 还记得前一章谈到的CPU频率吧?假设CPU频率为 1GHz的话,那表示CPU一秒钟可以进行
多任务
为什么有的时候我同时开两个文件(假设为A, B文件)所花的时间, 要比开完A再去开B 文件的时间还要多?现在是否稍微可以理解? 因为如果同时打开的话,CPU就必须要在两个 工作之间不停的切换~ 而切换的动作还是会耗去一些CPU时间的!所以啰,同时启用两个以 上的工作在一个CPU上, 要比一个一个的执行还要耗时一点。这也是为何现在CPU开发商要 整合多个CPU于一个芯片中! 也是为何在运行情况比较复杂的服务器上,需要比较多的CPU 负责的原因!
要达到多工(multitasking)的环境,除了硬件(主要是CPU)需要能够具有多任务的特性外,操作系统也需要支持这个功能喔! 一些不具有多任务特性的操作系统,想要同时执行两个程序是不可能的。除非先被执行的程序执行完毕,否则, 后面的程序不可能被主动执行。
多任务的操作系统中,每个程序被执行时,都会有一个最大CPU使用时间,若该工作运 行的时间超过这个CPU使用时间时, 该工作就会先被丢出CPU的运行中,而再度的进入核心 工作调度中等待下一次被CPU取用来运行。
早期Intel x86架构计算机不是很受重视的原因,就是因为x86的芯片对于多任务的处理不佳, CPU在不同的工作之间切换不是很顺畅。但是这个情况在386计算机推出后,有很大的改善。 托瓦兹在得知新的386芯片的相关信息后,他认为,以性能价格比的观点来看, Intel的386相当的便宜,所以在性能上也就稍微可以将就将就。最终他就贷款去买了一部Intel的386来玩。
早期的计算机性能没有现在这么好,所以压榨计算机性能就成了工程师的一项癖好! 托瓦兹 本人早期是玩组合语言的,组合语言对于硬件有很密切的关系,托瓦兹自己也说:“我始终是 个性能癖”。 为了彻底发挥386的性能,于是托瓦兹花了不少时间在测试386机器上! 他的 重要测试就是在测试386的多功性能。首先,他写了三个小程序,一个程序会持续输出A、一 个会持续输出B, 最后一个会将两个程序进行切换。他将三个程序同时执行,结果,他看到 屏幕上很顺利的一直出现ABABAB...... 他知道,他成功了!
# 初次释出Linux 0.02
探索完386的硬件性能之后,终于拿到Minix并且安装在托瓦兹的386计算机上之后,托瓦兹跟 BBS上面一堆工程师一样, 他发现Minix虽然真的很棒,但是谭宁邦教授就是不愿意进行功能的加强,导致一堆工程师在操作系统功能上面的欲求不满! 这个时候年轻的托瓦兹就想:“既然如此,那我何不自己来改写一个我想要的操作系统?” 于是他就开始了核心程序的撰写了。
撰写程序需要什么呢?首先需要的是能够进行工作的环境,再来则是可以将源代码编译成为 可可执行文件的编译器。 好在有GNU计划提供的bash工作环境软件以及gcc编译器等自由软 件, 让托瓦兹得以顺利的撰写核心程序。他参考Minix的设计理念与书上的程序码,然后仔细 研究出386个人计算机的性能最优化, 然后使用GNU的自由软件将核心程序码与386紧紧的结 合在一起,最终写出他所需要的核心程序。 而这个小玩意竟然真的可以在386上面顺利的跑 起来~还可以读取Minix的文件系统。 真是太好了!不过还不够,他希望这个程序可以获得大 家的一些修改建议, 于是他便将这个核心放置在网络上提供大家下载,同时在BBS上面贴了 一则消息:
Hello everybody out there using minixI'm doing a (free) operation system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones.
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 want. Any suggestions are welcome, but I won't promise I'll implement them :-)
他说,他完成了一个小小的操作系统,这个核心是用在386机器上的, 同时,他真的仅是好玩,并不是想要做一个跟GNU一样大的计划! 另外,他希望能够得到更多人的建议与回馈来 发展这个操作系统!这个概念跟Minix刚好背道而驰呢! 这则新闻引起很多人的注意,他们也去托瓦兹提供的网站上下载了这个核心来安装。 有趣的是,因为托瓦兹放置核心的那个FTP 网站的目录为:Linux, 从此,大家便称这个核心为Linux了。(请注意,此时的Linux就是那 个kernel喔! 另外,托瓦兹所丢到该目录下的第一个核心版本为0.02呢!)
同时,为了让自己的Linux能够相容于Unix系统,于是托瓦兹开始将一些能够在Unix上面运行的软件拿来在Linux上面跑。 不过,他发现到有很多的软件无法在Linux这个核心上运行。这 个时候他有两种作法, 一种是修改软件,让该软件可以在Linux上跑, 另一种则是修改 Linux,让Linux符合软件能够运行的规范! 由于Linus希望Linux能够相容于Unix,于是托瓦兹选择 了第二个作法“修改Linux”! 为了让所有的软件都可以在Linux上执行,于是托瓦兹开始参考标准的POSIX规范。
POSIX
POSIX是可携式操作系统接口(Portable Operating System Interface)的缩写,重点在规范核心与应用程序之间的接口, 这是由美国电器与电子工程师学会(IEEE)所发布的一项标准!
这个正确的决定让Linux在起步的时候体质就比别人优良~因为POSIX标准主要是针对Unix与 一些软件运行时候的标准规范, 只要依据这些标准规范来设计的核心与软件,理论上,就可以搭配在一起执行了。 而Linux的发展就是依据这个POSIX的标准规范,Unix上面的软件也是遵循这个规范来设计的, 如此一来,让Linux很容易就与Unix相容共享互有的软件了!同时, 因为Linux直接放置在网络下,提供大家下载, 所以在流通的速度上相当的快!导致Linux的 使用率大增!这些都是造成Linux大受欢迎的几个重要因素呢!
其实托瓦兹有意无意之间常常会透露他自己是个只喜欢玩 (Just for Fun) 的怪人! Linux 一开始也只是托瓦兹的一个作业发展出来的玩具而已。 他也说,如果 Minix 或 hurd 这 两个中的任何一个系统可以提早开发出他想要的功能与环境,也许他根本不会想要自己开发 一个 Linux !
1)要先有基础知识与技能
2)有了 第一点后,要勇于挑战权威
3)把你们的玩具发扬光大吧! ^_^
# 5.2 Linux 的发展——虚拟团队
#
Linux能够成功除了托瓦兹个人的理念与力量之外,其实还有个最重要的团队!
# 单一个人维护阶段
Linux虽然是托瓦兹发明的,而且内容还绝不会涉及专利软件的版权问题。不过,如果单靠托 瓦兹自己一个人的话,那么Linux要茁壮实在很困难~ 因为一个人的力量是很有限的。好在托瓦兹选择Linux的开发方式相当的务实!首先,他将释出的Linux核心放置在FTP上面,并请告 知大家新的版本信息, 等到使用者下载了这个核心并且安装之后,如果发生问题,或者是由 于特殊需求亟需某些硬件的驱动程序,那么这些使用者就会主动回报给托瓦兹。 在托瓦兹能够解决的问题范围内,他都能很快速的进行Linux核心的更新与除错。
# 广大Hacker 加入阶段
不过,托瓦兹总是有些硬件无法取得的啊,那么他当然无法帮助进行驱动程序的撰写与相关 软件的改良。 这个时候,就会有些志工跳出来说:“这个硬件我有,我来帮忙写相关的驱动程 序。” 因为Linux的核心是Open Source的,骇客志工们很容易就能够跟随Linux的原本设计架 构, 并且写出相容的驱动程序或者软件。志工们写完的驱动程序与软件托瓦兹是如何看待的 呢? 首先,他将该驱动程序/软件带入核心中,并且加以测试。 只要测试可以运行,并且没有 什么主要的大问题,那么他就会很乐意的将志工们写的程序码加入核心中!
总之,托瓦兹是个很务实的人,对于Linux核心所欠缺的项目,他总是“先求有且能跑, 再求进一步改良”的心态!这让Linux使用者与志工得到相当大的鼓励! 因为Linux的进步太快了! 使用者要求虚拟内存,结果不到一个星期推出的新版Linux就有了! 这不得不让人佩服啊!
另外,为因应这种随时都有程序码加入的状况,于是Linux便逐渐发展成具有模块的功能! 亦即是将某些功能独立出于核心外,在需要的时候才载入到核心中。如此一来, 如果有新的硬件驱动程序或者其他协定的程序码进来时,就可以模块化, 大大的增加了Linux核心的可维护能力!
核心是一组程序,如果这组程序每次加入新的功能都得要重新编译与改版的话无疑效率会很低? 想像一下,如果你只是换了显卡就得要重新安装新的Windows操作系统,会不会很难受? 模块化之后,原本的核心程序不需要更动,你可以直接将他想成是“驱动程序”即可! ^_^
# 核心功能细部分工发展阶段
后来,因为Linux核心加入了太多的功能,光靠托瓦兹一个人进行核心的实际测试并加入核心 原始程序实在太费力~ 结果,就有很多的朋友跳出来帮忙这个前置作业!例如考克斯(Alan Cox)、与崔迪(Stephen Tweedie)等等, 这些重要的副手会先将来自志工们的修补程序或 者新功能的程序码进行测试, 并且结果上传给托瓦兹看,让托瓦兹作最后核心加入的源代码 的选择与整并! 这个分层负责的结果,让Linux的发展更加的容易!
特别值得注意的是,这些托瓦兹的Linux发展副手,以及自愿传送修补程序的骇客志工, 其实 都没有见过面,而且彼此在地球的各个角落,大家群策群力的共同发展出现今的Linux, 我们 称这群人为虚拟团队!而为了虚拟团队数据的传输,于是Linux便成立的核心网站: http://www.kernel.org!
而这群素未谋面的虚拟团队们,在1994年终于完成的Linux的核心正式版!version 1.0。 这一 版同时还加入了X Window System的支持呢!且于1996年完成了2.0版、2011 年释出 3.0 版,更于 2015 年 4 月释出了 4.0 版哩! 发展相当迅速喔!此外,托瓦兹指明了企鹅为Linux 的吉祥物。
托瓦兹是因为小时候去动物园被企鹅咬了一口念念不忘, 而正式的2.0推出 时,大家要他想一个吉祥物。他在想也想不到什么动物的情况下, 就将这个念念不忘的企鹅 当成了Linux的吉祥物了......
Linux由于托瓦兹是针对386写的,跟386硬件的相关性很强,所以, 早期的Linux确实是不具 有移植性的。不过,大家知道Open source的好处就是, 可以修改程序码去适合作业的环 境。因此,在1994年以后,Linux便被开发到很多的硬件上面去了! 目前除了x86之外, IBM、HP等等公司出的硬件也都有被Linux所支持呢!甚至于小型单板计算机 (树莓派/香蕉 派等) 与手持设备 (智能手机、平板电脑) 的 ARM 架构系统,大多也是使用 Linux 核心喔!
# 5.3 Linux 核心版本
Linux的核心版本编号有点类似如下的样子:
3.10.0-123.el7.x86_64 主版本.次版本.释出版本-修改版本
虽然编号就是如上的方式来编的,不过依据 Linux 核心的发展期程,核心版本的定义有点不 太相同喔!
奇数、偶数版本分类
在 2.6.x 版本以前,托瓦兹将核心的发展趋势分为两股,并根据这两股核心的发展分别给予不 同的核心编号,那就是:
主、次版本为奇数:发展中版本(development) 如2.5.xx,这种核心版本主要用在测试 与发展新功能,所以通常这种版本仅有核心开发工程师会使用。 如果有新增的核心程序码,会加到这种版本当中,等到众多工程师测试没问题后,才加入下一版的稳定核心
主、次版本为偶数:稳定版本(stable) 如2.6.xx,等到核心功能发展成熟后会加到这类的版本中,主要用在一般家用计算机以及企业版本中。 重点在于提供使用者一个相对稳定的Linux作业环境平台。
至于释出版本则是在主、次版本架构不变的情况下,新增的功能累积到一定的程度后所新释出的核心版本。 而由于Linux核心是使用GPL的授权,因此大家都能够进行核心程序码的修改。因此,如果你有针对某个版本的核心修改过部分的程序码, 那么那个被修改过的新的核心版本就可以加上所谓的修改版本了。
主线版本、长期维护版本(longterm version) 不过,这种奇数、偶数的编号格式在 3.0 推出之后就失效了。从 3.0 版开始,核心主要依据主线版本 (MainLine) 来开发,开发完毕后会往下一个主线版本进行。 例如 3.10 就是在 3.9 的架构下继续开发出来的新的主线版本。通常新一版的主线版本大约在 2~3 个月会被提出 喔! 之所以会有新的主线版本,是因为有加入新功能之故。现在 (2020/10) 最新的主线版 本已经来到 5.8 版了喔!好快!
而旧的版本在新的主线版本出现之后,会有两种机制来处理,一种机制为结束开发 (End of Live, EOL),亦即该程序码已经结束,不会有继续维护的状态。 另外一种机制为保持该版本 的持续维护,亦即为长期维护版本 (Longterm)!例如 3.10 即为一个长期维护版本,这个 版本的程序码会被持续维护,若程序码有 bug 或其他问题, 核心维护者会持续进行程序码的 更新维护喔!
所以啰,如果你想要使用 Linux 核心来开发你的系统,那么当然要选择长期支持的版本才 行!要判断你的 Linux 核心是否为长期支持的版本, 可以使用“ uname -r ”来查阅核心版本, 然后对照下列链接来了解其对应值喔!
# 5.4 Linux 发行版
经过上面的说明,我们知道了Linux其实就是一个操作系统最底层的核心及其提供的核 心工具。 他是GNU GPL授权模式,所以,任何人均可取得源代码与可执行这个核心程序,并且可以修改。 此外,因为Linux参考POSIX设计规范,于是相容于Unix操作系统,故亦可称之 为Unix Like的一种。
# 可完整安装的Linux发布套件
Linux的出现让GNU计划放下了心里的一块大石头,因为GNU一直以来就是缺乏了核心程序, 导致他们的GNU自由软件只能在其他的Unix上面跑。既然目前有Linux出现了,且 Linux也用 了很多的GNU相关软件,所以Stallman认为Linux的全名应该称之为GNU/Linux呢! 不管怎么 说,Linux实在很不错,让GNU软件大多以Linux为主要操作系统来进行开发, 此外,很多其他的自由软件团队,例如postfix, vsftpd, apache等等也都有以Linux 为开发测试平台的计划出现!如此一来,Linux除了主要的核心程序外,可以在Linux 上面运行的软件也越来越多,如果有心,就能够将一个完整的Linux操作系统搞定了!
虽然由Torvalds负责开发的Linux仅具有Kernel与Kernel提供的工具, 不过,如上所述,很多的软件已经可以在Linux上面运行了,因此, **“Linux +各种软件”**就可以完成一个相当完整的操作系统了。 不过,要完成这样的操作系统......还真难~ 因为Linux早期都是由骇客工程师所开发维护的,他们并没有考虑到一般使用者的能力......
为了让使用者能够接触到Linux,于是很多的商业公司或非营利团体, 就将Linux Kernel(含 tools)与可运行的软件整合起来,加上自己具有创意的工具程序, 这个工具程序可以让使用者以光盘/DVD或者通过网络直接安装/管理Linux系统。 这个“Kernel + Softwares + Tools + 系统安装程序”被称之为Linux distribution, 一般中文翻译成可完整安装套件,或者Linux发布商套件等。
由于Linux核心是由骇客工程师写的,要由源代码安装到x86计算机上面成为可以执行的 binary文件, 这个过程可不是人人都会的~所以早期确实只有工程师对Linux有兴趣。 一直到 一些社群与商业公司将Linux核心配合自由软件,并提供完整的安装程序, 且制成光盘/DVD 后,对于一般使用者来说,Linux才越来越具有吸引力! 因为只要一直“下一步”就可以将Linux 安装完成啊! ^_^
由于GNU的GPL授权并非不能从事商业行为,于是很多商业公司便成立来贩售Linux distribution。 而由于Linux的GPL版权宣告,因此,商业公司所贩售的Linux distributions通常 也都可以从Internet上面来下载的! 此外,如果你想要其他商业公司的服务,那么直接向该公司购买光盘来安装,也是一个很不错的方式的!
# Linux Distributions的主要异同
不过,由于发展Linux distributions的社群与公司实在太多了,例如有名的Red Hat, SuSE, Ubuntu, Fedora, Debian等等,所以很多人都很担心,如此一来每个distribution是否都不相同呢? 这就不需要担心了,因为每个Linux distributions使用的kernel都 是http://www.kernel.org所释出的,而他们所选择的软件,几乎都是目前很知名的软件,重复性相当的高, 例如网页服务器的Apache,电子邮件服务器的Postfix/sendmail,文件服务器 的Samba等等。
此外,为了让所有的Linux distributions开发不致于差异太大,且让这些开发商在开发的时候 有所依据,还有Linux Standard Base (LSB) (opens new window)等标准来规范开发者,以及目录架构的File system Hierarchy Standard (FHS) (opens new window) 标准规范! 唯一差别的,可能就是该开发者自家所开发 出来的管理工具,以及套件管理的模式吧! 所以说,基本上,每个Linux distributions除了架构的严谨度与选择的套件内容外, 其实差异并不太大啦!。大家可以选择自己喜好的 distribution来安装即可!
事实上Linux Distributions主要分为两大系统,一种是使用RPM方式安装软件的系统,包括 Red Hat, Fedora, SuSE等都是这类; 一种则是使用Debian的dpkg方式安装软件的系统,包 括Debian, Ubuntu, B2D等等。若是加上商业公司或社群单位的分类,可以简单的用下表来说明:
RPM 软件管理 | DPKG 软件管理 | 其他未 分类 | |
---|---|---|---|
商业公 司 | RHEL (Red Hat 公司) SuSE (Micro Focus) | Ubuntu (Canonical Ltd.) | |
社群单 位 | Fedora、CentOS、OpenSuSE | Debian、B2D | Gentoo |
商业版or社群版
到底是要买商业版还是社群版的Linux distribution呢?如果是要装在个人计算机上面做为 桌面电脑用的,建议使用社群版, 包括Fedora, Ubuntu, OpenSuSE等等。如果是用在服务器 上面的,建议使用商业版本,包括Red Hat, SuSE等。 这是因为社群版通常开发者会加入最 新的软件,这些软件可能会有一些bug存在。至于商业版则是经过一段时间的磨合后, 才将稳定的软件放进去。
# Linux发行版在中国
中国在Linux当然也不会缺席,当前,比较有名的Linux发行版主要是深度科技的Deepin (opens new window) 及其商业化版本UOS (opens new window),都是针对国人使用习惯和国内软件生态深度定制的操作系统。
# Linux 发行版选用
由于套件管理的方式主要分为Debian的dpkg及Red Hat系统的RPM方式。
- 先学习的话使用Ubuntu18.04 LTS长期支持版本,发生问题在国内就能解决的途径比较多,而且Ubuntu的界面交互比较友好;
- 如果已经深入学习了Linux之后,还想要体验最新的Linux技术特性的话,可以考虑使用Fedora操作系统,因为Linux主要的特性更新都是由红帽公司(现已被IBM 收购)支持的
- 如果想要压榨每一寸硬件的性能的话,则可以考虑Gentoo操作系统
总之,版本很多,但是各版本差异其实不大,建议你一定要先选定一个版本后, 先彻头彻尾了解,那再继续玩其他的版本时,就可以很快的进入状况。
不过如果依据计算机主机的用途来分的话,建议:
用于企业环境:建议使用商业版本,例如Red Hat的RHEL或者是SuSE都是很不错的选 择! 毕竟企业的环境强调的是永续的经营,你可不希望网管人员走了之后整个机房的主机都没有人管理吧! 由于商业版本都会提供客户服务,所以可以降低企业的风险喔;
用于个人或教学的服务器环境:要是你的服务器所在环境如果死机还不会造成太大的问 题的话, 加上你的环境是在教学的场合当中时(就是说,唔!经费不足的环境啦!)那么可以使用“号称”完全相容商业版RHEL的CentOS。 因为CentOS是用RHEL的源代码来再发布的一个Linux distribution,所以号称相容于RHEL,适合于服务器系统的环境;
用于个人的桌面电脑:想要尝鲜吗?建议使用很炫的Fedora/Ubuntu等Desktop(桌面环 境)使用的版本!