StratoVirt & hypervisor 于ARM平台上的测试
StratoVirt&hypervisor于ARM平台上的测试
StratoVirt是计算产业中面向云数据中心的企业级虚拟化平台,实现了一套架构统一支持虚拟机、容器、Serverless三种场景。 StratoVirt在轻量低噪、软硬协同、Rust语言级安全等方面具备关键技术竞争优势。
StratoVirt预留了接口和设计来支持更多特性,同时支持标准虚拟化和轻量级虚拟化,也预留了对新型异构设备扩展支持能力。
StratoVirt构建
运行命令git clone https://github.com/openeuler-mirror/stratovirt
将StratoVirt克隆到本地,参考StratoVirt快速开始构建StratoVirt。
git clone https://gitee.com/openeuler/stratovirt.git
cd stratovirt
make build
StratoVirt测试
StratoVirt由Rust语言编写,通过Rust的包管理工具Cargo对项目进行测试。命令curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装Rust。测试时使用的Rust版本位1.79.0,测试分为Mod test和hydropper test。
Mod test
在Mod test之前,可通过cargo test --workspace --exclude mod_test -- --nocapture --test-threads=1
执行Unit test,用于验证非测试代码是否按预期方式运行。按如下方式运行StratoVirt单元测试。
StratoVirt mod测试是一种综合测试方法。在测试过程中,StratoVirt进程将作为服务器启动,并通过套接字和QMP进行通信,以测试StratoVirt模块的功能。
在运行mod测试之前,需要首先编译stratovirt和virtiofsd,然后导出环境变量stratovirt_BINARY和virtiofsd_BINARY。
构建virtiofsd:
git clone https://gitlab.com/virtio-fs/virtiofsd.git
cd virtiofsd
cargo build --release
设置环境变量STRATOVIRT_BINARY和VIRTIOFSD_BINARY:
export STRATOVIRT_BINARY="/path/to/stratovirt"
export VIRTIOFSD_BINARY="/path/to/virtiofsd"
运行Mod test:cargo test --all-features -p mod_test -- --nocapture --test-threads=1
hypervisor test
首先构建相关的依赖:
yum install nmap
yum install iperf3
yum install bridge-utils
通常,必须为测试用例配置内核和rootfs镜像。可参考boot_guide创建内核和rootfs镜像,也可通过以下的shell脚本获取内核二进制和rootfs镜像:
arch=`uname -m`
dest_kernel="vmlinux.bin"
dest_rootfs="rootfs.ext4"
image_bucket_url="https://repo.openeuler.org/openEuler-22.03-LTS/stratovirt_img"
if [ ${arch} = "x86_64" ] || [ ${arch} = "aarch64" ]; then
kernel="${image_bucket_url}/${arch}/vmlinux.bin"
rootfs="${image_bucket_url}/${arch}/openEuler-22.03-LTS-stratovirt-${arch}.img.xz"
else
echo "Cannot run StratoVirt on ${arch} architecture!"
exit 1
fi
echo "Downloading $kernel..."
wget ${kernel} -O ${dest_kernel} --no-check-certificate
echo "Downloading $rootfs..."
wget ${rootfs} -O ${dest_rootfs}.xz --no-check-certificate
xz -d ${dest_rootfs}.xz
echo "kernel file: ${dest_kernel} and rootfs image: ${dest_rootfs} download over."
获取镜像后在config/config.ini中设置参数和相应的路径。
设置镜像路径:
[env.params]
...
VM_USERNAME = <usrname>
VM_PASSWORD = <passwd>
...
[stratovirt.params]
...
STRATOVIRT_VMLINUX = /path/to/kernel
STRATOVIRT_ROOTFS = /path/to/rootfs
...
配置网络在“config.ini”文件中配置IP_PREFIX和IP_3RD,它们指示VM IPv4地址的前24位,最后8位由Hydroper自动配置。其中虚拟机和主机必须位于同一网段中:
[network.params]
# such as 'IP_PREFIX.xxx.xxx'
IP_PREFIX = 1.1
# such as 'xxx.xxx.IP_3RD.xxx'
IP_3RD = 1
通过pytest
命令执行测试。
测试结果
Mod test测试结果如下:
Test Name | Status | Run Details |
---|---|---|
balloon_test | 2 passed; 13 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
block_test | 0 passed; 21 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
fwcfg_test | 0 passed; 15 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
memory_test | 0 passed; 14 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
net_test | 0 passed; 14 failed | eA |
pci_test | 0 passed; 40 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
pvpanic_test | 0 passed; 3 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
rng_test | 0 passed; 5 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
scream_test | 0 passed; 4 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
scsi_test | 0 passed; 14 failed | eline 116 |
serial_test | 0 passed; 7 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
usb_camera_test | 0 passed; 8 failed | eline366 ; Found argument ‘-cameradev’ which wasn’t expected, or isn’t valid in the context. ; Failed to open log file /var/log/mst.log |
usb_storage_test | 0 passed; 15 failed | eline366 ; Permission denied (os error 13) Failed to open log file /var/log/mst.log |
usb_test | 0 passed; 43 failed | eline366 ; Permission denied (os error 13) Failed to open log file /var/log/mst.log |
virtio_gpu_test | 0 passed; 12 failed | eline366 |
virtio_test | 0 passed; 28 failed | eline366 ; Failed to open /dev/kvm: Error(13) |
virtiofs_test | 0 passed; 25 failed | eB |
vnc_test | 0 passed; 9 failed | eline366 ; Found argument ‘-vnc’ which wasn’t expected, or isn’t valid in the context. |
测试大多失败了,经分析失败原因为权限不足。由于StratoVirt的Mod test会频繁访问/dev/kvm,需要root权限支持,尝试了sudo setfacl -m u:${USER}:rw /dev/kvm
命令,但不知为何仅允许用户单次访问,故测试无法进行下去。
hypervisor测试过程中出现未知原因导致了服务器网络故障,故后续测试没有进行下去。