Linux内核如何测试?


258

Linux内核开发人员如何在提交代码后在本地测试他们的代码?他们是否使用某种单元测试,构建自动化?测试计划?


16
youtube.com/watch?v=L2SED6sewRw,在某个地方,我记不清了,但是我认为在质量检查部分中正在谈论这一点。
安德斯(Anders)2010年

6
Anders的链接很棒-顶级内核开发人员之一Greg Kroah Hartman的Google技术讲座。他验证了内核开发人员@adobriyan在下面给出的答案。格雷格(Greg)指出了有关内核的有趣之处-没有运行内核就没有很好的测试方法-很难进行单元测试等-许多排列。“我们依靠开发社区进行测试。我们需要尽可能多的功能测试以及性能测试。” 直奔测试讨论的一个环节是 youtube.com/...
nealmcb

随着VM的普及,难道无法通过使用一堆配置排列构建内核并尝试在其上启动来自动执行此操作吗?无论如何,这都不是一个“单元”测试,但是它可能会捕获错误。
丹尼尔·卡普兰

@DanielKaplan:如果您假设大约有1000个主板,每个主板具有10个CPU中的一个,再加上1000个PCI设备中的3个,再加上1000个USB设备中的3个;内核具有1000个可能的编译时选项;那么您正在查看大约1000 * 10 * 1000 * 999 * 9981000 * 999 * 998 * 1000个可能的排列进行测试。如果您对每个排列进行8小时的良好测试,并拥有100个服务器池以同时并行运行400个VM,那么到您进行百万分之一的测试时,结果就会过时,因为有人更改了代码,您必须重新开始。
布伦丹

关于ycombinator的单元测试,有一些讨论
joeytwiddle

Answers:


76

linux内核非常重视社区测试。

通常,任何开发人员都会在提交之前测试自己的代码,并且经常会使用Linus的内核开发版本,或与他们的工作相关的项目中使用的其他不稳定/开发树之一。这意味着他们经常同时测试自己的变更和其他人的变更。

正式的测试计划的方式往往不多,但是在将功能合并到上游树之前,可能需要进行额外的测试。

正如Dean指出的那样,还有一些自动化测试,Linux测试项目内核autotest很好的概述)。

开发人员通常还会编写旨在测试其更改的自动化测试,但是我不确定是否有(经常使用的)机制来集中收集这些临时测试。

当然,这很大程度上取决于要更改内核的区域-您对新的网络驱动程序所做的测试与替换核心调度算法时所做的测试完全不同。


8
+1,一半的战斗根本没有打破驾驶员所依赖的东西,因此多年来BKL的坚持不懈。要考虑的另一件事是,在许多不同的体系结构上测试许多子系统,这仅在Linux受到社区滥用,错误测试的情况下才切实可行。
蒂姆·波斯特

66

自然,内核本身及其组成部分在发布之前已经过测试,但是这些测试仅涵盖基本功能。有一些测试系统可以对Linux内核进行测试:

Linux测试项目(LTP)向开源社区提供了测试套件,可验证Linux的可靠性和稳定性。LTP测试套件包含用于测试Linux内核和相关功能的一系列工具。https://github.com/linux-test-project/ltp

自动测试 -全自动测试的框架。它主要用于测试Linux内核,尽管它对于许多其他目的很有用,例如验证新硬件,虚拟化测试以及Linux平台下的其他常规用户空间程序测试。这是GPL下的一个开源项目,并由包括Google,IBM,Red Hat和许多其他组织在内的许多组织使用和开发。http://autotest.github.io/

也有一些主要的GNU / Linux发行公司开发的认证系统。这些系统通常检查完整的GNU / Linux发行版是否与硬件兼容。有由Novell,Red Hat,Oracle,Canonical,Google开发的认证系统。

还有一些用于Linux内核动态分析的系统:

Kmemleak是Linux内核中包含的内存泄漏检测器。它提供了一种与跟踪垃圾收集器类似的方法来检测可能的内核内存泄漏,不同之处在于孤立对象没有被释放,而是仅通过/ sys / kernel / debug / kmemleak报告。

Kmemcheck捕获对动态分配的内存的每次读取和写入(即,使用kmalloc())。如果读取了以前未写入的内存地址,则会在内核日志中显示一条消息。也是Linux内核的一部分

故障注入框架(包含在Linux内核中)允许将错误和异常注入到应用程序的逻辑中,以实现更高的系统覆盖率和容错能力。


62

Linux内核开发人员如何在提交代码后在本地测试他们的代码?

他们是否使用某种单元测试,构建自动化?

用经典的话来说,不。

例如 Ingo Molnar正在运行以下工作负载:1.使用随机的一组配置选项构建新内核2.引导到其中3. goto 1

每个构建失败,启动失败,BUG或运行时警告都会得到处理。24/7。乘以几个盒子,就可以发现很多问题。

测试计划?

没有。

可能会有一个误解,那就是没有中央测试设施。每个人都做他想要的。


6
鉴于网站,如存在这个这个我也怀疑这个答案的有效性。
Dean Harding

3
我认为adobriyan回答的核心是“有中央测试设施,没有。” 是正确的。但是,不同的小组进行不同级别的测试,这似乎并不是完全未测试内核。
stsquad 2010年

2
我认为SUSE和RedHat除了测试自己的内核外,还经常测试vanilla。本身没有中央测试,但是仍然有测试在进行-由Linux的主要用户进行。否则,评论将保留。如果写得更少讽刺,我什至会修改它。
Dummy00001

55
Errr,你们所有人都意识到Alexey Dobriyan Linux内核开发人员吗?
ninjalj 2010年

9
作为另一个内核开发人员,我必须说这是对这个问题的最诚实的回答:内核没有经过经典意义上的测试,仅仅是因为这是不可能的。配置和硬件的组合比可用的开发人员测试时间要多。很少有人具备测试某些设备所需的技能,在某些情况下,实际上只有少数人拥有某些设备。
Ezequiel Garcia

19

树内工具

在内核中找到测试工具的好方法是:

在v4.0中,这导致我:

内核CI

https://kernelci.org/是一个旨在使内核测试更加自动化和可见的项目。

它似乎仅执行构建和启动测试(TODO如何自动测试启动正常的源代码应该在https://github.com/kernelci/)。

Linaro似乎是该项目的主要维护者,来自许多大公司的贡献:https//kernelci.org/sponsors/

利纳罗熔岩

http://www.linaro.org/initiatives/lava/看起来像一个CI系统,专注于开发板启动和Linux内核。

莉莎

https://github.com/ARM-software/lisa

不确定它的详细功能,但是它是由ARM和Apache许可的,因此可能值得一看。

演示:https//www.youtube.com/watch?v = yXZzzUEngiU

步骤调试器

并不是真正的单元测试,但是一旦测试开始失败可能会有所帮助:

我自己的QEMU + Buildroot + Python设置

我还开始了一个专注于易于开发的安装程序,但最终也向它添加了一些简单的测试功能:https : //github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782827320209644dcbaf9a6b3141724#test-this -回购

我尚未详细分析所有其他设置,它们可能做得比我更多,但是我相信我的设置非常容易快速上手,因为它具有大量的文档和自动化工具。


13

自动化内核测试不是很容易。就像adobriyan提到的那样,大多数Linux开发人员都自己进行测试。

但是,有一些事情可以帮助调试Linux内核:

  • kexec:一个系统调用,它使您可以将另一个内核放入内存并重新启动,而无需返回BIOS,如果失败,请重新启动。
  • dmesg:绝对是查找有关内核引导过程中发生的情况以及它是否有效的信息的地方。
  • 内核检测:除了printk(以及一个名为'CONFIG_PRINTK_TIME'的选项,该选项可以让您看到(以微秒为单位的精度)内核输出什么时间),内核配置还允许您打开很多跟踪器,使它们能够调试什么正在发生。

然后,开发人员通常会让其他人查看他们的补丁。一旦在本地对补丁进行了检查,并且发现它们不会干扰其他任何东西,并且对补丁进行了测试以使用Linus的最新内核而不会破坏任何东西,便将补丁推向上游。

编辑: 这是一个很好的视频,详细介绍了补丁在集成到内核之前要经历的过程。


6

除了以上/以下几点以外,它们还重点介绍了Linux内核的功能测试,硬件认证测试和性能测试。

实际上,实际上是通过脚本,静态代码分析工具,代码审查等进行了大量测试,这对于捕获错误非常有效,否则可能会破坏应用程序中的某些内容。

稀疏 –一种开源工具,旨在发现Linux内核中的错误。

Coccinelle是另一个执行匹配和转换引擎的程序,它提供了语言SmPL(语义补丁语言)来指定C代码中所需的匹配和转换。

checkpatch.pl和其他脚本 -编码样式问题可以在内核源代码树的Documentation / CodingStyle文件中找到。阅读时要记住的重要一点不是该样式在某种程度上比其他任何样式都要好,只是它是一致的。这有助于开发人员轻松找到并解决编码风格问题,内核源代码树中的脚本scripts / checkpatch.pl已经开发出来。该脚本可以轻松指出问题,并且应始终由开发人员在其更改时运行,而不是让审阅者稍后再指出问题来浪费时间。


3

我可以想象他们使用虚拟化来进行快速测试,例如QEMU,VirtualBox或Xen,以及一些脚本来执行配置和自动化测试。

可以通过尝试许多随机配置或一些特定的配置(如果它们正在处理特定的问题)来完成自动测试。Linux有很多底层工具(例如dmesg)来监视和记录来自内核的调试数据,因此我想也可以使用它。


你绝对是对的。当我进行内核模块开发时,我严重依赖VirtualBox + KGDB来逐行跟踪内核执行情况。是的,gdb看到整个内核逐行执行确实很棒。与著名内核开发人员Valerie Aurora相同,例如: youtube.com/watch?v=Tach2CheAc8。在视频中,您可以看到她如何使用UserModeLinux虚拟化来逐步完成内核。
Peter Teoh


1

据我所知,有一个自动性能回归检查工具(名为lkp / 0天)由英特尔运行/提供资金,它将测试发送到邮件列表的每个有效补丁,并检查从不同的基准测试(例如hackbench)更改的分数,fio,unixbench,netperf等,一旦性能下降/提高,相应的报告将直接发送到补丁作者和Cc相关维护者。



0

adobriyan提到了Ingo的随机配置构建测试循环。0天测试机器人(又名kbuild测试机器人)现在已经涵盖了这一点。此处提供了有关基础架构的不错的文章:内核构建/启动测试

进行此设置的想法是,尽快通知开发人员,以便他们可以尽快纠正错误。(在某些情况下,在补丁进入Linus的树之前,因为kbuild基础架构还针对维护者的子系统树进行了测试)


0

我已经完成了Linux内核的编译,并对使用Linux版本3的android(Marshmallow和Nougat)进行了一些修改。我在linux系统中对其进行了交叉编译,手动调试了错误,然后在Android中运行其启动映像文件,并检查是否它是否有漏洞。如果运行良好,则表示它已根据系统要求进行了完美编译。
对于MotoG内核编译

注意: -Linux内核将根据要求而变化,具体取决于系统硬件


0

一旦贡献者提交了补丁文件并提出了合并请求,Linux网守就会通过集成并查看补丁来检查补丁。一旦成功,他们会将补丁合并到相关分支中并发布新版本。Linux测试项目(https://github.com/linux-test-project/ltp)是提供测试场景(测试用例)的主要资源,这些场景可以在应用补丁后针对内核运行。这可能需要2到4个小时左右,具体时间视情况而定。请注意有关“选定”内核的文件系统将要进行测试的信息。Ex:Ext4针对EXT3生成不同的结果,依此类推。

内核测试过程。

  1. 从资源库获取最新的内核源。(https://www.kernel.org/或Github.com)
  2. 应用补丁文件(使用差异工具)
  3. 构建新内核。
  4. 根据LTP中的测试过程进行测试(https://github.com/linux-test-project/ltp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.