diff --git a/src/content/posts/2024-01/StratoVirt&hypervisor_test_arm.md b/src/content/posts/2024-01/StratoVirt&hypervisor_test_arm.md new file mode 100644 index 0000000000000000000000000000000000000000..88646b918296e74995ad0e85467eca36158ac3c1 --- /dev/null +++ b/src/content/posts/2024-01/StratoVirt&hypervisor_test_arm.md @@ -0,0 +1,112 @@ +# StratoVirt&hypervisor于ARM平台上的测试 +StratoVirt是计算产业中面向云数据中心的企业级虚拟化平台,实现了一套架构统一支持虚拟机、容器、Serverless三种场景。 StratoVirt在轻量低噪、软硬协同、Rust语言级安全等方面具备关键技术竞争优势。 + +StratoVirt预留了接口和设计来支持更多特性,同时支持标准虚拟化和轻量级虚拟化,也预留了对新型异构设备扩展支持能力。 +## StratoVirt构建 +运行命令`git clone https://github.com/openeuler-mirror/stratovirt`将StratoVirt克隆到本地,参考[StratoVirt快速开始](https://github.com/openeuler-mirror/stratovirt/blob/master/docs/quickstart.md)构建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](https://github.com/openeuler-mirror/stratovirt/blob/master/docs/boot.md)创建内核和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 = +VM_PASSWORD = +... +[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测试过程中出现未知原因导致了服务器网络故障,故后续测试没有进行下去。 \ No newline at end of file