Qemu-6.1.0多热补丁管理
Posted rtoax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qemu-6.1.0多热补丁管理相关的知识,希望对你有一定的参考价值。
1. 引言
参照之前发布的文章 WIKI:Qemu-6.1.0单热补丁示例,对Qemu-6.1.0
单个热补丁进行详细讲解,在文章WIKI:libcareplus多补丁管理开发了多补丁管理的功能。
本文主要介绍Qemu-6.1.0
的多补丁管理。本文的测示例结构伪代码为:
1.1. 测试步骤
整体流程比较简单,简言之就是加载补丁、查看补丁、卸载补丁。
- 修改
Qemu-6.1.0
源代码,生成补丁文本文件; - 使用libcareplus脚本
libcare-patch-make
编译生成可执行文件和补丁文件1.kpatch
; - 在多补丁情况下,再次使用脚本
libcare-patch-make
编译生成补丁文件2.kpatch
; - 启动虚拟机,此时,虚拟机是没有任何补丁的;
- 使用
libcare-ctl patch
工具加载补丁1.kpatch
; - 验证补丁
1.kpatch
是否添加成功(反汇编或查看日志); - 使用
libcare-ctl patch
工具加载补丁2.kpatch
; - 验证补丁
2.kpatch
是否添加成功(反汇编或查看日志); - 使用
libcare-ctl info
工具查看已加载的补丁; - 使用
libcare-ctl unpatch
反序依次卸载补丁; - 验证补丁是否卸载成功(反汇编或查看日志);
2. 测试
2.1. 生成补丁文本文件
修改Qemu-6.1.0
源代码,并采用diff指令生成patch文本文件,我测试的两个补丁分别为:
- 补丁1:
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;
}
- 补丁2:
0007.1.softmmu-balloon.patch
--- softmmu/balloon.c 2021-10-08 14:54:35.535541088 +0800
+++ patches/softmmu-balloon-2.c 2021-10-13 14:53:22.468856515 +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;
}
也即是说,在测试前,我在函数qmp_query_balloon
中已经添加了一行日志info_report("# virsh dommemstat 2");
,这条日志将正常编译进发布的可执行文件中。当采用virsh dommemstat <idx>
命令查看内存使用情况时,在/var/log/libvirt/qemu/<虚拟机名称>
中会产生日志信息。
- 第一个补丁将对日志做出如下修改:
将
info: # virsh dommemstat 2
修改为:
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: balloon: actual=2048
- 第二个补丁将对日志做出如下修改:
将
info: # virsh dommemstat 2
或
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: balloon: actual=2048
修改为:
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: BALLOON: ACTUAL=2048
2.2. 生成补丁1
libcare-patch-make --clean -j 10 -i 1 0007.softmmu-balloon.patch
编译生成补丁过程中,需要选择补丁应用的源文件:
The text leading up to this was:
--------------------------
|--- softmmu/balloon.c 2021-10-08 14:54:35.535541088 +0800
|+++ patches/softmmu-balloon.c 2021-10-08 15:23:41.982669932 +0800
--------------------------
File to patch: softmmu/balloon.c
在编译末期,将会提示是否重命名补丁文件,因为默认补丁名采用BuildID(同一个目标可执行文件的Build ID相同),需要对它们进行重命名:
Do you want to rename kpatch file [Y/N]: y
Input kpatch file name: 1.kpatch
上述步骤结束后,就会生成二进制补丁文件1.kpatch
。
2.3. 生成补丁2
补丁二的生成方式和补丁1基本相同,不同的是不安逸阶段需要增加--new-patch
选项:
libcare-patch-make --clean -j 10 --new-patch -i 2 0007.1.softmmu-balloon.patch
编译生成补丁过程中,需要选择补丁应用的源文件:
The text leading up to this was:
--------------------------
|--- softmmu/balloon.c 2021-10-08 14:54:35.535541088 +0800
|+++ patches/softmmu-balloon-2.c 2021-10-13 14:53:22.468856515 +0800
--------------------------
File to patch: softmmu/balloon.c
并重命名补丁文件名:
Do you want to rename kpatch file [Y/N]: y
Input kpatch file name: 2.kpatch
2.4. 启动虚拟机
使用virsh或者virt-manager启动虚拟机即可。
2.5. 查询内存使用
[root@loaclhost qemu-6.1.0]# virsh dommemstat 1
actual 2097152
swap_in 0
swap_out 0
major_fault 334
minor_fault 146337
unused 1669504
available 1860212
usable 1632036
last_update 1634120872
disk_caches 71260
hugetlb_pgalloc 0
hugetlb_pgfail 0
rss 1378068
[root@loaclhost qemu-6.1.0]# cat /var/log/libvirt/qemu/centos8.log
info: # virsh dommemstat 2
2.6. 加载补丁1
# libcare-ctl patch -p $(pidof qemu-system-x86_64) 1.kpatch
1 patch hunk(s) have been successfully applied to PID '248400'
查询内存使用:
[root@loaclhost qemu-6.1.0]# virsh dommemstat 1
actual 2097152
swap_in 0
swap_out 0
major_fault 334
minor_fault 146337
unused 1669504
available 1860212
usable 1632036
last_update 1634120872
disk_caches 71260
hugetlb_pgalloc 0
hugetlb_pgfail 0
rss 1486624
[root@loaclhost qemu-6.1.0]# cat /var/log/libvirt/qemu/centos8.log
info: # virsh dommemstat 2
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: balloon: actual=2048
2.7. 加载补丁2
# libcare-ctl patch -p $(pidof qemu-system-x86_64) 2.kpatch
1 patch hunk(s) have been successfully applied to PID '248400'
查询内存使用:
[root@loaclhost qemu-6.1.0]# virsh dommemstat 1
actual 2097152
swap_in 0
swap_out 0
major_fault 334
minor_fault 146337
unused 1669504
available 1860212
usable 1632036
last_update 1634120872
disk_caches 71260
hugetlb_pgalloc 0
hugetlb_pgfail 0
rss 1486648
[root@loaclhost qemu-6.1.0]# cat /var/log/libvirt/qemu/centos8.log
info: # virsh dommemstat 2
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: balloon: actual=2048
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: BALLOON: ACTUAL=2048
2.8. 查看已加载的补丁
# libcare-ctl info -p $(pidof qemu-system-x86_64)
Process Information.
PID : 248400
COMM : qemu-system-x86_
BuildID : 5edf7b86ee42e05fab90b8e888363a15cf044b8e
NAME : qemu-system-x86_64
PatchVL : 0
PatchID TotalSize ULv FLAGs BuildTime
1 7320 0 0 20211013/17:34:09
2 7320 0 0 20211013/18:27:33
Total 2 patches.
========================================
2.9. 再次生成新补丁3
注意
此时虚拟机正常运行。
libcare-patch-make --clean -j 10 --new-patch -i 3 0007.2.softmmu-balloon.patch
编译生成补丁过程中,需要选择补丁应用的源文件:
The text leading up to this was:
--------------------------
|--- softmmu/balloon.c 2021-10-08 14:54:35.535541088 +0800
|+++ patches/softmmu-balloon-3.c 2021-10-13 15:30:23.992736591 +0800
--------------------------
File to patch: softmmu/balloon.c
并重命名补丁文件名:
Do you want to rename kpatch file [Y/N]: y
Input kpatch file name: 3.kpatch
2.10. 加载补丁3
# libcare-ctl patch -p $(pidof qemu-system-x86_64) 3.kpatch
1 patch hunk(s) have been successfully applied to PID '248400'
查询内存使用:
[root@loaclhost qemu-6.1.0]# virsh dommemstat 1
actual 2097152
swap_in 0
swap_out 0
major_fault 334
minor_fault 146337
unused 1669504
available 1860212
usable 1632036
last_update 1634120872
disk_caches 71260
hugetlb_pgalloc 0
hugetlb_pgfail 0
rss 1509500
[root@loaclhost qemu-6.1.0]# cat /var/log/libvirt/qemu/centos8.log
info: # virsh dommemstat 2
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: balloon: actual=2048
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: BALLOON: ACTUAL=2048
info: # virsh dommemstat 2, patched, add by Rong Tao, patch-3
info: BALLOON: ACTUAL=2048, patch-3
发现补丁3加载成功。
2.11. 查看已加载的补丁
[root@loaclhost qemu-6.1.0]# libcare-ctl info -p $(pidof qemu-system-x86_64)
Process Information.
PID : 248400
COMM : qemu-system-x86_
BuildID : 5edf7b86ee42e05fab90b8e888363a15cf044b8e
NAME : qemu-system-x86_64
PatchVL : 0
PatchID TotalSize ULv FLAGs BuildTime
1 7320 0 0 20211013/17:34:09
2 7320 0 0 20211013/18:27:33
3 7336 0 0 20211013/18:38:14
Total 3 patches.
========================================
2.12. 依次卸载补丁
注意
倒序卸载补丁。
依次卸载:
libcare-ctl unpatch -p $(pidof qemu-system-x86_64) -i 3
libcare-ctl unpatch -p $(pidof qemu-system-x86_64) -i 2
libcare-ctl unpatch -p $(pidof qemu-system-x86_64) -i 1
再次查询内存使用情况:
[root@loaclhost qemu-6.1.0]# virsh dommemstat 1
actual 2097152
swap_in 0
swap_out 0
major_fault 334
minor_fault 146337
unused 1669504
available 1860212
usable 1632036
last_update 1634120872
disk_caches 71260
hugetlb_pgalloc 0
hugetlb_pgfail 0
rss 1509500
[root@loaclhost qemu-6.1.0]# cat /var/log/libvirt/qemu/centos8.log
info: # virsh dommemstat 2
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: balloon: actual=2048
info: # virsh dommemstat 2, patched, add by Rong Tao.
info: BALLOON: ACTUAL=2048
info: # virsh dommemstat 2, patched, add by Rong Tao, patch-3
info: BALLOON: ACTUAL=2048, patch-3
info: # virsh dommemstat 2
3. 结论
综上测试结果可见,目前通过以https://gitee.com/openeuler/libcareplus为基础继续开发的libcareplusplus库,可以管理多补丁。
以上是关于Qemu-6.1.0多热补丁管理的主要内容,如果未能解决你的问题,请参考以下文章
续:纠正:ubuntu7.04可以安装,而且完美的安装 ! for《Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4不含4以上,及 ubuntu 7.04不含(代码片段