暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译]在 Oracle Linux 8 上构建 KVM 自检静态二进制文件

原创 王语嫣 2025-04-30
191

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论