libcareplus一个Qemu-6.1.0热补丁示例

Posted rtoax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了libcareplus一个Qemu-6.1.0热补丁示例相关的知识,希望对你有一定的参考价值。

libcareplus一个Qemu-6.1.0热补丁示例

荣涛
2021年10月8日

1. 环境与步骤

1.1. 软件版本

  • Qemu:6.1.0
  • libvirt:7.0.0
  • virt-manager:2.2.1

略过Qemu、libcirt、rit-manager以及虚拟机的安装,直接进行热补丁测试。

1.2. 测试步骤

  1. 使用virt-manager启动qemu-KVM虚拟机;
  2. 查看宿主机中的qemu进程,使用工具查看虚拟机Guest OS状态;
  3. 使用libcareplus制作补丁文件;
  4. 使用libcareplus生成补丁;
  5. 使用libcareplus加载热补丁;
  6. 使用libcareplus查看热补丁信息;
  7. 使用libcareplus删除补丁;

下面,按照上述步骤,进行分节详述。

2. 在balloon查询中添加日志

在之前已经通过查看源代码的反汇编结果证明了热补丁的成功添加,为了更加直观的表述热补丁的执行过程,我们在qemu源代码合适的位置添加日志信息:

BalloonInfo *qmp_query_balloon(Error **errp)
{
    BalloonInfo *info;

	info_report("# virsh dommemstat 2");

    if (!have_balloon(errp)) {
        return NULL;
    }

    info = g_malloc0(sizeof(*info));
    balloon_stat_fn(balloon_opaque, info);
    return info;
}

如上,添加了info_report日志信息,该信息在使用命令virsh dommemstat查看内存使用情况时将打印到/var/log/libvirt/qemu/<VMname>.log中,在我的环境下,<VMname>.logcentos8.log

3. 对源码做出修改

如下,做出的修改:

# cat 0007.softmmu-balloon.patch 
--- softmmu/balloon.c	2021-10-08 14:54:35.535541088 +0800
+++ patches/softmmu-balloon.c	2021-10-08 15:23:41.982669932 +0800
@@ -81,7 +81,7 @@ BalloonInfo *qmp_query_balloon(Error **e
 {
     BalloonInfo *info;
 
-	info_report("# virsh dommemstat 2");
+	info_report("# virsh dommemstat 2, patched, add by Rong Tao.");
 
     if (!have_balloon(errp)) {
         return NULL;
@@ -89,7 +89,9 @@ BalloonInfo *qmp_query_balloon(Error **e
 
     info = g_malloc0(sizeof(*info));
     balloon_stat_fn(balloon_opaque, info);
-    return info;
+	
+	info_report("   balloon: actual=%" PRId64 "\\n", info->actual >> 20);
+	return info;
 }

在第一条日志中添加了字符串,同时,增加一条日志,打印实际使用内存情况。

下面就可以使用libcare-make-patch编译qemu源码了。

4. 生成补丁文件

/home/rongtao/libcareplus/src/libcare-patch-make -j 10  0007.softmmu-balloon.patch

生成可执行文件和补丁文件。

5. 启动VM虚拟机,查看日志

使用virt-manager或者virsh启动虚拟机,查看日志信息。

  1. 为了清晰,清空日志文件:
echo "" > /var/log/libvirt/qemu/centos8.log
  1. 启动虚拟机

使用virt-manager或者virsh启动虚拟机。

  1. 查看日志信息

这时会显示启动过程的日志信息。

cat /var/log/libvirt/qemu/centos8.log
  1. 使用virsh查看内存使用情况
# virsh list
 Id   Name      State
-------------------------
 7    centos8   running

# virsh dommemstat 7
actual 2097152
swap_in 0
swap_out 0
major_fault 345
minor_fault 145755
unused 1664384
available 1860212
usable 1627596
last_update 1633678776
disk_caches 72624
hugetlb_pgalloc 0
hugetlb_pgfail 0
rss 1353580
  1. 再次查看日志信息
cat /var/log/libvirt/qemu/centos8.log
[...]
info: # virsh dommemstat 2

6. 注入热补丁

上面步骤中已经生成了热补丁文件,直接使用libcare-ctl进行加载:

# /home/rongtao/libcareplus/src/libcare-ctl patch -p $(pidof qemu-system-x86_64) mypatch.kpatch
1 patch hunk(s) have been successfully applied to PID '216700'

注意,只有在一个Guest OS虚拟机时,才可以使用$(pidof qemu-system-x86_64)获取PID。

再次查看日志信息:

# virsh dommemstat 7
actual 2097152
swap_in 0
swap_out 0
major_fault 345
minor_fault 145755
unused 1664384
available 1860212
usable 1627596
last_update 1633678776
disk_caches 72624
hugetlb_pgalloc 0
hugetlb_pgfail 0
rss 1410904

# cat  /var/log/libvirt/qemu/centos8.log 

info: # virsh dommemstat 2, patched, add by Rong Tao.
info:    balloon: actual=2048

可见热补丁注入成功。

7. 移除热补丁

使用libcare-ctl移除热补丁:

# /home/rongtao/libcareplus/src/libcare-ctl unpatch -p $(pidof qemu-system-x86_64)
1 patch hunk(s) were successfully cancelled from PID '216700'

再次执行内存的查询:

# cat  /var/log/libvirt/qemu/centos8.log 

[...]

info: # virsh dommemstat 2, patched, add by Rong Tao.
info:    balloon: actual=2048

info: # virsh dommemstat 2

将最后一条日志,热补丁被成功卸载。


Copyright (C) CESTC Com.

以上是关于libcareplus一个Qemu-6.1.0热补丁示例的主要内容,如果未能解决你的问题,请参考以下文章

Qemu-6.1.0多热补丁管理

安装Qemu-6.1.0

LibcarePlus用户态程序热补丁

libcareplus多补丁管理

libcareplus支持的补丁类型

用户态热补丁