当来自英国的21岁的中学生LinusTorvalds在1991年编撰Linux内核代码的第一行时,他可能没想到它会成为明天的庞然大物。
当初8月25日,Torvalds在MinixUsenet新闻组里发了一封贴子,称自己正在做一个自由的操作系统,“就是个兴趣爱好,不会搞得像GNU这么大这么专业”。
事情的发展其实远超他的预期,现在小到传感,大到超级计算机,从智能手机、手表、汽车等日常用具到航天器等设备,Linux内核的身影已无处不在。
随着迄今为止最大版本LinuxKernel5.8于去年8月初的发布,Linux内核已拥有超过2万名贡献者,历史commit数超过100万次,迎来一个新的里程碑。
上周适逢Linux29华诞记念日,Linux基金会发布了一份详细的Linux内核报告,囊括了自1991年9月17日首次发布以来,到2020年8月2日最新版本的Linux内核历史。
版本控制:从BitKeeper到Git
Linux基金会从2008年开始每年发布Linux内核报告,但此前始终无法将其发展过程完整串联上去。
去年,利用DanielGerman博士的cregit工具,她们成功溯源到了第一个版本,Linux内核的发展时间线显得清晰。依照版本控制方法,可大致分为以下三个阶段:
pre-versioncontrol(前版本控制):1991年9月-2002年2月4日
BitKeeper:2002年2月4日-2005年4月15日
Git:2005年4月16日至今
版本控制对社区协作能力影响重大,这在2000年代初是一件令人颇为烦恼的事情。使用版本控制系统,也就是BitKeeper之前,贡献者须要将补丁递交至电邮列表,待Torvalds接受后放进源码树,再发布整个树的新版本。
在这些形式下,具体是谁在做贡献、贡献的数目和路径都不够透明。
2002年2月4日,BitKeeper的使用标志着Linux内核commit历史的开启。但是BitKeeper为专有软件,这一决定在社区中遭遇了常年指责。
直至2005年,BitKeeper拥有者LarryMcVoy决定收回无偿使用BitKeeper的许可。Torvalds本人当时又对现成的CVS和Subversion等集中式版本控制工具倍感不满,因而自己动手,用十天时间写出了Git的第一个版本。
Git目前已成为开发者们十分熟知且广泛使用的分布式版本控制系统。LinusTorvalds则表现得更多的是慑于无奈,他曾宣称自己“根本不想做源代码管理,认为这是计算机世界中最无聊的事情”。
自从版本控制系统由BitKeeper改为Git后,Linux内核每年的贡献者和commit数目都在逐步下降。历年的内核报告数据显示,2005年5月发布的2.6.12版本平均每小时收到2次commit。
15年后,2019年的平均数是每小时9.4次。而在最新的5.8内核中,平均每小时commit数达到了10.7次。
冗长且自成体系的内核代码
首个内核版本linux-0.01.tar.Z由88个文件和10,239行代码组成,运行在i386这样单一的硬件构架上。到了5.8版本,这一数据扩张为69,325个文件和28,442,673行代码,并才能在30多种主要的构架上运行。
数目上的庞大仅是Linux内核代码的假象,它自身更是产生了一套复杂的体系,不熟悉的人常常不知从何处下手,极有可能“牵一发而动四肢”。这其实也是内核维护者难寻的诱因之一。
Linux内核发布第三天起的个别代码仍在当前版本中使用,比如Torvalds和学院好友LarsWirzenius共同编撰的vsprintf解释器,它也是为数不多存在至今的首次commit中的源代码。
去年的内核报告提及,有2,964个能被溯源至1991年的token现在在5.8版本中也能找到。5.8版本超过一半的代码写于近7年内,但之前所有年份都对此版本有贡献。过去的代码不断在后续的版本中留下痕迹。
持续膨胀的内核文件量和代码行数未见得完全是一件好事,为了使系统不显得臃肿,内核维护者须要做一些修枝剪叶的工作。
Linux内核中未使用的代码和文件就会被视情况删掉,有一些版本都会进行大的清除,比如2018年的4.17版本,删掉了8个构架linux网络内核分析与开发,净降低代码大概180,000行。
不仅仅是源码,Linux内核维护者都会关注空白行和代码注释,以确保源码的可读性。
开发者原创证书和标签管理
2004年对开发者原创证书(DeveloperCertificateofOrigin,简称DCO)的标准化是Linux内核史上的一个关键变化点。DCO的引入为开发者和用户提供了法律保护,同时又不至于降低程序负担。
它极大地提升了跟踪补丁步入内核的路径的能力,加上版本控制系统向Git的过渡,DCO有效地减少了开发者做贡献的开支,因而显得很受欢迎,后来也被许多其他开源项目采用。
随着DCO的标准化使用,如今几乎所有的commit都有一个Signed-off-by标签。一般每位commit平均会有两个该标签,才能反映代码在合并之前的维护者层次结构linux makefile,有助于溯源补丁步入代码的路径。
Signed-off-by之外,Linux内核还降低了表示审查的标签(Reviewed-by和Acked-by)。审查对内核代码的质量来说相当重要,标签的加入令这个过程愈发清晰,有越来越多的维护者选择使用标签来表示已审查。
在审查git库房时,Linux基金会发觉了一些比较有趣的标签,像是"Enithusiastically-ack'dby"、"Thanksto"、"Based-on-the-Original-screenplay-by"、"Catched-by-andrightfully-ranted-at-by"等等。
但这种标签并没有像上述两类一样被广泛采用。
行之有效的发布模式
Linux内核的发布模式已逐渐成熟,现今基本固定为Prepatch(或"-rc")、Mainline、Stable和LongTermStable四类版本。
社区曾对发布周期进行了大量的阐述和实验,并逐步找到了行之有效的发布模式,发布周期也几乎完全可预测——每个发布周期由时长两周的“合并窗口”开始,这时,新功能经适当的review后可被列入接出来要发布的git库房。
一旦它被标记为rc1,这么集成测试、调试和稳定化的周期就开始了。之后每周对rc候选版本进行标记,直至达到目标质量和稳定性。发布后,随着下一个合并窗口的到来,这个周期又开始循环。
内核的主线树由LinusTorvalds维护,这棵树引入了所有新功能。新的主线(Mainline)内核每2到3个月发布一次。但这样的发布节奏较慢,无法满足大多数用户的需求。因而,从2005年开始,每周发行一次稳定版(Stable)内核。
用户还想要受维护时间更长的版本,于是2006年发布的2.6.16版本成为第一个常年支持(LTS)版本内核。随后每年都有一个新的LTS内核linux伊甸园,该内核将由内核社区维护起码2年(从4.4版本开始延长至6年)。
Linux内核官网公布了所有现存LTS版本的发行日期、EOL日期及维护者(目前6个LTS版本都由GregKroah-Hartman和SashaLevin这三人维护)。
贡献者:长尾的力量不可忽略
不少组织都在为Linux内核做贡献,贡献者排名榜前列几乎都被Intel、RedHat、IBM、SUSE、Google、Samsung、AMD、Oracle、华为和ARM这样的大企业抢占。
从2007年到2019年,Linux内核共接受了来自1,730个组织的780,048次commit。排在最上面的20个组织占了68%的commit量。
在过去六年中,每年有超过400个组织为Linux内核作出贡献。其中相当一部份可能只有过一次commit。从每年的commit比列来看,其中1/3贡献来自神秘的长尾。也就是图中最前面浅蓝色“Others”的部份。
Linux基金会强调,企业的贡献会依照业务需求和战略的不同而有所变化。前20名贡献者中,有些是2007年以后才加入,有些在此前做过好多贡献的公司,被竞购后便不再继续参与。贡献者的多样性为内核发展赋于了一些弹性。
不仅组织贡献者,Linux内核社区成员也旨在于降低个人贡献者的多样性,她们一般乐意耗费自己的时间来指导新的开发者。
Linux基金会有一个KernelMentorship(LKMP)项目,拿来帮助新加入开源的开发者进行实验、学习,并为开源社区作出贡献。
内核社区的共同目标:高质量、可靠性
报告的最后,Linux基金会强调,内核社区的重点是保持一个共同的目标,即拥有一个没有回归的高质量操作系统,乐意按照须要创建新的流程和工具,以帮助提升效率,并继续提高Linux内核的可靠性。
内核测试如今也引入了一些手动化测试工具:静态剖析工具如sparse(语义解析器)、smatch(源匹配器)和cocicheck(语义补丁,测试特定的bug),由0-day和HulkRobot这样的手动测试机器人在Linux内核树上运行。
机器人在发觉和跟踪bug上起到不少作用。这种测试工具就能帮助开发人员跟上上游内核的速度变化,并继续改进内核版本,提高其稳定性。
Linux内核现在被应用于众多领域,基金会觉得linux网络内核分析与开发,改进基础设施,进行正确的安全剖析,是接出来要应对的重大挑战之一。
目前Linux内核已拥有一个挺好的基础,它应该继续推动创造最佳实践,以推动整个开源软件行业的发展。