Linux有很多的术语,如Linux系统、Linux发行版、Linux内核、UNIX和GNU等,它们各自表示什么意思?它们之间的关系又是怎样的?初学者往往分不清楚。本节将详细介绍Linux相关的术语,为进一步学习Linux打下坚实的理论基础。
从专业的角度,操作系统是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充,在这个定义中,操作系统仅指实现了硬件抽象、管理和扩展的核心,是 不包含周围应用 的。
但是,从普通用户的角度,操作系统是指机器出厂时,在硬件上所安装的软件系统。例如笔记本计算机上预装的Windows系统,手机上预装的Android或iOS系统等。这些操作系统不仅包含硬件抽象、管理和扩展的核心,还 包含周围应用 。
因此,操作系统的含义需要结合上下文去分析。本书遵循普通用户的使用习惯,如果不做特殊说明,操作系统均是指机器出厂时,在硬件上所安装的软件系统,是包含周围应用的。对于专业角度所定义的操作系统,本书使用 操作系统内核 来代称,以作区分。
Linux有多种含义,从专业的角度,Linux指操作系统内核,又称Linux内核。而口头上所说的Linux,则指基于Linux内核的操作系统,是包含周围应用的。
Linux的含义需要结合语境分析,例如“Linux是一个开源软件”,这里的Linux指的是Linux内核;而“学好Linux”,这里的Linux则指基于Linux内核的操作系统。
为明确区分,本书后续内容中的Linux统一指基于Linux内核的操作系统,包括内核和周围应用。同时,Linux和Linux系统以及Linux操作系统,这3个名词的含义等同。
对于Linux系统的核心,即专业角度上的操作系统,使用Linux内核(简称内核)一词来指代。Linux内核的标识是一只可爱的小企鹅 。目前的Linux内核已经非常庞大和复杂,代码超过2600万行。
Linux发行版由Linux内核和若干周围应用组合而成。周围应用有很多,如桌面环境(如GNOME、KDE和Xfce等)、办公套件(如OpenOffice和WPS等)、开发工具(如Eclipse和IDEA等),不同的组合决定了这个Linux系统的用途和特点,从而衍生出不同的发行版。
常见的发行版有Ubuntu、RedHat和CentOS等。Ubuntu的特点是对用户友好,其口号就是“Linux For Human Being”;RedHat的特点是稳定可靠、硬件兼容性好,主要应用在服务器领域,使用RedHat需要付费购买其服务;CentOS是在RedHat源码基础上改进后,重新编译生成的版本,它既继承了RedHat的特点,同时又可以免费使用,因此,不管是个人还是生产环境,CentOS的占有率都很高。
艾叔基于CentOS定制了一个Linux系统,它包含完整的桌面、办公和开发软件,每个应用都是根据需要来定制的,整个系统非常精简,还不到3GB。如果把定制的Linux系统做成安装盘,发布出来就是一个发行版。
所谓开源,就是公开“源码”,这样开发者可以完全掌握程序的实现细节,获得技术上最大的自由。Linux内核就是开源的,它的源码可以通过https://www.kernel.org/这个网址下载。
如果一个项目的创意足够好,技术门槛足够高,又有很大的实用性,而且还开放源码。那么这个项目对那些狂热追求技术的开发者来说,是有致命的吸引力的。
Linux内核就是这样的一个项目,当Linus将Linux 0.01发布到网络上后,尽管他还只是个学生,Linux也非常不完善,但这些都不影响圈内操作系统狂热者们对此项目的兴趣,他们给出了很多的反馈和建议,进一步推动Linux内核不断完善。
与此同时,随着内核功能的不断强大和完善,越来越多的开发者加入进来,慢慢就形成了星火燎原之势。当然,整个项目Linus投入最多,而且他有绝对的技术实力和敏锐性,这些都是确保Linux内核这个开源项目能够成功的必要条件。
开放源码并不意味着无限制的使用,使用者在享受权利的同时也要担负责任。因此,每个开源软件通常都会附加一个开源许可证,来明确开发者的权利。Linux内核同样如此,它的开源许可证是GPL(GNU General Public License)(现在是GPLv2)。
以Linux内核为例,GPL的主要思想是:任何人都可以获得Linux内核的源码并做修改,同时其衍生产品也需要遵循GPL协议。也就是说,如果基于内核做了工作,那么根据GPL协议,这部分工作也要遵循GPL协议,对外共享源码。因此,GPL很好地保证了Linux内核的开源特性,开发者在内核上的开发成果必须要分享出来,就如同滚雪球一般,推动内核开发迅速发展。
GPL和软件商业化之间并不是对立的。采用GPL协议的软件可以商用,可以出售,但必须开放源码。
Linux内核采用GPL协议,根据GPL的传播性,基于Linux内核之上开发的应用是否都需要遵循GPL协议呢?又或者说,是不是整个Linux系统中的软件都需要遵循GPL协议?
Linux内核以系统调用的方式对外提供接口,Linus曾多次声明,外部程序使用普通系统调用不需要遵循GPL协议,甚至将该声明写在Linux内核源码的COPING文件中。
因此,如果一个程序是直接通过系统调用同Linux内核交互的话,那么该程序是不需要遵守GPL协议的。当然,绝大部分情况下,普通的应用程序并不直接同Linux内核交互,它们中间还有一个C语言库:glibc(GNU C Library),glibc向上为应用程序提供调用接口,向下通过系统调用来实现这些接口,因此glibc也不需要遵循GPL,它遵循的是LGPL(Lesser GPL),这是一种比GPL相对宽松一些的协议,如果应用只是使用glibc,而不修改glibc源码,应用是不需要遵守LGPL的。这样,基于glibc开发的应用就不需要开源了。
初学者对Linux和UNIX的关系往往感到迷惑,本小节将进行说明。在说明之前,先明确一点,这里比较的对象是Linux的内核和UNIX的内核,即操作系统核心的对比,外围的应用两者可以通用,没有对比的意义。
UNIX产生于20世纪70年代初美国AT&T的贝尔实验室,Ken Thompson用汇编语言实现了UNIX内核的第一版,后来Dennis Ritchie加入,共同开发UNIX。由于UNIX内核是用汇编语言编写的,和硬件平台高度耦合,要移植到其他的平台上,就要用对应平台的汇编语言重写内核,工作量很大且非常麻烦。为此,Dennis Ritchie开发了C语言。C语言的可移植性很好,使用C语言编写的程序,如果要移植到其他的平台,几乎不需要修改代码,只需使用对应平台的编译器重新编译,就可以在该平台上运行。C语言发明后,Ken Thompson和Dennis Ritchie用C语言重写了UNIX内核。此后,UNIX被顺利地移植到多种平台架构下,从此在超级计算机和服务器中占据着统治地位。
UNIX最初是一个自发项目,源码是开放的。到了20世纪80年代,在其大获成功后,AT&T意识到UNIX存在巨大的商业价值,从而将后续的UNIX版本私有化,不再开放源码。
20世纪90年代初,Linus借钱买了第一台386计算机,并安装了一个类UNIX系统——MINIX,MINIX是荷兰Andrew S. Tanenbaum教授开发的一个用于教学的类UNIX系统。
在UNIX闭源后,Andrew S. Tanenbaum决定重新开发一个与UNIX兼容的全新的操作系统,并开放源码供大家学习和使用,这就是MINIX的由来。
正如MINIX自身的名字一样,它是一个迷你型的类UNIX系统,主要用做教学辅助,和安装在超级计算机上的UNIX功能相差很多。因此,Linus在使用时,发现了诸多的问题。而当他尝试在MINIX上做修改来解决这些问题时,却发现MINIX在版权保护上有诸多限制,例如必须得先买一个正版的MINIX。Linus本身是一个极客,在技术上有着自己的一套见解和认识,尤其是之前还接触了真正的UNIX系统,从一个设计者的角度再来审视MINIX时,发现MINIX在很多设计理念上也与自己存在很大的分歧。与其痛苦地改进,还不如自己从头开发一个系统,正是这种初生牛犊不怕虎的精神,促使Linus重新编写在386计算机上运行的操作系统,也就是Linux。
Linus最主要的工作是:编写Linux内核,移植周围应用,使得它们能够基于Linux内核运行。Linux的第一个版本Linux 0.01非常简陋,除了内核外,周围应用只有一个bash程序和GCC编译器,但这毕竟是为数不多的可以在386系列CPU上运行的开源操作系统。其中,Linux内核是完全从零开始编写的,并没有使用MINIX或其他UNIX版本的代码,而周围应用则是移植过来的,使用的是别人编写好的代码。虽然在代码上没有关联,但是Linux内核的开发借鉴了很多UNIX的技术和思想,举例如下。
(1)Linux支持POSIX(Portable Operating System Interface of UNIX)标准
POSIX标准定义了操作系统为应用程序提供的接口标准,它统一了各个版本的UNIX操作系统的API接口。支持POSIX,使得在UNIX上运行的应用程序,只需要使用Linux上的编译器,重新编译程序代码,就可以在Linux上直接运行了。
(2)借鉴了UNIX中最重要的两个抽象:文件和进程
UNIX将操作系统中的一切对象都抽象成文件,记录在硬盘上的数据是文件,目录是文件,设备也是文件,各种通信的对象也是文件,Linus将这些完完全全照搬了过来。此外,进程也是一个了不起的抽象,进程表示一个运行着的程序。因此,在计算机上做任何事,任何一个程序的执行,最终都可以抽象成一个进程。进程是多任务并行处理的基础,是实现CPU资源更细粒度管理的基础。因此,Linus对进程的概念也是照收不误,后续的工作就简单了,它要做的就是在Linux内核中实现进程,为上层应用提供进程操作的接口。
(3)借鉴了UNIX的开发哲学
在Linux内核的开发中,借鉴了UNIX的开发哲学,典型的如KISS(Keep it Simple and Stupid)原则、吝啬原则、策略与机制分离等。
总之,Linux是一个符合UNIX接口标准的操作系统,虽然它的内核并没有直接使用UNIX代码,但是天然包含着UNIX的基因,它们之间有千丝万缕的联系。因此称Linux为类UNIX系统。
按道理来说,UNIX出身名门(贝尔实验室和伯克利大学),而且早已是服务器和超级计算机操作系统领域的王者。为何没有竞争过晚20年出现的一个大学生所写的Linux呢?细思一下,这种逆袭还真是偶然中的必然,具体说明如下。
(1)PC操作系统需求激增
20世纪90年代初,PC开始普及,普通人能够接触计算机,因此用户激增。然而,此时PC上的操作系统并不好用,尤其是对那些曾经使用过UNIX的极客,感受尤为明显。因此PC操作系统的需求快速增长。
(2)UNIX厂商的短视与缺陷
在Linux诞生的最初几年,UNIX厂商们正忙着争夺势力范围,无暇顾及,而且此时的UNIX主要面向服务器和超级计算机领域,并没有看到PC一块的巨大潜力。此外,UNIX的拥有者大多数是商业公司,都想依靠UNIX来获利,从根源上决定了,他们不可能从技术和利益上与他人共享,这也注定了他们是以一己之力来战斗的。
(3)Linux在开发和组织上的优势
Linux内核既100%分享技术又是免费的,直接命中开发者和使用者的痛点。再加上采用Linux内核GPL协议,具有巨大的传染性。因此,Linux是聚集了全球的潜在用户和开发者来战斗,再加上Linus自身超强的技术能力和开发中的强势主导,因此,尽管一开始Linux很弱小,但是成长速度惊人。
总之,Linus很好地抓住了当时操作系统在PC上的空窗期机遇。
Linux严格意义上应该称为GNU/Linux,在介绍Linux时经常会和GNU关联起来。那么GNU是什么,它和Linux的关系又是怎样的呢?
GNU的全称是GNU is Not UNIX,由美国大名鼎鼎的计算机黑客Richard Matthew Stallman(理查德·马修·斯托曼)1983年发起。GNU计划的核心目标就是构建一套完全自由的操作系统,这个操作系统的名字就是GNU,以示和UNIX划清界限。为了确保GNU软件的自由,Stallman拟制了GPL为其保驾护航,GPL就是前面介绍的GNU通用公共许可证,它是GNU General Public License首字母的缩写。
Stallman是自由软件的精神领袖,他坚持软件的使用者应当拥有不受限制地使用、复制、修改和分发此软件的权利,其中就包括获取软件源码的权利。自由的英文是free,而free在英语中有“自由”和“免费”两个意思,Stallman认为应该将free software理解成free speech,即自由言论中的自由,而不应理解为free beer,即免费啤酒中的免费。
尽管Stallman反复强调,人们还是容易弄混自由软件中free的含义。因此,后续人们试图使用“开源”这个名词来替换“自由”,这也是“开源软件”的由来。Stallman认可“开源”一词会给技术交流带来便利,同时,他也认为“开源”会弱化“自由”所强调的重点,即软件自由的权利。因此,他对“开源”替换“自由”是持反对意见的。
此外,自由软件捍卫的是使用者对软件的处理拥有完全自由的权利,并不反对软件商业化,自由软件也可以卖钱。但是,自由软件除了提供二进制程序外,还提供源代码,并确保使用者能完全自由地处理它。
Stallman所信仰的自由软件精神,是一种典型的黑客文化,它可以最大程度的促进技术的交流和积累。确实,在20世纪80年代以前,这种黑客文化还是有坚实的阵地的,当时的计算机软件大多是科研的产物,在黑客之间自由地传播,基于源码,大家可以自由地学到最新的编程技术,还可以对源码进行改进,进而将自己的成果再分享给他人。这种自由开放的氛围感染了一代代的技术爱好者。
但是,进入20世纪80年代后,越来越多的软件被商业化,越来越多的软件不再提供源码,因为这是构建商业壁垒最简单的方式,其中最有名的就属UNIX了。看着自由软件的阵地一点点沦陷,技术界越来越多地充斥着封闭的味道。于是“最后一个真正的黑客”Stallman奋起反击,发起了这个GNU计划。
操作系统最重要的就是内核和周围应用两大部分,对于GNU来说,周围应用的开发进展顺利,到20世纪90年代初,已经出现了一系列有名的GNU软件,包括Emacs文本编辑器、BASH和GCC编译器等。但是,操作系统的核心却一直进展不顺,这就导致GNU由于“缺心”而迟迟不能发布。
到了1991年,Linus开发了Linux内核,除了自身技术过硬外,Linus还做了两个非常关键而又聪明的决定:第一个决定是拥抱GNU的周围应用,将GCC编译器和GNU BASH移植到Linux内核;第二个决定是Linux内核也采用GPL协议。这样,操作系统的两大主力:内核和周围应用,就完成了历史性的大会师,而且两者的三观完全一致,都采用GPL协议。GNU应用因为有了Linux内核,而能够运行起来供人使用;而Linux内核因为有这些专业的GNU应用的加入,迅速成为一个实用的内核。两者相得益彰,互相推动着对方快速发展。
对于每一个Linux发行版,其核心都是Linux内核,绝大多数的周围应用都是由GNU计划所开发的软件,如引导程序是GNU GRUB、编译器是GCC、文本编辑器是Emacs等。因此,严格意义上来说,Linux的完整名称应该为GNU/Linux,这也是Stallman一直以来所坚持和强调的观点。