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. 测试步骤
- 使用virt-manager启动qemu-KVM虚拟机;
- 查看宿主机中的qemu进程,使用工具查看虚拟机Guest OS状态;
- 使用libcareplus制作补丁文件;
- 使用libcareplus生成补丁;
- 使用libcareplus加载热补丁;
- 使用libcareplus查看热补丁信息;
- 使用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>.log 为centos8.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启动虚拟机,查看日志信息。
- 为了清晰,清空日志文件:
echo "" > /var/log/libvirt/qemu/centos8.log
- 启动虚拟机
使用virt-manager或者virsh启动虚拟机。
- 查看日志信息
这时会显示启动过程的日志信息。
cat /var/log/libvirt/qemu/centos8.log
- 使用virsh查看内存使用情况
Id Name State
-------------------------
7 centos8 running
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
- 再次查看日志信息
cat /var/log/libvirt/qemu/centos8.log
[...]
info:
6. 注入热补丁
上面步骤中已经生成了热补丁文件,直接使用libcare-ctl进行加载:
1 patch hunk(s) have been successfully applied to PID '216700'
注意,只有在一个Guest OS虚拟机时,才可以使用$(pidof qemu-system-x86_64) 获取PID。
再次查看日志信息:
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
info:
info: balloon: actual=2048
可见热补丁注入成功。
7. 移除热补丁
使用libcare-ctl移除热补丁:
1 patch hunk(s) were successfully cancelled from PID '216700'
再次执行内存的查询:
[...]
info:
info: balloon: actual=2048
info:
将最后一条日志,热补丁被成功卸载。
Copyright (C) CESTC Com.
|