Linux内核是如何测试的?

时间:2010-07-05 05:15:41

标签: linux linux-kernel

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

13 个答案:

答案 0 :(得分:69)

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

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

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

正如Dean指出的那样,还有一些自动化测试,linux test projectkernel autotestgood overview)。

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

在很大程度上取决于内核的哪个区域正在被更改 - 您为新网络驱动程序所做的测试与更换核心调度算法时所做的测试完全不同。

答案 1 :(得分:65)

当然,内核本身及其部件在发布之前进行了测试,但这些测试仅涵盖基本功能。有一些测试系统可以执行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内核中)允许将错误和异常注入应用程序的逻辑中,以实现更高的系统覆盖率和容错能力。

答案 2 :(得分:56)

  

Linux内核开发人员如何在本地测试代码并在提交后对其进行测试?

     

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

在经典意义上,没有。

电子。 G。 Ingo Molnar正在运行以下工作负载: 1.使用随机的配置选项集构建新内核 2.启动它 3.转到1

处理每个构建失败,引导失败,BUG或运行时警告。 24/7。 乘以几个方框,可以发现很多问题。

  

测试计划?

没有

可能存在误解,即存在中央测试设施,没有。 每个人都做他想做的事。

答案 3 :(得分:14)

树内工具

在内核中查找测试工具的一个好方法是:

在v4.0中,这导致我:

内核CI

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

它似乎只进行构建和启动测试(TODO如何自动测试启动工作源应该在https://github.com/kernelci/)。

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

Linaro Lava

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

ARM LISA

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-repo

我还没有详细分析所有其他设置,而且它们可能比我的更多,但我相信我的设置很容易快速入门,因为它有很多文档和自动化

答案 4 :(得分:13)

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

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

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

然后,开发人员通常会让其他人审核他们的补丁。一旦修补程序在本地进行审查并且看起来不会干扰其他任何内容,并且测试补丁程序以使用Linus的最新内核而不会破坏任何内容,则补丁程序将被推送到上游。

编辑: Here's a nice video详细说明补丁在集成到内核之前经过的过程。

答案 5 :(得分:6)

除了上/下点之外,还强调了Linux内核的功能测试,硬件认证测试和性能测试。

实际上经历了很多测试,实际上是脚本,静态代码分析工具,代码审查等,它们在捕获错误方面非常有效,否则会破坏应用程序中的某些内容。

Sparse - 一个开源工具,旨在查找Linux内核中的错误。

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

checkpatch.pl and other scripts - 编码样式问题可以在内核源代码树的Documentation / CodingStyle文件中找到。阅读它时要记住的重要事情并不是这种风格在某种程度上比任何其他风格更好,只是它是一致的。这有助于开发人员轻松查找和修复编码样式问题,内核源代码树中的脚本scripts / checkpatch.pl已经开发完成。这个脚本可以很容易地指出问题,并且应该始终由开发人员对他们的更改进行操作,而不是让审阅者通过稍后指出问题来浪费他们的时间。

答案 6 :(得分:3)

还有:

MMTests ,它是分析结果的基准和脚本的集合

https://github.com/gormanm/mmtests

Trinity 这是Linux系统调用模糊测试器

http://codemonkey.org.uk/projects/trinity/

此外,sourceforge上的 LTP 页面已经过时,项目已移至GitHub https://github.com/linux-test-project/ltp

答案 7 :(得分:2)

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:0)

LTP和Memtests通常是首选工具。

答案 10 :(得分:0)

adobriyan提到了Ingo的随机配置构建测试循环。现在,0天测试机器人(又名kbuild测试机器人)已经涵盖了这一点。这里有一篇关于基础设施的好文章:Kernel Build/boot testing

这种设置背后的想法是尽快通知开发人员,以便他们能够尽快纠正错误。 (在某些情况下补丁进入Linus树之前,因为kbuild基础设施也会对维护者的子系统树进行测试)

答案 11 :(得分:0)

我已经完成了linux内核编译并为android(Marshmallow和Nougat)做了一些修改,其中我使用的是linux版本3.我在linux系统中交叉编译它,手动调试错误然后在Android中运行它的启动映像文件并检查它是否进入环孔。如果运行完美则意味着它可以根据系统要求进行完美编译 For MotoG kernel Compilation

注意: - Linux内核将根据依赖于系统硬件的要求进行更改

答案 12 :(得分:0)

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

内核测试过程。

  1. 从存储库中获取最新的内核源。(https://www.kernel.org/或Github.com)
  2. 应用补丁文件(使用Diff工具)
  3. 构建新内核。
  4. 根据LTP(https://github.com/linux-test-project/ltp)中的测试过程进行测试