前言

  Linux基金会在4月3日公布了Linux开发年报,向我们展示了linux kernel作为世上大开源合作项目之一的魅力。自2005年以来,共有800家公司7800名开发人员参与Linux kernel开发,近一年也有200家公司共1000名开发人员参与。目前在Linus Torvalds的监督之下,Linux核心约2到3个月发布一个新的稳定版本,每次更新大约包含8000到12000项修改,平均每小时有提交6.88次修改。内核所有文件代码已超过1500万行,大约以每年10%的代码量在增长。

  规模组织如此巨大,开发又活跃,且对质量有非常高要求的项目,不禁好奇它是如何做好质量保证的,于是查阅了网上较多资料,探索Linux kernel的质量保证之道。

  名词解释

  Linux Kernel和GNU/Linux。Linux kernel作为系统的底层,是负责管理硬件、执行任务调度、维护整体安全和完整性的系统软件。一个内核不是一套完整的操作系统,人们将 Linux 内核和 GNU 系统组成完整的自由系统:基于 Linux 的 GNU 系统(或简称为 GNU/Linux 系统)。咱们平时所说的Linux系统多是指GNU/Linux。

  Patch。升级内核时,不必要每次都下载或提交整个的源码文件,而是使用patch,或者叫做补丁或升级包。很多不同版本的内核源代码是以一组补丁(补丁集)甚至是若干独立补丁的形式存在的。这些补丁应该应用在特定版本的内核树上。

  内核树。树的意思是“包含内核源代码的目录的内容”。另外一层意思是“内核源码的开发分支”。不同的分支命名也不一样,比较流行的分支(树)有-next树(前身是Andrew Morton维护的-mm树),-rt 树(实时树,包含把linux转换为实时系统的补丁)。

  -next 树,由Stephen Rothwell维护,是一些其他树以及各种独立的实验性补丁,它集合了主线和多种内核子系统(子系统树)维护人所使用的树,子系统树中含有被认为是实验性的和还没准备好合并到主线中的各种补丁。换句话说,-next树的每个版本都是带有额外修改和一些bug的主线的未来快照。Bug尽可能在这些补丁合并到主线之前得到修正。

  开发流程

  要了解测试,先得看看整个项目的开发过程。

  Linux kernel开发流程是基于一个松散的、定时发布的滚动模型,每2-3个月发布一个新稳定版本。2-3个月被认为是一个合适的时间周期,能加快开发速度的同时,也减少发行商需要处理的外部修改,更短则导致测试时间太少,新内核测试不充分;更长则导致发布版本之间会堆积太多工作。此模型从2005年正式确认,尽早将新功能融入内核主线,将发布给用户的延期降至低。

  在准备提交Linux kernel代码前,开发者将升级拆分为一个个小的互相独立的单元,叫做补丁(patch)。每个补丁通常只做一件事情,并且应当保证系统在打上此补丁之后是依然能正常编译和工作的。这导致每个补丁都可以做代码质量和正确性评审,同时也导致每个版本提交的补丁数较大。

  提交的补丁并不是直接进入到内核主线,参考图一的代码流动过程,只有一个人能将补丁放入到内核主线:Linus Torvalds。但是随着越来越多的补丁加入到内核,大约只有2%的补丁是Linux直接选入的。内核代码从逻辑上是拆分成一系列的子系统集合。每个子系统负责内核的一部分(比如网络、SCSI驱动、特定架构支持、内存管理、视频设备等),并且拥有指定的维护者,维护者对该子系统的代码总体负责。当前有过超过100个子系统。补丁先是进入到一个子系统树,子系统维护者接受修改时,补丁会附加“由谁签收通过” 的一行签字。该信息表明此补丁可以合入到内核。

图一 代码流动过程

  Linux-next树本意是在Linus合并代码前将各子系统的代码整合到一起,并进行测试,挑选出可能存在的冲突和跨子系统问题。