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.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 **einfo = 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查看内存使用情况
# virsh listId Name State
-------------------------7 centos8 running# virsh dommemstat 7
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: # virsh dommemstat 2
6. 注入热补丁
上面步骤中已经生成了热补丁文件,直接使用libcare-ctl进行加载:
# /home/rongtao/libcareplus/src/libcare-ctl patch -p $(pidof qemu-system-x86_64) mypatch.kpatch
1 patch hunk(s) have been successfully applied to PID '216700'
注意,只有在一个Guest OS虚拟机时,才可以使用$(pidof qemu-system-x86_64)
获取PID。
再次查看日志信息:
# virsh dommemstat 7
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# cat /var/log/libvirt/qemu/centos8.log info: # virsh dommemstat 2, patched, add by Rong Tao.
info: balloon: actual=2048
可见热补丁注入成功。
7. 移除热补丁
使用libcare-ctl移除热补丁:
# /home/rongtao/libcareplus/src/libcare-ctl unpatch -p $(pidof qemu-system-x86_64)
1 patch hunk(s) were successfully cancelled from PID '216700'
再次执行内存的查询:
# cat /var/log/libvirt/qemu/centos8.log [...]info: # virsh dommemstat 2, patched, add by Rong Tao.
info: balloon: actual=2048info: # virsh dommemstat 2
将最后一条日志,热补丁被成功卸载。
libcareplus一个Qemu-6.1.0热补丁示例相关推荐
- LibcarePlus用户态程序热补丁
LibcarePlus https://gitee.com/openeuler/docs/edit/stable2-20.03_LTS_SP1/docs/zh/docs/Virtualization/ ...
- Qemu-6.1.0多热补丁管理
Qemu-6.1.0多补丁管理 荣涛 2021年10月13日 1. 引言 参照之前发布的文章 WIKI:Qemu-6.1.0单热补丁示例,对Qemu-6.1.0单个热补丁进行详细讲解,在文章WIKI: ...
- Android热补丁的一点总结
由于项目需要,我研究热补丁的实现是从12月上旬开始的,那时候我还是个对编译.ant.hudson只闻其名,对javassist.groovy闻所未闻的孩子:而现在,我已经是一个对ant.hudson一 ...
- 如何替换一个Linux内核函数的实现-热补丁原理
昨晚发过誓了.不会再接着写二进制hook的手艺了,今天有网友咨询技术细节,终于又忍不住了- 为了不违背即便是胡乱说出口誓言,今天不写二进制hook,今天用C语言写,二进制只是沾点边儿! 看题目, 替换 ...
- 坚持#第281天~KVM3-QEMU虚拟机的热迁移、桥接、NAT、仅主机模式、创建/删除一个QEMU虚拟机的脚本、
虚拟机的迁移: 宿主机 KVM VMWare 冷迁移:需要关机 cd images scp 域.qcow2 ip:/root rsync -avz比scp ...
- libcareplus应用于Qemu-6.1.0
libcareplus应用于Qemu-6.1.0 荣涛 2021年9月26日 1. 环境与步骤 1.1. 软件版本 Qemu:6.1.0 libvirt:7.0.0 virt-manager:2.2. ...
- Android热修复之 阿里开源的热补丁
1.概述 上一期讲到Android热修复之 - 收集崩溃信息上传至服务器,我们获取到用户手中上线的崩溃信息上传到服务器后该怎么办?如果直接发布版本要用户去下载肯定不乐意.这一期我们来看一下怎么去打 ...
- iOS 利用JSPatch 添加热补丁功能
ios 由于苹果的审核政策,一旦上线后发现bug是件让人崩溃的事情 不过可以利用oc的runtime机制可以家用JSPatch动态的为工程打热补丁 下载地址:https://github.com/ag ...
- Android各大热补丁方案分析和比较
原文出处:http://blog.zhaiyifan.cn/2015/11/20/HotPatchCompare/ 最近开源界涌现了很多热补丁项目,但从方案上来说,主要包括Dexposed.AndFi ...
最新文章
- spark1.x和2.xIterable和iterator兼容问题
- poj2955Brackets(区间DP)
- 像证券交易员一样思考_2.理解绝招
- (JavaWeb)会话跟踪技术Cookie和Session(重点)
- LM3S1138驱动函数SysCtlPeripheralEnable解析
- [JavaScript]只需一行代码,轻松搞定快捷留言功能
- 使用Grunt构建任务管理脚本(转)
- Fifth scrum meeting - 2015/10/30
- win创建linux目录,Windows与Linux上的文件创建时间
- 红杉中国2021企业数字化年度指南:企业如何制胜数字化浪潮?
- 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
- 第六周Java学习总结
- NMAP 端口扫描工具下载 + 安装
- 查看 Visio 是否激活以及激活方法
- Javascript 专项练习
- 怎样清理苹果手机内存空间_你还不知道?苹果手机这样清理垃圾,轻松腾出10G内存!...
- 春天里的一封战地日记
- 计算机网络复习笔记 之协议相关
- linux下搭建svn仓库
- FMRI及NMR简介
热门文章
- C语言汇编pdf,c语言程序代码[汇编].pdf
- sqlcheck约束表达式怎么写_creo 5.0 建模实例教程----乌比莫斯之环教程(表达式扫描特征)...
- mysql、orcl中database、schema、user之间的关系
- 团队编程项目作业1-成员简介及分工
- shellcode编写
- Jenkins 安装FAQ
- linux 使用 byzanz 生成 gif 图片程序
- NodeJS无所不能:细数10个令人惊讶的NodeJS开源项目
- cocos2d-x初探学习笔记(1)--HelloWorld .
- 移动互联网和Android给你带来的机会[轉]