Linux内核测试三部曲

发表于:2008-6-30 13:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

        通常,有多种测试linux内核的方法,但我们只关注下面这4种:

1. 在平时的工作中使用内核的测试版本.

2. 在新内核上运行专用的测试套件,比如LTP.

3. 新内核安装后,做些非常规的事情.

4. 新内核安装后,测试系统的性能.

        当然,测试过程它们可以混合运用,所以可以认为它们是测试过程的不同阶段。


阶段一:内核的冒烟测试

        内核测试的第一阶段很简单:我们尝试着启动内核,然后把它用在平时的工作中。

        • 在以全功能配置启动系统之前,推荐先用init=/bin/bash命令行参数来启动内核。它使得内核只启动一个bash进程。这样,你可以检查在最小配置下是否能正常挂载和卸载文件系统,然后,你可以测试一些更加复杂的内核功能,比如挂起到disk或RAM的缓冲。这种情况下,唯一被挂载了的模块是位于initrd映象中的那些模块。提到 了initrd映象。通常,你可以参考你的boot loader文档来获取更多关于手工向内核传递命令行的信息(我们的观点是,如果使用的是GRUB,会更容易操作些。)

        • 接着,建议以runlevel 2来启动系统(通常,是通过把数字2作为命令行参数传递给内核),这时,网络服务器和X服务器还没启动(你的系统有可能为这个用途使用的是另一个runlevel,尽管不大可能,所以你应该查看/etc/inittab文件确认一下)。在这个配置下,你可以检查网络接口是否能工作,你还可以尝试手工启动X服务器来确认它不会崩溃掉。

        • 最后,根据需要,你可以把系统启动到runlevel 5(也就是全功能)或者3(也就是除了X,全功能开启)
        现在,你已经可以按平时的样子使用系统一段时间了。但是,如果想快点测试内核,你可以执行一些典型的操作,比如下载一些文件,读取邮件,浏览一些站点,抓取一些音轨(我们假设,使用的是合法买来的音频CD),刻录一张CD或DVD等等操作来连续地检查是否有任何一项会出错。出错的话,就意味着内核有问题存在了 。

阶段二(自动测试)

        测试的下一阶段是,使用专门设计的程序来检查特定的内核子系统能否正常工作。我们还执行内核的退化以及性能测试。后者对于内核开发员(还有我们)来说,相当地重要,因为它使得我们能识别出损害性能的改变。比如,如果我们把内核从2.6.x-rc1升级到2.6.x-rc2后,有种文件系统的性能却降低了10%,查找导致这种情况发生的补丁无疑是个好主意。

        关于内核的自动测试,我们推荐你使用AutoTest 套件(http://test.kernel.org/autotest/)。该套件包含了很多测试应用程序以及统计工具,而且相当简单的用户界面。

        为了安装AutoTest你以root帐户可以进入到/usr/local 目录并运行

# svn checkout svn://test.kernel.org/autotest/trunk autotest

        虽然通常不推荐以root帐户运行类似命令,但这个命令应该是安全的,除非你不信任你的DNS服务器,因为它只是下载一些文件,并保存到/usr/local下。除此之外,你还得以root帐户运行AutoTest,因为它的一些测试要求超级用户权限才能完成。所以,你不应该在生产系统上使用AutoTest:在极端情况下,保存在进行特权级测试的系统中的数据可能会受到损坏甚至毁坏,我们相信你不喜欢你的产品数据会发生这种情况。
        根据设计,AutoTest是非交互式性的,所以一旦启动,你就不需要再关心它了(当然了,如果有坏事真的发生了,你就要不得不恢复系统了,但这是另外一个话题)。要启动测试,你可以到/usr/local/autotest/client目录下 (我们假设AutoTest被安装到了/usr/local下),然后以root身份执行:

# bin/autotest tests/test_name/control

        这里,test_name是位于目录/usr/local/autotest/client/tests中的目录名称,该目录中含有你想要进行的测试。控制文件tests/test_name/control包含了为AutoTest准备的指令。最简单的情况下,只需要一个这样的指令,也就是:

job.run_test(’test_name’)

        这里,test_name是包含控制文件的目录名称。更加复杂的控制文件的内容可能类似下面:

job.run_test(’pktgen’, ’eth0’, 50000, 0, tag=’clone_skb_off’)
job.run_test(’pktgen’, ’eth0’, 50000, 1, tag=’clone_skb_on’)

        这里,测试名称后面的字符串表示的是应当要传递到测试程序的参数。你可以修改这些参数,但是首先要阅读测试程序的文档以及脚本tests/test_name/test_name.py(比如tests/pktgen/pktgen.py)。实际上AutoTest就是使用该脚本来启动测试的(可能你已经注意到,
        AutoTest脚本是用Python语言写的)。脚本sts/test_name/test_name.py的执行结果保存在目录results/default/test_name/中,该目录中的status文件包含着标识测试是否已经成功完成的信息。想取消正在进行的测试,按Ctrl+C即可。
        如果你想连续运行一串测试,最好的做法是准备单独一个文件,该文件中包含着多个AutoTest的指令。这个文件中的指令和上面提到的控制文件中的指令类似。比如,文件samples/all_tests包含有运行所有可以测试指令,其中前五行如下

job.run_test(’aiostress’)
job.run_test(’bonnie’)
job.run_test(’dbench’)
job.run_test(’fio’)
job.run_test(’fsx’)

        要运行这个文件中的指令所请求的全部测试,你可以做使用命令bin/autotest samples/all_tests。但是要记得这要花很长的时间才能完成。类似地,要运行定制的一串测试,得把为AutoTest准备的指令们放到一个文件里面,然后给这个文件起个名称,这个名称将作为命令行的一个参数传递给autotest.要并行地运行几个测试,你得准备一个特殊的控制文件,这个控制文件包含的指令如下:

def kernbench():
job.run_test(’kernbench’, 2, 5)
def dbench():
job.run_test(’dbench’)
job.parallel([kernbench], [dbench])

        在测试执行的过程序中,在任何时间里,你都可以通过按Ctrl+C来停止它们。
        为了造福那些不喜欢命令行和配置文件的朋友,ATCC (AutoTest Control Center )已经被发明出来了。如果你运行它,比如通过命令ui/menu,将会得到一个用菜单驱动的简单界面,你可以通过界面选择测试和profiling工具,浏览测试结果,还可以通过它来限制范围,配置它们。
        如果你厌烦了AutoTest套件中包含的一系列工具,可以访问站点http://ltp.sourceforge.net/tooltable.php。该站点有可以用于linux内核测试的全面的工具清单。

阶段三 容错性测试

        你的新内核已经通过了测试的前两个阶段了吗?现在,可以开始实验了。那就是,做一些任何一个正常人在普通工作中都不会做的蠢事,因为没人会知道那些蠢事会导致内核崩溃。那到底需要做些什么事呢?好的,如果存在一个“标准的”程序的话,那它当然早就被包含在一些测试套件中了。

        例如,第三阶段可以从拔掉和重插USB设备开始。从理论上讲,重插一个USB设置不应该会产生任何事情,至少从用户的角度看来。如果USB子系统存在bug,连续进行很多次这样的测试就可能会导致内核崩溃(这个测试如果出现问题,说明了之前未曾有人在类似系统配置下尝试这个测试)。
        接下来,你可以编写一个脚本,连续读取/proc目录中文件的内容,等等。一句话,在这阶段,你应该做些普通用户永远不会做的事(或者极常少做:为什么有人会不断重复地挂载和卸载某个文件系统呢?)

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号