Qemu-6.1.0多热补丁管理

Posted rtoax

tags:

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

Qemu-6.1.0多补丁管理

荣涛
2021年10月13日

1. 引言

参照之前发布的文章 WIKI:Qemu-6.1.0单热补丁示例,对Qemu-6.1.0单个热补丁进行详细讲解,在文章WIKI:libcareplus多补丁管理开发了多补丁管理的功能。

本文主要介绍Qemu-6.1.0的多补丁管理。本文的测示例结构伪代码为:

1.1. 测试步骤

整体流程比较简单,简言之就是加载补丁、查看补丁、卸载补丁。

  1. 修改Qemu-6.1.0源代码,生成补丁文本文件;
  2. 使用libcareplus脚本libcare-patch-make编译生成可执行文件和补丁文件1.kpatch
  3. 在多补丁情况下,再次使用脚本libcare-patch-make编译生成补丁文件2.kpatch
  4. 启动虚拟机,此时,虚拟机是没有任何补丁的;
  5. 使用libcare-ctl patch工具加载补丁1.kpatch
  6. 验证补丁1.kpatch是否添加成功(反汇编或查看日志);
  7. 使用libcare-ctl patch工具加载补丁2.kpatch
  8. 验证补丁2.kpatch是否添加成功(反汇编或查看日志);
  9. 使用libcare-ctl info工具查看已加载的补丁;
  10. 使用libcare-ctl unpatch反序依次卸载补丁;
  11. 验证补丁是否卸载成功(反汇编或查看日志);

2. 测试

2.1. 生成补丁文本文件

修改Qemu-6.1.0源代码,并采用diff指令生成patch文本文件,我测试的两个补丁分别为:

  1. 补丁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;
 }
  1. 补丁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/<虚拟机名称>中会产生日志信息。

  1. 第一个补丁将对日志做出如下修改:

info: # virsh dommemstat 2

修改为:

info: # virsh dommemstat 2, patched, add by Rong Tao.
info:    balloon: actual=2048
  1. 第二个补丁将对日志做出如下修改:

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库,可以管理多补丁。


Copyright (C) CESTC Com.

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

libcareplus应用于Qemu-6.1.0

安装Qemu-6.1.0

续:纠正:ubuntu7.04可以安装,而且完美的安装 ! for《Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4不含4以上,及 ubuntu 7.04不含(代码片段

tf.estimator 的 tensorflow 提要列表功能(多热)

如何进行多热编码但使用实际值而不是实际值

多类多标签混淆矩阵,其中预测和标签是多热向量