您是否想过如何测试Linux内核?如何维护Linux内核这一使用了全球数千名程序员开发的,数百万行代码的开源项目的质量?
这不是一件容易的事。但这并不意味着这是一件不可能的事!
大约每3个月(10到12周)就会发布一个新的Linux内核版本。在此期间,将为“合并窗口”保留2周的时间,其中所有已开发和批准的内容都将合并到Linus Torvalds树(主线)中。剩下的8到10周的开发时间用于修复漏洞和稳定化。
在稳定阶段,会发布新的候选版本(通常每周一次)。当Linus Torvalds“觉得”代码“足够稳定”并且最新候选版本中的更改数量减少时,将发布新的内核版本。
当我说Linus Torvalds感到代码“足够稳定”时发布了新版本时,我的意思是说Linux内核开发过程中没有什么正式的流程可以发布新版本。没有任何一种神奇的工具可以针对内核进行完全的测试,也没有正式的测试计划可以确保新的内核版本能够正常运行。发行新版本的决定实际上是基于Linux 仁慈的独裁者 Linus Torvalds 的感觉。
但这并不意味着Linux内核没有被测试。恰恰相反!
社区鼓励内核用户和开发人员开发和测试代码生产树并在邮件列表和Bugzilla(Linux内核社区未使用的错误跟踪工具)上报告错误。这里有一个关于如何报告 Linux内核源代码中的BUG的文档。
Linus Torvalds自己是鼓励对发行的新版本内核进行这些测试的,他有时会以“ Go out and test!”作为发行新版本内核邮件的结尾。
内核开发过程还证明了测试其实是很重要的,因为大约有20%的开发时间(2周)专门用于代码集成,而另外80%的开发时间(8到10周)则专用于测试和Bug修复。
但是,为了确保以良好的质量发布内核,我们不仅仅依赖于开发人员和用户的积极性。各种不同的工具可以在此过程中提供帮助,包括静态代码分析工具,自动化测试工具和持续集成工具。
那么,让我们谈谈最有效的可以帮助我们发现Bug并测试Linux内核的工具吧?
静态代码分析工具
与其从正在运行的程序中发现Bug, 更好的做法是在程序运行之前找到并修复Bug,对吗?这是静态代码分析工具做的事情。
静态分析工具无需运行程序就可以分析源代码并发现问题。如果您想更好地了解这些工具的工作方式,请参阅文章“ 使用静态分析工具发现Bug ”。
有一些针对Linux内核的静态分析工具,可帮助许多开发人员在开发过程中识别和修复Bug。
Sparse是最初由Linus Torvalds编写并与Linux源代码集成的工具,旨在发现内核中可能的编码错误。通过注解,该工具在源代码中执行了多个语义验证。例如,如果内核代码试图直接取消引用用户空间指针(标记为__user),则该工具将指出该错误。有关此工具的信息,请参见内核文档。
Smatch是一个专注于Linux内核的静态分析工具。该工具能够识别编程错误,例如访问空指针,缓冲区溢出,使用释放的内存,死锁,使用未初始化的变量等等。根据LWN的帖子,Smatch已经帮助发现并修复了3000多个Bug。有关此工具的更多信息,请访问项目的网站。
Coccinelle是一个非常有趣的工具,能够识别源代码中的模式并自动进行更改。例如,假设您需要更改数百个设备驱动程序所共同使用的内核API函数的签名,除了打开每个驱动程序的源代码并手动进行更改之外,还可以使用Coccinelle自动执行该过程。而且,Coccinelle已经帮助识别到了Linux内核中的数百个Bug。例如,该补丁是由该工具自动生成的,用于纠正内核中的内存泄漏的Bug。有关更多信息,包括在Linux内核中发现的错误的列表,请访问该项目的网站。
除静态代码分析工具外,当前还可以使用多种自动化测试工具来识别Linux内核中的Bug和回归。
自动化测试工具
自动化测试工具可以在开发过程中为程序员提供很多帮助,避免程序员重复去做一些测试,能够自动识别代码中可能的Bug并进行回归测试,提高软件质量并节省开发人员的时间。
ktest是一个Perl脚本(ktest.pl),它可从Linux源代码中的tools / testing / ktest /获得,该脚本能够自动化编译、部署和测试内核映像。该工具接收内核配置文件,通过该配置文件进行构建,然后将生成的镜像部署到远程计算机上,以执行用户定义的某些类型的自动化测试,例如,等待来自串行控制台的登录消息并测试。所有的构建、部署和测试步骤都是可配置的。这是对内核进行自动化测试非常有用的工具。LKML中的此消息可以给有兴趣进一步了解该工具的人的提供参考。
kselftest是Linux源代码中在tools / testing / selftests中提供的测试框架,能够测试内核的特定部分。测试脚本用C语言或Shell脚本编写,并在用户空间中运行以测试内核的特定部分。一些测试脚本可以验证部分Linux内核子系统、库和API,包括cpufreq,gpio,网络,rtc,watchdog,cgroup,ftrace,futex,ipc等。它对于开发人员和用户都是非常有用的工具及其文档可在内核源代码和此Wiki页面上找到。
Linux测试项目(LTP)是一个项目,不仅可以自动化验证Linux内核的功能,还提供了一套自动化验证Linux内核的可靠性、健壮性和操作系统稳定性的工具。该项目由IBM,Cisco,Fujitsu,SUSE和Red Hat等公司开发和维护。测试脚本用C和Shell脚本编写,并直接在目标系统上运行。有关该项目的信息,包括源代码和文档,可在GitHub上获得。
Autotest是GPL许可的自动化测试框架,其重点是Linux内核,由多个组织(例如Google,IBM和Red Hat)开发和使用。它具有非常模块化的体系结构,包括用于运行测试的客户端,用于控制多个客户端的服务器以及用于触发测试和查看结果的Web界面。该工具的重点不是自己实施测试,而是提供基础结构以自动执行由其他项目实施的测试。例如,自动化测试使用LTP项目中实现的测试用例。该项目的源代码及其文档可在GitHub上找到。
KUnit是Linux内核邮件列表上的Google的Brendan Higgins在2018年末提出的针对Linux内核的单元测试框架。该项目的作者认为,该框架的灵感来自其他单元测试工具,例如JUnit(Java),unittest.mock(Python)和Googletest / Googlemock(C ++)。尽管大多数测试自动化工具需要一台运行内核的机器来运行测试,但kunit却没有这种需求。它使用一种称为用户态Linux的内核功能,这是一种特殊的体系结构,可以像运行其他程序一样运行Linux内核。因此,无需在单独的计算机上运行测试。Linux内核源代码中提供了KUnit的文档。
主要用于识别安全问题的另一种非常常见的测试自动化技术称为模糊测试。模糊测试工具能够为应用程序生成随机/无效条目,并监视结果以识别可能的问题,例如崩溃或资源泄漏。Linux主要的两种模糊测试工具是Trinity和Syzkaller。还有一个名为Syzbot的自动化工具,该工具在某些Linux内核树上持续运行Syzkaller,并报告在此网站上发现的问题。
最后,还有测试特定内核子系统的几种工具,其中mmtests的重点是测试内存管理,xfstests主要用于测试文件系统,hackbench主要用于测试调度器。
在Linux内核开发过程中,利用持续集成,这些测试工具都可用于识别和报告Bug。
持续集成
每天都会对内核开发和生产代码库进行数百次提交。这些提交会引起一些问题,包括回归,构建失败以及与其他分支和代码库的合并冲突。
在这种情况下,持续集成的实践(CI-持续集成)可以提供帮助。CI工具将集成开发人员每天完成的工作,执行自动化测试,并使得在生产环境之前就可以发现并修复Bug。
KernelCI是Linux Foundation项目,并且是当前最完整的Linux内核自动化测试和持续集成工具。该工具由Linaro于2014年创建并发布在kernelci.org上,可在多个内核开发树上执行自动构建测试,引导内核在大量硬件平台上编译,并执行一些自动化测试。测试结果将发布在项目的邮件列表和网站上。该工具的源代码托管在GitHub上。
对Linux内核进行持续集成的另一个工具是0天测试服务。该工具由英特尔创建和维护,专注于x86架构,并监视各种内核开发和生产树,自动执行构建,引导,功能测试和性能测试。当检测到内核的问题时,电子邮件会自动发送给内核维护者。根据该项目的网站,它已经帮助识别了内核开发树中的40,000多个Bug!有关更多信息,请访问该项目的网站。
LKFT(Linux内核功能测试)是Linaro的一种持续集成工具,可在多个内核开发树上执行功能测试,以发现Bug和回归测试。使用OpenEmbedded完成构建,并在ARM和x86平台(32位和64位)上执行自动化测试。结果发布在该项目的网站上。
Kerneltests项目于2013年创建,主要用于Linux内核稳定版本的测试。该工具会在所有体系结构的CPU上持续运行构建测试,并在QEMU中持续运行一些启动测试。测试结果发布在项目的网站上。
还有其他测试自动化和持续集成的工具,例如Fuego,LAVA和Beaker。一些维护Linux发行版的社区使用这些自动化测试工具来识别和报告内核问题。
那么,我们没有Bug了吗?
当然不是。但是,正如我们所看到的,从用户和开发人员开始,有多种测试Linux内核的计划和方法,包括使用静态代码分析的工具,模糊测试工具,单元测试工具,自动化测试工具和持续集成工具。要保持世界上最大的开源项目之一的Linux内核的质量,社区在持续不断的进行着合作。
但是,仍然有许多的挑战。
尽管近年来测试覆盖率有所增加,但是内核源代码库非常庞大,并且随着每个版本的发布,代码库的规模呈指数增长,这就需要付出巨大的努力来维护和增加测试覆盖率。另一个主要的挑战是,要使设备驱动程序和硬件平台的测试自动化,因为它们需要对硬件进行测试。这些工具之间也缺乏协作,互操作性和标准化。
因此,总有改进的空间。这些挑战鼓励社区进一步改善现有工具和流程,开发新的技术和测试工具,并继续提高Linux内核的质量。
另外,欢迎加入软件测试技术交流群 313782132 ~进群可领取软件测试资料以及群内测试大牛解惑!
测试工程师职业发展路线图
功能测试 —— 接口测试 —— 自动化测试 —— 测试开发 —— 测试架构师
加油吧,测试人!如果你需要提升规划,那就行动吧,在路上总比在起点观望的要好。事必有法,然后有成。
资源不错就给个推荐吧~