点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)。
在讲具体的技术点之前,我们先来讲一些Linux内核相关的小故事。我们都有过这种经历,如果我们对一件事很感兴趣,那我们就会很投入做这件事,做再久也就不会感觉到累;而如果我们对一件不感兴趣,那让我们多做一分钟估计都会感到难受。 比如对于喜欢玩游戏的朋友,你们可以玩几个小时,甚至通宵玩游戏;而我不喜欢玩游戏,让我多玩一分钟我都感觉难受;但我喜欢写博客,周末我可以把全部时间都花在写博客上。 所以我们讲这些Linux内核的小故事,目的是让各位朋友对学习Linux内核产生兴趣,然后全身心的投入学习,接着能力就提升得很快,再涨很多工资,最后走上人生巅峰。当然Linux内核快速发展的30几年时间(截止到2024年),有趣的故事多到数不过来,这里只列出一小部分,感兴趣的朋友以后可以自己继续探索。
高晓松有句话: 这个世界不只有眼前的苟且,还有诗与远方。这在自由软件之父 理查德·马修·斯托曼 身上真正做到了,我们先来看看这位自由软件之父的光辉事迹。
先上一段维基百科上对他的简介:
理查德·马修·斯托曼(英语: Richard Matthew Stallman,简称rms,有时也用大写的RMS,1953年3月16日—),美国程序员,自由软件活动家。他发起自由软件运动,倡导软件用户能够对软件自由进行使用、学习、共享和修改,确保了这些软件被称作自由软件。斯托曼发起了GNU项目,并成立了自由软件基金会。他开发了GCC、GDB、GNU Emacs,同时编写了GNU通用公共许可协议。
接触过编程的朋友应该都用过GCC和GDB这两大必不可少的工具,但也许会有朋友以前没了解过这是他开发的,当然他开发的软件数不胜数 ,比如我使用的相对比较小众但功能极其强大的Emacs编辑器 。
他写过很多伟大的软件,但相比他的软件开发能力,他最大的成就要数他发起的自由软件运动。可以不夸张的说,他发起的这项自由软件运动,是Linux能够这么成功的基础,当然也是今天很多流行软件成功的基础。
顺便要提一下的是,他虽然在计算机领域有突出贡献,学生时代还在数学、物理学、生物学领域非常有天赋。
他曾经说过一段话:
随着社区(软件分享社区)的终结,我面临着一个道德上的抉择。最简单的就是投身于专有软件世界之中,签署不公开协议,并承诺不帮助同行、同事。自己也很可能编写软件,并在不公开协议的前提下发布软件,去同流合污,迫使更多的人背叛自己的原则。显然,走这条路,可以挣大钱,而且使编写代码的工作增添一份金钱上的快乐。但是我知道,等到自己职业生涯终结时,我再回首这些年为分离人类而砌造的‘墙壁’。我会感受到,我将自己的一生都用在使这个世界变得更加糟糕。
1960年代的美国兴起的黑客文化起源于麻省理工学院,到1980年代时,黑客文化已经有所衰落,Unix开始收费和商业闭源(后面会细说),斯托曼于是开始致力于创建 Unix 的替代品,1985年成立了自由软件基金会,并发表GNU宣言。自由软件运动与开放源代码运动让黑客文化又开始流行了。
有意思的是,斯托曼用的一台电脑是中国龙芯芯片的江苏龙梦电脑,这台电脑甚至于在BIOS层级都完全是自由软件。
更多关于这位自由软件之父的有趣故事,可以看他的个人自传《Free as in Freedom: Richard Stallman’s Crusade for Free Software》(中文翻译: 《若为自由故》)。
GNU这个名字其实挺有意思的,GNU is Not Unix,是一个递归缩写,这是黑客文化中的一种幽默。1983年9月27日由理查德·斯托曼在麻省理工学院公开发起。这项计划的目标很崇高,就是创建一套完全自由的操作系统,称为GNU,从名字我们可以知道,就是要创建 Unix 的替代品。
我们再来看自由软件的定义: 一类可以不受限制地自由使用、复制、研究、修改和分发的,尊重使用者自由的软件。这里要强调的一个词是“不受限制”,使用自由软件的人可以随便修改源代码,但要遵守一定的自由软件许可协议。自由软件许可协议有很多,比如BSD和MIT等宽松自由软件许可证,比如GPL这种Copyleft许可证。
这里我们重点说一下GPL协议,为什么呢,因为我们要学习的Linux内核就是采用的GPL协议,全称是GNU General Public License,中文名称是GNU通用公共许可协议。GPL是一个Copyleft许可证,什么是Copyleft呢,其实这个概念很有意思,就是针对copyright,copyright就是是著作权,俗称版权。维基百科上有一句话可以很好的解释Copyleft的概念: 允许他人任意的修改散布作品,惟其散布及修改的行为和作法,亦限定以Copyleft的方式行之。翻译一下也就是你可以随便修改和传播我的代码,但你修改过的代码也要允许其他人修改和传播。
然后还要说一点,就是自由软件也是可以收费,可以商业化的,举个例子吧,比如红帽公司的Linux发行版就要收费,但他们的收费形式是通过提供技术服务,就是客户使用他们的发行版遇到问题了,红帽公司就有偿的帮助他们解决问题。
既然GNU计划是一项计划,可能有朋友会问这项计划成功了没,答案是这项计划基本完成。你可能会说,一项计划要么未完成,要么已经完成,为什么会是一个基本完成的状态呢,这就得说到GNU Hurd内核Linux内核了。到1989年时,GNU项目中的其他部分,如编辑器、编译器、Shell等都已经完成,就缺一个内核,GNU计划在1990年时是要开发一个内核的,名字叫Hurd,但这个Hurd也许一方面是设计得太复杂了吧,另一方面Linux内核的横空出世,让所有人都把目光从Hurd内核转移到Linux内核身上了,斯托曼坚持认为 Linux 应该被称作 GNU/Linux,因为 GNU 计划更早出现,且在 Linux 操作系统的早期,GNU 社区的软件源代码在其中起了关键的作用,例如 GCC 编译器。
实际上吧,在今天,比起“自由软件”这个概念,“开源软件”被更多人提起。在自由软件之父看来,开源软件和自由软件是严格区分的。关于这两个概念的区别,社区争议很大,广为流传的一种说法是,我们可以这样理解,开源软件的范围更广,开源软件包含自由软件,也包含不自由软件,也就是有一些软件虽然开源了,但并不允许别人修改,你改了我的代码拿来商用,不管你有没把商业软件开源,我依然可以告你。
比如Minix早期的源代码虽然容易得到,但并没有采用自由软件许可协议,所以早期还不能称为自由软件。直到2000年4月,重新以BSD许可协议发布,才变成自由软件。
Linux的诞生和Unix密不可分,我们来看看关于Unix的一些有趣的故事。Unix这个操作系统的起源很有意思,它是起源于一个失败的操作系统MULTICS,这个MULTICS操作系统计划可厉害了,参与开发的公司和学校有贝尔实验室、麻省理工学院及美国通用电气公司,1964年开始开发。但是5年后1969年时因开发进度太慢,贝尔实验室决定退出这个计划。贝尔实验室里有两个很厉害的人,肯·汤普逊(老K)和丹尼斯·里奇(老R),也许你一时间想不起来他们是谁,但你肯定知道c语言吧,没错,他们就是c语言的作者。这两个厉害的人为什么要开发Unix呢,原因很有意思的,就是老K想玩一个他自己开发的叫“星际旅行”(Space Travel)游戏,之后老R也加入进来了,这系统的功能越来越完善,1970年时取名为Unix。
接下来的10年左右,Unix的拥有者AT&T公司(贝尔实验室就是这家公司的)以很便宜甚至不要钱将Unix源码给了学术机构用来研究或教学,这些学术机构经过扩展和改进,形成了所谓的“Unix变种”,其中最著名的是由加利福尼亚大学伯克利分校开发的伯克利软件套件(Berkeley Software Distribution,BSD)产品。后来AT&T公司发现Unix可以卖很多钱,就后悔了,不想把源码给学术机构了,还对Unix及其变种声明了著作权权利。但BSD已经被很多商业厂家采用了,AT&T就开始了一场持久的著作权官司。1984年时Unix的免费发行结束,斯托曼在1983年9月27日就发起的GNU计划着手使用免费分发给任何人的软件重新构建Unix,还将计划命名为GNU is Not Unix。
Minix是一个迷你版本的类Unix操作系统,名字就是Mini Unix的简称,作者是安德鲁·斯图尔特·特南鲍姆,最初只用于他的教学,采用的是微内核的设计,没有使用任何的Unix代码,最初在1987年发布,最初只有约12,000行。2000年4月,重新以BSD许可协议发布,成为自由软件。在今天看来,这个Minix的最大价值在于启发了Linux内核的创作。
Linux内核刚发布时,使用的就是Minix文件系统,现在2024年的Linux内核源码中,还能看到Minix文件系统的代码,当然现在Minix文件系统并没有用于商业用途,仅仅只是用于学习的demo吧。还有Linux内核刚开发时,也是在Minix上编写代码和编译的。
我们要学习的Linux内核是宏内核,也叫集成式内核、单体式内核,就是很多功能都放在内核中。除了Linux内核外,宏内核的操作系统还有: 传统Unix内核(BSD、Solaris),类Unix系统的内核(FreeBSD、OpenBSD、NetBSD、LynxOS、Syllable Desktop),磁盘操作系统Disk Operating System(DR-DOS、MS-DOS、Microsoft Windows 9x系列(95、98、98SE、Me)、FreeDOS),Mac OS(从最初版到Mac OS 8.6版),OpenVMS,XTS-400。
刚刚说到的Minix和GNU计划的Hurd是微内核,提倡内核中的功能尽可能的少,只保留一些最核心的功能,其他的功能都放到用户空间中,是特殊的用户进程。其他的微内核的操作系统还有: QNX(在黑莓手机BlackBerry 10系统中被采用),L4微内核系列。
需要注意的是,微软Windows系统和苹果电脑的Mac OS X虽然说自己使用的是微内核架构,但为了追求性能,将很多功能放到了内核空间,实际上这已经违反了微内核的基本设计原则,更像是宏内核的设计方式,所以一般被称为混合内核。
POSIX的全称是Portable Operating System Interface,中文翻译为可移植操作系统接口,其中X的意思是对Unix API的传承。这个名称是自由软件之父斯托曼应IEEE的要求而提议的一个易于记忆的名称。
POSIX标准的目的是为了在各种Unix操作系统上定位API(应用程序接口)的标准,通俗的讲就是,你在BSD操作系统上写的源代码,拿到Solaris操作系统上也能编译运行。Linux虽然没有参加正式的POSIX认证,但基本上逐步实现了POSIX兼容。还有一个我们开始接触电脑就会用到的微软的Windows系统也部分实现了POSIX标准。所以现在你在Windows系统上编写的源代码,拿到Linux上也能编译运行通过了。
先上维基百科的一段描述:
林纳斯·贝内迪克特·托瓦兹(瑞典语: Linus Benedict Torvalds,瑞典语: [ˈliːn.ɵs ˈtuːr.valds],1969年12月28日—),生于芬兰赫尔辛基市,拥有美国国籍,Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师与项目协调者,是当今世界最著名的电脑程序员、黑客之一。他还发起了开源项目Git,并为主要的开发者。
如果你在网上搜索“世上最厉害的程序员”,你绝对会发现林纳斯在其中。在他开发的众多软件之中,有两个软件最为著名,就是接下来我们要学习的Linux内核和git。其中git几乎现在的每一个程序员一定会用到的代码管理工具。他有句名言: Talk is cheap, show me the code,翻译过来就是,别逼逼那么多,有种给我看你的代码。从这句话可以看出,在他的带领下,Linux内核社区以技术说话,所以在Linux内核社区你可以和世上最顶尖的程序员交流技术,是不是有点小心动。
林纳斯在11岁时时就开始写程序,1989年进入大学的第二年去当兵,期间买了安德鲁·斯图尔特·塔能鲍姆所著的教科书《操作系统: 设计与实现》(Operating Systems: Design and Implementation,ISBN 0-13-637331-3)及Minix源代码,开始研究操作系统。
接下来说几件关于他的有趣故事 。直接从维基百科上copy过来吧 :
托瓦兹坚持开放源代码信念,并对微软等对手的FUD战略大为不满。例如,在一封回应微软资深副总裁克瑞格·蒙迪批评开放源代码运动破坏了知识产权的电子邮件中,托瓦兹写道: “我不知道蒙迪是否听说过艾萨克·牛顿爵士?他不仅因为创立了经典物理学而出名,也还因为说过这样一句话而闻名于世: ‘我之所以能够看得更远,是因为我站在巨人肩膀上的缘故。’”托瓦兹又说道: “我宁愿听牛顿的也不愿听蒙迪的。他(牛顿)虽然死了快300年了,却也没有让房间这样地臭气熏天。” 陈孝松注: 需要说明一下,微软现在已经拥抱Linux了,甚至有了自己的GNU/Linux发行版了。
林纳斯在网上邮件列表中也以火暴的脾气著称。例如,有一次与人争论Git为何不使用C++开发时与对方用“放屁”(原文为“bullshit”、“BS”)互骂。他更曾以“一群自慰的猴子”(原文为“OpenBSD crowd is a bunch of masturbating monkeys”)来称呼OpenBSD团队,因为林纳斯认为软件一般性的错误比安全漏洞来的要多,而信息安全人士因为找到漏洞而成为英雄,而忽略了一般性软件错误的修补,并认为OpenBSD团队过度重视安全性忽略其他部分。
2012年6月14日,托瓦兹在出席芬兰的阿尔托大学所主办的一次活动时称Nvidia是他所接触过的“最烂的公司”(the worst company)和 “最麻烦的公司”(the worst trouble spot),因为Nvidia一直没有针对Linux平台发布任何官方的Optimus支持,随后托瓦兹当众对着镜头竖起了中指,说“去你妈的NVIDIA!”(So, Nvidia, fuck you!)。 陈孝松注: 这句话还真让这家公司做出改变了,现在英伟达开源了不少驱动,林纳斯对英伟达举大拇指了。
更多的林纳斯的有趣故事,可以查看他的个人自传: 《只是为了好玩》。
在林纳斯当兵期间,接触了Minix操作系统,Minix的源代码虽然容易得到,但作者只想把这个系统用于教学,对源代码的修改和发布是不允许的,这让林纳斯感到失望。另外,1989年时GNU项目中的其他部分,如编辑器、编译器、Shell等都已经完成,虽然在1990年自由软件基金会开始正式发展Hurd,但也许是设计得太过复杂了吧,开发进行得并不是很顺利。
这些原因综合在一起,使林纳斯决定要自己写一个内核,1991年,还是一名大学生的林纳斯在comp.os.minix新闻组里发了一封帖子,说自己出于兴趣爱好做了一个(自由的)操作系统,希望得到懂Minix系统的人的意见。之后,许多人为这个项目贡献了代码,其中Minix社区贡献了很多代码和想法。有趣的是,Linux内核最初不是取这个名字的,而是叫Freax,但林纳斯的同事觉得这个名字不好听,就把名字私自改成了Linux。
1991年9月,0.01版本时有1万多行代码。1994年3月14日,1.0.0版本有17万多行代码。1995年3月,1.2.0有31万行代码。2013年6月3.10版本有1580万行代码。再看2024年的今天,Linux的内核代码行数如今已经达到3000万行左右(约一亿的1/3)。一个由个人兴趣发展起来的软件,30几年发展到如今的规模,可以看出当初的设计是多么的优雅。
一个操作系统只有内核肯定是不够的,还需要配套很多GNU软件,这些软件与内核的集合称为Linux发行版,更准确的说,应该叫GNU/Linux发行版,因为其中包含了数量庞大的GNU软件,Linux内核虽然非常重要,但也只是占据很小的一部分。
按软件包管理系统划分,介绍使用人数最多的两个大类,当然还有其他发行版本使用别的软件包管理系统。
首先是Debian系,Debian及其派生发行版使用deb软件包格式,并使用dpkg及其前端作为软件包管理器。
接着介绍一下Red Hat系,使用RPM格式软件包。