Linux 内核自检是用于执行 Linux 内核中各个代码路径的小型测试。KVM 自检是其中至关重要的一个子集,用于验证 KVM 虚拟化功能。它们直接与 KVM API 交互,无需 QEMU 即可创建虚拟机。
除了“ tools/testing/selftests/kvm ”目录下的默认 KVM 自检之外,用户还可以利用 KVM 自检中的 API 创建额外的自定义测试,用于模拟和重现 KVM 错误,即KVM SMM 问题和vCPU 热插拔期间的 kvmclock 漂移。
默认情况下,KVM 自测试构建为动态二进制文件,依赖于在运行时加载到内存中的外部库。在本篇博客文章中,我们将演示如何在 Oracle 云基础设施 (OCI) 虚拟机上的 Oracle Linux 8 上将 KVM 自测试构建为静态二进制文件。我们还将演示如何将使用某个版本的 glibc 构建的静态二进制文件在包含旧版本 glibc 的环境中执行。
步骤 1.创建 OCI VM
出于本文的目的,我们在 OCI 中使用具有VM.Standard2.4形状的Oracle Linux 8实例。
步骤 2. 配置 yum 并安装软件包
创建实例后,启用 yum 存储库ol8_codeready_builder来安装必备软件包。
$ sudo yum-config-manager --enable ol8_codeready_builder
$ cat /etc/yum.repos.d/oracle-linux-ol8.repo
... ...
[ol8_codeready_builder]
name=Oracle Linux 8 CodeReady Builder ($basearch) - Unsupported
baseurl=https://yum$ociregion.$ocidomain/repo/OracleLinux/OL8/codeready/builder/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
... ...
接下来安装所需的软件包。
$ sudo yum install -y patch glibc-static gcc-toolset-11
步骤 3. 配置 gcc
为了使用 gcc-11,我们需要启用gcc-toolset-11软件集合:
$ scl enable gcc-toolset-11 bash
仔细检查 gcc 版本是否为 11.5.0。
$ gcc -v ... ... gcc version 11.5.0 20240719 (Red Hat 11.5.0-2.0.1) (GCC)
为了确保此软件集合在登录时永久启用,请将上述scl命令添加到/etc/profile。
步骤4.下载源代码
本文使用linux-6.4 。下载并解压。
$ wget https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.4.tar.xz $ tar xvf linux-6.4.tar.xz
步骤 5:添加“-static” CFLAGS
应用以下补丁在tools/testing/selftests/kvm/Makefile中添加 CFLAGS“ -static ” 。
$ cat kvmselftest.patch
diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
index 4761b768b..2474e65fb 100644
--- a/tools/testing/selftests/kvm/Makefile
+++ b/tools/testing/selftests/kvm/Makefile
@@ -203,7 +203,7 @@ CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \
-fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) \
-I$(LINUX_TOOL_ARCH_INCLUDE) -I$(LINUX_HDR_PATH) -Iinclude \
-I$(<D) -Iinclude/$(ARCH_DIR) -I ../rseq -I.. $(EXTRA_CFLAGS) \
- $(KHDR_INCLUDES)
+ $(KHDR_INCLUDES) -static
ifeq ($(ARCH),s390)
CFLAGS += -march=z10
endif
$ cd linux-6.4
$ patch -p1 < ../kvmselftest.patch
步骤 6. 构建 KVM 自检
$ cd linux-6.4 $ make headers $ cd tools/testing/selftests/kvm $ make
我们在本文中使用kvm_page_table_test作为示例。
$ ls -l kvm_page_table_test -rwxrwxr-x. 1 opc opc 3803272 Mar 18 23:01 kvm_page_table_test $ ldd kvm_page_table_test not a dynamic executable
步骤7.测试
将kvm_page_table_test复制到较旧的 Oracle Linux 7 环境,注意它如何成功执行。
ol7$ ./kvm_page_table_test Testing guest mode: PA-bits:ANY, VA-bits:48, 4K pages Testing memory backing src type: anonymous Testing memory backing src granularity: 0x1000 Testing memory size(aligned): 0x40000000 Guest physical test memory offset: 0x3fffbffff000 Host virtual test memory offset: 0x7f4d229be000 Number of testing vCPUs: 1 Started all vCPUs successfully KVM_CREATE_MAPPINGS: total execution time: 1409.087522349s KVM_UPDATE_MAPPINGS: total execution time: 1408.532079123s KVM_ADJUST_MAPPINGS: total execution time: 1408.479546540s
如果我们跳过步骤 5 并且不添加-static CFLAG,则kvm_page_table_test将不会执行失败。
ol7$ ./kvm_page_table_test ./kvm_page_table_test: /lib64/libc.so.6: version `GLIBC_2.27' not found (required by ./kvm_page_table_test)
总结
在本文中,我们演示了如何在 Oracle Linux 8 上将 KVM 自测试构建为静态二进制文件,以及如何在旧环境中执行它。
原文地址:https://blogs.oracle.com/linux/post/building-kvm-selftest-static
原文作者:Dongli Zhang




