训练营学员

傲来操作系统训练营报告

StratoVirt & hypervisor 于ARM平台上的测试

HYF 发布于 # 2024 年第一期

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 NameStatusRun Details
balloon_test2 passed; 13 failedeline366 ; Failed to open /dev/kvm: Error(13)
block_test0 passed; 21 failedeline366 ; Failed to open /dev/kvm: Error(13)
fwcfg_test0 passed; 15 failedeline366 ; Failed to open /dev/kvm: Error(13)
memory_test0 passed; 14 failedeline366 ; Failed to open /dev/kvm: Error(13)
net_test0 passed; 14 failedeA
pci_test0 passed; 40 failedeline366 ; Failed to open /dev/kvm: Error(13)
pvpanic_test0 passed; 3 failedeline366; Failed to open /dev/kvm: Error(13)
rng_test0 passed; 5 failedeline366 ; Failed to open /dev/kvm: Error(13)
scream_test0 passed; 4 failedeline366 ; Failed to open /dev/kvm: Error(13)
scsi_test0 passed; 14 failedeline 116
serial_test0 passed; 7 failedeline366 ; Failed to open /dev/kvm: Error(13)
usb_camera_test0 passed; 8 failedeline366; 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_test0 passed; 15 failedeline366 ; Permission denied (os error 13) Failed to open log file /var/log/mst.log
usb_test0 passed; 43 failedeline366 ; Permission denied (os error 13) Failed to open log file /var/log/mst.log
virtio_gpu_test0 passed; 12 failedeline366
virtio_test0 passed; 28 failedeline366 ; Failed to open /dev/kvm: Error(13)
virtiofs_test0 passed; 25 failedeB
vnc_test0 passed; 9 failedeline366 ; 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测试过程中出现未知原因导致了服务器网络故障,故后续测试没有进行下去。