diff --git a/docs/zh/docs/Virtualization/LibcarePlus.md b/docs/zh/docs/Virtualization/LibcarePlus.md index 52f5fef43ad2e035748ac5ce8bd91f69cb7fac49..3e3fb572517b4e43112c1aa77b42e5751b1652ad 100644 --- a/docs/zh/docs/Virtualization/LibcarePlus.md +++ b/docs/zh/docs/Virtualization/LibcarePlus.md @@ -6,6 +6,7 @@ - [安装 LibcarePlus](#安装-libcareplus) - [制作 LibcarePlus 热补丁](#制作-libcareplus-热补丁) - [应用 LibcarePlus 热补丁](#应用-libcareplus-热补丁) +- [使用libcareplus工具制作qemu热补丁](#使用libcareplus工具制作qemu热补丁) ## 概述 @@ -395,3 +396,99 @@ LibcarePlus 支持如下方式制作热补丁: Hello world! Hello world! ``` + +## 使用libcareplus工具制作qemu热补丁 + +制作方法如下: + +### 1.下载qemu制品仓代码,保持代码版本与openEuler环境中qemu版本一致 + ```shell +# 下载qemu源码并解压 +yum download --source qemu +rpm2cpio qemu-8.2.0-13.oe2403.src.rpm | cpio -id + ``` + +### 2.编译qemu制品仓代码 + +- 将解压后的qemu源码挪至/root/rpmbuild/SOURCES(由多个patch、一个qemu.spec、一个qemu-8.2.0.tar.xz组成) + +- 编译qemu.spec + + ```shell + rpmbuild -ba qemu.spec + ``` + +有两份成果物: +- /root/rpmbuild/BUILD/qemu-8.2.0中生成中间代码,为编译qemu对应代码。将代码拷贝到/home/abuild/rpmbuild/BUILD/qemu-8.2.0,编译环境的路径也会影响补丁地址的偏移。 +- /root/rpmbuild/RPMS/中生成qemu相关的rpm包。 + +### 3.制作热补丁所需的patch文件 + + 使用git format-patch指令制作patch即可。 + + ```shell + # cat 0001-hack-hmp-qtree-info.patch + From bb2f4e6fe43ca7b3d73026966ac3411b2d8342b9 Mon Sep 17 00:00:00 2001 + From: zhangsan + Date: Mon, 7 Mar 2022 20:53:41 +0800 + Subject: [PATCH 1/3] hack hmp qtree info + + --- + softmmu/qdev-monitor.c | 1 + + 1 file changed, 1 insertion(+) + + diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c + index 05e1d88d99..96fd596c2e 100644 + --- a/softmmu/qdev-monitor.c + +++ b/softmmu/qdev-monitor.c + @@ -833,6 +833,7 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent) + + void hmp_info_qtree(Monitor *mon, const QDict *qdict) + { + + fprintf(stderr, "---------------you hack me---------------------"); + if (sysbus_get_default()) + qbus_print(mon, sysbus_get_default(), 0); + } + -- + 2.33.0 + + ``` + +### 3.配置/etc/libcare.conf + /etc/libcare.conf填上patch文件修改的函数,用于后续制作补丁时,过滤掉不相关的函数; + 当前修改内容如下: + + ```shell + # cat /etc/libcare.conf + hmp_info_qtree + ``` + +### 4.查看qemu buildID + + ```shell + # whereis qemu-kvm + qemu-kvm: /usr/bin/qemu-kvm /usr/libexec/qemu-kvm + # file /usr/libexec/qemu-kvm + /usr/libexec/qemu-kvm: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=68f4ec13e140d3a688f3e0fb93442b8c7a86be8b, for GNU/Linux 3.7.0, stripped + ``` +注:需保持制作热补丁的环境和制作qemu包环境一致,buildID可作为二者是否一致的判定标准。因用户无qemu版本的制作环境,故可以自行编包并安装,使用自编包中的/usr/libexec/qemu-kvm的buildID。 + +### 5.制作热补丁 + +在/home/abuild/rpmbuild/BUILD/qemu-8.2.0/build中执行热补丁制作指令,**注意是build目录!!!** + +```shell +# libcare-patch-make --clean -s ../ 0002-patch-hello-qdm.patch -i 0001 --buildid=68f4ec13e140d3a688f3e0fb93442b8c7a86be8b -j 64 +``` +参数说明: + +--clean 类似make clean + +-s ../ 指定源文件夹,这里是上层目录 + +-i 0001 热补丁id + +buildid=xxx 保持和系统中qemu-kvm buildid一致 + +-j 64 多线程编译 + diff --git "a/docs/zh/docs/Virtualization/\350\231\232\346\213\237\345\214\226\345\267\245\345\205\267\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" "b/docs/zh/docs/Virtualization/\350\231\232\346\213\237\345\214\226\345\267\245\345\205\267\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..5db3cc1a32c904f875b7aa86c670f53b9cb01eb9 --- /dev/null +++ "b/docs/zh/docs/Virtualization/\350\231\232\346\213\237\345\214\226\345\267\245\345\205\267\345\270\270\350\247\201\351\227\256\351\242\230\344\270\216\350\247\243\345\206\263\346\226\271\346\263\225.md" @@ -0,0 +1,11 @@ +### 问题1:使用libcareplus工具制作的qemu热补丁无法加载? +可能原因: +1.qemu版本和热补丁版本不一致 +下载qemu对应版本的源码,同时需保持制作热补丁的环境和制作qemu包环境一致,buildID可作为二者是否一致的判定标准。因用户无qemu版本的制作环境,故可以 **自行编包并安装** ,使用自编包中的/usr/libexec/qemu-kvm的buildID。 + +### 问题2:使用libcareplus工具制作的热补丁已加载但未生效? +可能原因: +1.查看补丁所在函数是否在约束限制中。 + +### 问题3:使用kvmtop工具第一次显示的结果为间隔0.05秒的两次采样计算得到的结果,波动较大 +此为开源top框架缺陷导致。 \ No newline at end of file diff --git a/docs/zh/menu/index.md b/docs/zh/menu/index.md index db1fc332ea12c0de3a653093007e47ebb9d03ef8..1f45af29c9699c48f44e107cb4ad0389ed582d4c 100644 --- a/docs/zh/menu/index.md +++ b/docs/zh/menu/index.md @@ -178,6 +178,7 @@ headless: true - [工具使用指南]({{< relref "./docs/Virtualization/工具使用指南.md" >}}) - [vmtop]({{< relref "./docs/Virtualization/vmtop.md" >}}) - [LibcarePlus]({{< relref "./docs/Virtualization/LibcarePlus.md" >}}) + - [虚拟化工具常见问题与解决方法]({{< relref "./docs/zh/docs/Virtualization/LibcarePlus常见问题与解决方法.md" >}}) - [Skylark虚拟机混部]({{< relref "./docs/Virtualization/Skylark.md" >}}) - [附录]({{< relref "./docs/Virtualization/附录.md" >}}) - [StratoVirt用户指南]({{< relref "./docs/StratoVirt/StratoVirtGuide.md" >}})