KVM稳定性测试平台——autotest

Autotest 是一套开源的完全自动化的测试框架。主要应用于 Linux 内核测试,其内部包含了对 KVM 的自动化测试。 Autotest 系统架构如图所示,通过 Web 前端或者命令行工具提交测试任务, Autotest Server 通过调度器将任务分发到不同的 Client Client 端任务执行完之后,再将结果返回到结果分析后端, Web 前端与命令行接口即可查看测试结果。

请参考其官方主页(注:由于autotest主页改版,下面的链接可能失效了)。

 

 

1.1 Autotest Server 安装

1)         必要软件

Server 安装过程按照以下链接的说明。

http://www.linux-kvm.org/page/KVM-Autotest/Server_Install

 

注意:必须要以 autotest 帐户安装 server

而且从 /usr/local/autotest/utils/test_importer.py –A 导入 autotest 目录下的用例后 ,从

http://your_ip/afe 界面上 Admin interface->Tests 下面可以看到刚刚导入的用例。

2)         配置 DHCP server ( 或者在同网段的其他机器上搭建 dhcp server)

yum install dhcpd

vim /etc/dhcp/dhcpd.conf

 

   # DHCP Server Configuration file.

   #   see /usr/share/doc/dhcp*/dhcpd.conf.sample

   #   see 'man 5 dhcpd.conf'

   #

   ddns-update-style interim;

   ignore client-updates;

   allow bootp;

      subnet 180.96.41.0 netmask 255.255.255.0 {

         option routers                  180.96.41.1; # default gateway

         option subnet-mask              255.255.255.0;

         option domain-name              "";

         option domain-name-servers      180.96.41.16;

         option netbios-name-servers     180.96.41.16; #WINS Server       

         default-lease-time              43200;

         max-lease-time                  86400;

         option time-offset              -18000; # Eastern Standard Time

 

         range dynamic-bootp 180.96.41.100 180.96.41.160;  #DHCP Range to assign

         host h1 {

           hardware ethernet 04:93:94:95:96:01;

           fixed-address 180.96.41.161;

         }

         host h2 {

           hardware ethernet 04:93:94:95:96:02;

           fixed-address 180.96.41.162;

         }

                   ……

}

service dhcpd restart

chkconfig --levels 345 dhcpd on

autotest 是通过 tcpdump dhcp 广播来发现虚拟机的 IP 的,并且 autotest 中有一部分测试 ( 例如 remote netperf/jmeter) 都需要在 dhcpd.conf 文件中配置固定 mac 对应固定的 IP fixed-address )。

 

3)         另修改配置文件 global_config.ini

[AUTOSERV]

client_autodir_paths: /usr/local/client_autotest,/home/autotest

host autotest 的安装目录修改,使之区别于 server autotest 的安装目录。如果 server 同时配置为 host ,则该选项必须要修改。

1.2 Autotest Host 安装

1.2.1 必要软件

HOST 端按照以下链接的说明,需要安装 qemu-kvm genisoimage 等(一般情况下 HOST 上已经安装好这些软件)。

http://autotest.kernel.org/wiki/KVMAutotest/InstallPrerequesitePackagesClient

1.2.2 无密码 SSH

要作为 autotest host ,需要建立从 autotest server host 之间无密码的 SSH ,大部分测试用例需要 HOST 上的 root 帐户才能执行,所以必须直接登录到 root@host_name

root@autotest_server      --- à root@host_name

autotest@autotest_server   --- à root@host_name

 

Ø  配置第一个 HOST

autotest server 上,分别用 root 帐户和 autotest 用户分别执行以下两条命令:

ssh-keygen -t rsa   

注意 ssh-keygen -t rsa 命令,只执行一次。后续新添加的 host ,再配置无密码的 SSH 时,不需要重复执行这条命令。

Then, still on the server, copy it to the host:

ssh-copy-id root@host_name

 

如果 root 帐户不能直接登录,则可以先借用其他帐户:

ssh-copy-id sdgadmin@host_name

cat /home/sdgadmin/.ssh/authorized_keys >> /root/.ssh/authorized_keys

 

验证是否配置成功: ssh -p 58422 [email protected]

如果还是需要输入密码,则需要检查 host_name 上面的 /etc/ssh/sshd_config ,再重新尝试:

PermitRootLogin yes

StrictModes no

ChallengeResponseAuthentication no

UseDNS no

#AllowGroups sshers (注释掉)

 

Ø  配置后续 HOST

Autotest 集群里的其他 host ,例如 host2, 可以简单地把已配置好的 host1 上的 /root/.ssh/authorized_keys 追加到自己的 /root/.ssh/authorized_keys 。同时注意修改本机上 /etc/ssh/sshd_config 配置是否正确。

 

1.2.3 应用软件(打压力机)

用于打压力的 host 还需要安装 jmeter 运行的环境。

Jmeter 的运行需要 JDK 的支持,需要安装 JDK 环境:

yum install java-1.6.0-openjdk-devel.x86_64

  同时需要监控异常情况发邮件通知,安装 sendmail:

   yum install sendmail

    service sendmail start

service sendmail status

如果 sendmail 状态异常,有可能是默认的 SMTP 25 号端口已被占用,修改 vim /etc/mail/sendmail.cf

O DaemonPortOptions =Name=MTA

O DaemonPortOptions=Port=2025

1.2.4 autotest server 配置成 host (不推荐)

如果机器紧张,也可以将 autotest server 配置成 host 此时需要建立从 server root@server 的无密码的 SSH

1.3 Guest image 配置

Windows linux guest image 都有如下需求:

1)         与集群中机器可以相互 socket connect ( 防火墙配置 )

1.3.1 Linux guest image 配置

1)         防火墙配置允许集群内机器互连。如果需要关闭防火墙,对于 linux:

service iptables stop

chkconfig –del iptables

2)         配置从 server guest 的无密码的 SSH (这只有 linux netperf remote 这个用例有需要)。

3)         Linux image: 配置启动时删除文件 /etc/udev/rules.d/70-persistenct-net.rules

/etc/rc.d/rc.local 中加入一行:

rm –f /etc/udev/rules.d/70-persistenct-net.rules

4)         Linux: 配置 serial console login

a)       VM 启动后,检查系统是否支持 serial:

dmesg | grep tty

当显示出 /dev/ttyS0 /dev/ttyS1. 时说明系统支持 serial

b)       修改 /boot/grub/grub.conf, kernel 后面添加参数:

console=tty0  console=ttyS0,9600n8 

c)    修改 /etc/ inittab , 添加:

s0 2345:respawn:/sbin/agetty -h -t 60 ttyS0 9600 vt102  

d)       配置可以以 root 身份登录串口终端: 修改 /etc/securetty ,添加

ttyS0

1.3.2 Windows guest image 配置

winutil.iso setuprss.exe 的自启动。

并且根据具体测试用例的要求,需要配置好 iometer/jmeter 等的环境。

 

总的来说,集群里的所有机器(包括虚拟机)要保证:

1)    Autotest server 到其他机器(包括 linux 虚拟机)的无密码的 SSH

2)    保证可以相互 socket connect host guest 的防火墙配置)

1.4 简单使用

1.4.1 Get started

cd <autotest_root>/client/tests/kvm

./get_started.py

该脚本按照 cfg.sample 生成 cfg 文件,并下载测试 KVM 所需的 guest os ISO 。由于我们是自己提供 image ,所以不需要 guest os ISO 所以第一次运行该脚本,出现 (y/n) 时,可以一致选 n ,但 winutil.iso 必须选 y 所有的 image iso 建议放在 autotest 目录之外,否则任务执行时远程拷贝的量太大 !

这是因为 winutil.iso 中包括了测试 windows 所需的套件(如 rss.exe, autoit 等),这个必须要下载。其默认安装路径: /tmp/kvm_autotest_root/isos/windows/winutils.iso

winutil.iso guest os 中加载后,双击 setuprss.exe 安装这些套件( 配置开机自启动 )。

 

Autotest 用例是通过 control 文件来执行, control 文件分为两种:

Ø  Client control ,只需要由一台 host 执行的任务。这种任务可以有两种方式执行,例如:

/usr/local/autotest/client/bin/autotest   path_to_client_control

或者

/usr/local/autotest/server/autoserv -m [email protected]:58422   -c path_to_client_control

Ø  Server control, 一般文件扩展名是 .srv 。是需要由两台或两台以上的 host 执行的任务。这种任务必须要通过 autoserv 执行,例如:

/usr/local/autotest/server/autoserv -m [email protected]:58422 , [email protected]:58422 -r ./results   -s ../server/tests/netperf2/control.srv

 

使用 bin/autotest 或者 autoserv 来执行任务,其执行结果不会记录到数据库中,也不维护 HOST 的状态,这两种方式一般作为调试时使用。而 web frontend ,以及 CLI 这两种方式对 autoserv 以及 bin/autotest 进行了包装,将每个 job 的执行状态以及结果记录到 DB 中。

所以,正式执行测试任务时,推荐使用以下的 web frontend 以及 cli 两种方式。

1.4.2 使用 web frontend

在浏览器中访问: http://180.96.41.19/afe

Ø  创建 host 。注意 host 名必须是可 SSH 的名字 ,如 [email protected]:58422.

在页面上点击“ Admin interface -> “ HOSTS ” -> ”ADD

可以设置 host 的标签,分组。

Ø  创建并提交测试任务:

进入主页面: Go to Frontend à CreateJob

按要求填写各项后,然后 Submit Job

如果未设置 reboot_before reboot_after ,默认会在 job 开始前以及结束后,重启该 host

Ø  查看 JOB 结果

Job List 选中相应的 JOB ,进入 View Job ,查看:

所有 WEB 提交的 JOB 存放结果的目录位于: autotest/results/

1.4.3 使用 CLI

可以参照 http://autotest.kernel.org/wiki/CLIHowTo

cd /usr/local/autotest/cli/

Ø  创建 host ,注意 host 名必须是可 SSH 的名字,如 [email protected]:58422.

./attest host create [email protected]:58422 -w http://180.96.41.19

Ø  创建并提交测试任务:

./atest job create -m [email protected]:58422 -f ../client/tests/sleeptest/control --reboot_before=never --reboot_after=never -g -v -w http://180.96.41.19 yupiwang

如果未设置 reboot_before reboot_after ,默认会在 job 开始前以及结束后,重启该 host

KVM 配置修改

KVM 的自动化测试目录在 client/tests/kvm 目录下,针对虚机的测试配置,包括 base.cfg subtest.cfg guest-os.cfg tests.cfg 等配置文件(这些配置文件由 get_started.py 根据 samples.cfg 生成)。

 

Ø  base.cfg 负责虚机的通用的基本配置,包括 name mem image nic 等信息。内部主要需要修改的项包括 bridge, vms, main_vm

qemu_binary = /usr/libexec/qemu-kvm

qemu_img_binary = /usr/bin/qemu-img

Ø  guest-os.cfg 负责针对各操作系统的特有的参数,内部主要需要修改的项是:

修改 windows winutils.iso 的实际路径 :

Ø  subtest.cfg 负责 KVM 虚机各个子测试用例的相关参数。这个根据测试用例的需求作相应的修改,比如 netperf 的测试时长、测试类型等。

Ø  tests.cfg 为一个总括的测试配置,其最终决定了该测试跑什么测试用例、测试用例的顺序。

 

 

其中,配置文件的格式参见:

http://www.linux-kvm.org/page/KVM-Autotest/Test_Config_File

并且,在 KVM 目录下,使用以下命令可以查看 tests.cfg 描述的测试用例中的 key-value 集合是否和预期一致:

../../common_lib/cartesian_config.py tests.cfg

../../common_lib/cartesian_config.py -c tests.cfg

../../common_lib/cartesian_config.py --verbose /path/to/cfgfile

 

在修改配置时,必须要注意的是,如果同时跑在集群内多个任务,必须要把 nic_mac 指定为不同的值,以获取不同的 IP 地址。同时,如果一个 host 上同时跑多个任务创建多个 VM ,还需要把各任务的 image_name 指定为不同的镜像。

 

 

KVM 测试用例的添加

KVM 的测试用例目录为 client/virt/tests client/tests/kvm/tests ,前者为 autotest 为虚拟机提供的通用测试用例,后者为专为 kvm 应用。

需要多机协调进行的,需要放到 server/tests 目录下,只需要单机完成的,放到 client/tests 目录下。

测试用例的添加具体细节同时可以参考:

http://autotest.kernel.org/wiki/KVMAutotest/WritingNewTests

http://autotest.kernel.org/wiki/ControlHowto

http://autotest.kernel.org/wiki/ServerControlHowto

http://autotest.kernel.org/wiki/Autoserv

 

写好对应的 control 以及相应脚本后,使用以下命令重新向 WEB 导入用例:

/usr/local/autotest/utils/test_importer.py -c

/usr/local/autotest/utils/test_importer.py

 

 

猜你喜欢

转载自crystalrain0.iteye.com/blog/1499823