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 **einfo = 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 **einfo = 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=2048info: # 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             : 0PatchID  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=2048info: # virsh dommemstat 2, patched, add by Rong Tao.
info:    BALLOON: ACTUAL=2048info: # 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             : 0PatchID  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=2048info: # virsh dommemstat 2, patched, add by Rong Tao.
info:    BALLOON: ACTUAL=2048info: # virsh dommemstat 2, patched, add by Rong Tao, patch-3
info:    BALLOON: ACTUAL=2048, patch-3info: # virsh dommemstat 2

3. 结论

综上测试结果可见,目前通过以https://gitee.com/openeuler/libcareplus为基础继续开发的libcareplusplus库,可以管理多补丁。

Copyright (C) CESTC Com.

Qemu-6.1.0多热补丁管理相关推荐

  1. 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. 手把手教你使用Tinker Platform进行热修复补丁管理

    使用Tinker Platform进行热修复补丁管理 这是手把手教你使用腾讯的热修复框架-Tinker的姊妹篇,它主要讲述了如何接入Tinker以及Tinker的基本使用,不熟悉的可以点击了解一下. ...

  3. Android热修复之 阿里开源的热补丁

    1.概述   上一期讲到Android热修复之 - 收集崩溃信息上传至服务器,我们获取到用户手中上线的崩溃信息上传到服务器后该怎么办?如果直接发布版本要用户去下载肯定不乐意.这一期我们来看一下怎么去打 ...

  4. Android N混合编译与对热补丁影响深度解析

    大约在六月底,Tinker在微信全量上线了一个补丁版本,随即华为反馈在Android N上微信无法启动.冷汗冒一地,Android N又搞了什么东东?为什么与instant run保持一致的补丁方式也 ...

  5. 插件化、热补丁中绕不开的Proguard的坑

    文章主体部分已经发表于<程序员>杂志2018年2月期,内容略有改动. ProGuard简介 ProGuard是2002年由比利时程序员Eric Lafortune发布的一款优秀的开源代码优 ...

  6. 内核热补丁,真的安全么?

    简介: Linux 内核函数的热替换"撞上"函数调用约定还靠谱吗? Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在比较常见的比 ...

  7. libcareplus多补丁管理

    libcareplus多补丁管理 荣涛 2021年10月13日 文档修改日志 日期 修改内容 修改人 备注 2021年10月13日 创建文档 荣涛 2021年10月15日 AARch64多补丁支持 荣 ...

  8. LibcarePlus用户态程序热补丁

    LibcarePlus https://gitee.com/openeuler/docs/edit/stable2-20.03_LTS_SP1/docs/zh/docs/Virtualization/ ...

  9. Android N混合编译与对热补丁影响解析

    首先非常抱歉Tinker没有按期内测,这主要因为开源的代码需要通过公司内部审核与评测,这项工作大约还需要一个月左右.当前Tinker已经在公司内部开源,我们会努力让它以更完善的姿态与大家见面. 大约在 ...

最新文章

  1. 你和人工智能的对话,正在被人工收听
  2. 动态获取的图片当做背景,而且图片是小图
  3. 在php中使用json
  4. python清空字典保留变量_python彻底清除字典数据,clear方法使用
  5. Android开发日常笔记
  6. mysql级联_MySQL 级联复制(A-B-C)
  7. 中国移动集中化BI探索:数据仓库与Hadoop混搭
  8. Python中的简单图案打印程序
  9. (33)SystemVerilog语言编写二分频
  10. moonlight不显示鼠标指针
  11. 图片滚动js 实现图片无缝滚动
  12. vc 实现打印机打印功能
  13. 【双拼】双拼输入法入门指南
  14. 经济学和金融学的区别
  15. 阿里云2核4G云服务器租用CPU内存、公网带宽和系统盘配置
  16. cv2批量修改图片大小
  17. 实训日记(二)——分镜
  18. 代码整洁之道 1-3阅读笔记
  19. php参考文献博客,科学网—博客文章可否作为参考文献引用? - 王德华的博文
  20. 刷新页面以及微信小程序传值至另个页面

热门文章

  1. c语言双链表从右向左遍历,有没有大佬在的,我这双向链表怎么没办法遍历
  2. php shell,php命令行写shell实例详解
  3. Docker加入白名单
  4. Jenkins持续集成之小试牛刀
  5. 团队任务3 每日立会
  6. 在 Xcode 中进行自动化测试 (2/2)
  7. ASP.NET面试题 (转)
  8. 基于swiper和Less的小米商城
  9. centos ifconfig命令找不到_测试需要掌握docker的一些基本命令
  10. go excel换行符替换_微软Excel与WPS Excel哪个好玩?