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. 测试步骤
整体流程比较简单,简言之就是加载补丁、查看补丁、卸载补丁。
- 修改
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 **einfo = 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 **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/<虚拟机名称>
中会产生日志信息。
- 第一个补丁将对日志做出如下修改:
将
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=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库,可以管理多补丁。
Qemu-6.1.0多热补丁管理相关推荐
- 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: ...
- 手把手教你使用Tinker Platform进行热修复补丁管理
使用Tinker Platform进行热修复补丁管理 这是手把手教你使用腾讯的热修复框架-Tinker的姊妹篇,它主要讲述了如何接入Tinker以及Tinker的基本使用,不熟悉的可以点击了解一下. ...
- Android热修复之 阿里开源的热补丁
1.概述 上一期讲到Android热修复之 - 收集崩溃信息上传至服务器,我们获取到用户手中上线的崩溃信息上传到服务器后该怎么办?如果直接发布版本要用户去下载肯定不乐意.这一期我们来看一下怎么去打 ...
- Android N混合编译与对热补丁影响深度解析
大约在六月底,Tinker在微信全量上线了一个补丁版本,随即华为反馈在Android N上微信无法启动.冷汗冒一地,Android N又搞了什么东东?为什么与instant run保持一致的补丁方式也 ...
- 插件化、热补丁中绕不开的Proguard的坑
文章主体部分已经发表于<程序员>杂志2018年2月期,内容略有改动. ProGuard简介 ProGuard是2002年由比利时程序员Eric Lafortune发布的一款优秀的开源代码优 ...
- 内核热补丁,真的安全么?
简介: Linux 内核函数的热替换"撞上"函数调用约定还靠谱吗? Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在比较常见的比 ...
- libcareplus多补丁管理
libcareplus多补丁管理 荣涛 2021年10月13日 文档修改日志 日期 修改内容 修改人 备注 2021年10月13日 创建文档 荣涛 2021年10月15日 AARch64多补丁支持 荣 ...
- LibcarePlus用户态程序热补丁
LibcarePlus https://gitee.com/openeuler/docs/edit/stable2-20.03_LTS_SP1/docs/zh/docs/Virtualization/ ...
- Android N混合编译与对热补丁影响解析
首先非常抱歉Tinker没有按期内测,这主要因为开源的代码需要通过公司内部审核与评测,这项工作大约还需要一个月左右.当前Tinker已经在公司内部开源,我们会努力让它以更完善的姿态与大家见面. 大约在 ...
最新文章
- 你和人工智能的对话,正在被人工收听
- 动态获取的图片当做背景,而且图片是小图
- 在php中使用json
- python清空字典保留变量_python彻底清除字典数据,clear方法使用
- Android开发日常笔记
- mysql级联_MySQL 级联复制(A-B-C)
- 中国移动集中化BI探索:数据仓库与Hadoop混搭
- Python中的简单图案打印程序
- (33)SystemVerilog语言编写二分频
- moonlight不显示鼠标指针
- 图片滚动js 实现图片无缝滚动
- vc 实现打印机打印功能
- 【双拼】双拼输入法入门指南
- 经济学和金融学的区别
- 阿里云2核4G云服务器租用CPU内存、公网带宽和系统盘配置
- cv2批量修改图片大小
- 实训日记(二)——分镜
- 代码整洁之道 1-3阅读笔记
- php参考文献博客,科学网—博客文章可否作为参考文献引用? - 王德华的博文
- 刷新页面以及微信小程序传值至另个页面