前言
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合并代码前将各子系统的代码整合到一起,并进行测试,挑选出可能存在的冲突和跨子系统问题。
实际例子
一个新版本2.6.20的发布过程如下图二。在每一个版本开始时,Linus会打开合并窗口(merge window),从那时起,被认为是可靠稳定的代码会被合并到内核主线,新的功能或驱动等得以加入进来,合并窗口会开启两周,然后Linus会宣布窗口关闭,并发布第一个rc版本,如下图2.6.20-rc1。此-rc1版本的发布意味着新功能的加入已经完成,以后再加入的补丁只能是修复问题,以确保此版本的稳定,但也有即少数包含新功能的补丁会被认为是不友好的。问题修复的代码不断进入主线,Linus接下来大约每周发布一个新的rc版本,通常会在6-9个rc版本后认为此版本已经稳定并且最终发布2.6.20版本,再进入下一个三位版本的迭代。发布之后,此2.6.x版本就移交给稳定组(stable team),稳定组时而会再发布2.6.x.y版本,每个四位版本的发布会有两个条件:(1)修复重大的bug;(2)该补丁也已被融入到下个三位版本开发的主线中了。稳定组通常维护一个稳定版本6个月左右,之后就由使用该版内核的发行版发行商负责。
图二 一个版本的发布过程
测试
对Linux kernel测试面临的挑战巨大:如前面的数据所显示,(1)其快速活跃的开发;(2)经常性的版本发布,每次发布都包含大量修改,以及内核本身支持配置的灵活性、可扩展性,待测点太多(3)需要覆盖各种平台,Linux已支持二十多种平台体系,是支持平台最广的系统;(4)过时的case需要维护以及大量遗留代码。
与松散的开发流程相对应,没有看到正式的测试流程,开源软件很大一部分的测试执行是依靠用户实际运行使用。如下图三所示。
图三 开源测试的大体流程
测试项目简介
Linux kernel与测试相关较出名的开源项目有:
LTP:Linux Test Project http://ltp.sourceforge.net/。
Autotest:http://autotest.github.com/
CrackerJack Project:http://ossipedia.ipa.go.jp/crackerjack/index.html。
原文转自:http://qa.baidu.com/blog/?p=1026