Autotest 是一套开源的完全自动化的测试框架。主要应用于 Linux 内核测试,其内部包含了对 KVM 的自动化测试。 Autotest 系统架构如图所示,通过 Web 前端或者命令行工具提交测试任务, Autotest Server 通过调度器将任务分发到不同的 Client , Client 端任务执行完之后,再将结果返回到结果分析后端, Web 前端与命令行接口即可查看测试结果。
请参考其官方主页(注:由于autotest主页改版,下面的链接可能失效了)。
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 ,则该选项必须要修改。
HOST 端按照以下链接的说明,需要安装 qemu-kvm 、 genisoimage 等(一般情况下 HOST 上已经安装好这些软件)。
http://autotest.kernel.org/wiki/KVMAutotest/InstallPrerequesitePackagesClient
要作为 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 配置是否正确。
用于打压力的 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 。
Windows 与 linux 的 guest image 都有如下需求:
1) 与集群中机器可以相互 socket connect ( 防火墙配置 )
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
winutil.iso 中 setuprss.exe 的自启动。
并且根据具体测试用例的要求,需要配置好 iometer/jmeter 等的环境。
总的来说,集群里的所有机器(包括虚拟机)要保证:
1) 从 Autotest server 到其他机器(包括 linux 虚拟机)的无密码的 SSH 。
2) 保证可以相互 socket connect ( host 与 guest 的防火墙配置)
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 两种方式。
在浏览器中访问: 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/
可以参照 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 。
2 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 指定为不同的镜像。
3 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