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. 测试步骤

  1. 使用virt-manager启动qemu-KVM虚拟机;
  2. 查看宿主机中的qemu进程,使用工具查看虚拟机Guest OS状态;
  3. 使用libcareplus制作补丁文件;
  4. 使用libcareplus生成补丁;
  5. 使用libcareplus加载热补丁;
  6. 使用libcareplus查看热补丁信息;
  7. 使用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>.logcentos8.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启动虚拟机,查看日志信息。

  1. 为了清晰,清空日志文件:
echo "" > /var/log/libvirt/qemu/centos8.log
  1. 启动虚拟机

使用virt-manager或者virsh启动虚拟机。

  1. 查看日志信息

这时会显示启动过程的日志信息。

cat /var/log/libvirt/qemu/centos8.log
  1. 使用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
  1. 再次查看日志信息
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

将最后一条日志,热补丁被成功卸载。

Copyright (C) CESTC Com.

libcareplus一个Qemu-6.1.0热补丁示例相关推荐

  1. LibcarePlus用户态程序热补丁

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

  2. Qemu-6.1.0多热补丁管理

    Qemu-6.1.0多补丁管理 荣涛 2021年10月13日 1. 引言 参照之前发布的文章 WIKI:Qemu-6.1.0单热补丁示例,对Qemu-6.1.0单个热补丁进行详细讲解,在文章WIKI: ...

  3. Android热补丁的一点总结

    由于项目需要,我研究热补丁的实现是从12月上旬开始的,那时候我还是个对编译.ant.hudson只闻其名,对javassist.groovy闻所未闻的孩子:而现在,我已经是一个对ant.hudson一 ...

  4. 如何替换一个Linux内核函数的实现-热补丁原理

    昨晚发过誓了.不会再接着写二进制hook的手艺了,今天有网友咨询技术细节,终于又忍不住了- 为了不违背即便是胡乱说出口誓言,今天不写二进制hook,今天用C语言写,二进制只是沾点边儿! 看题目, 替换 ...

  5. 坚持#第281天~KVM3-QEMU虚拟机的热迁移、桥接、NAT、仅主机模式、创建/删除一个QEMU虚拟机的脚本、

    虚拟机的迁移: 宿主机 KVM               VMWare 冷迁移:需要关机 cd images scp 域.qcow2      ip:/root     rsync -avz比scp ...

  6. 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. ...

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

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

  8. iOS 利用JSPatch 添加热补丁功能

    ios 由于苹果的审核政策,一旦上线后发现bug是件让人崩溃的事情 不过可以利用oc的runtime机制可以家用JSPatch动态的为工程打热补丁 下载地址:https://github.com/ag ...

  9. Android各大热补丁方案分析和比较

    原文出处:http://blog.zhaiyifan.cn/2015/11/20/HotPatchCompare/ 最近开源界涌现了很多热补丁项目,但从方案上来说,主要包括Dexposed.AndFi ...

最新文章

  1. spark1.x和2.xIterable和iterator兼容问题
  2. poj2955Brackets(区间DP)
  3. 像证券交易员一样思考_2.理解绝招
  4. (JavaWeb)会话跟踪技术Cookie和Session(重点)
  5. LM3S1138驱动函数SysCtlPeripheralEnable解析
  6. [JavaScript]只需一行代码,轻松搞定快捷留言功能
  7. 使用Grunt构建任务管理脚本(转)
  8. Fifth scrum meeting - 2015/10/30
  9. win创建linux目录,Windows与Linux上的文件创建时间
  10. 红杉中国2021企业数字化年度指南:企业如何制胜数字化浪潮?
  11. 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
  12. 第六周Java学习总结
  13. NMAP 端口扫描工具下载 + 安装
  14. 查看 Visio 是否激活以及激活方法
  15. Javascript 专项练习
  16. 怎样清理苹果手机内存空间_你还不知道?苹果手机这样清理垃圾,轻松腾出10G内存!...
  17. 春天里的一封战地日记
  18. 计算机网络复习笔记 之协议相关
  19. linux下搭建svn仓库
  20. FMRI及NMR简介

热门文章

  1. C语言汇编pdf,c语言程序代码[汇编].pdf
  2. sqlcheck约束表达式怎么写_creo 5.0 建模实例教程----乌比莫斯之环教程(表达式扫描特征)...
  3. mysql、orcl中database、schema、user之间的关系
  4. 团队编程项目作业1-成员简介及分工
  5. shellcode编写
  6. Jenkins 安装FAQ
  7. linux 使用 byzanz 生成 gif 图片程序
  8. NodeJS无所不能:细数10个令人惊讶的NodeJS开源项目
  9. cocos2d-x初探学习笔记(1)--HelloWorld .
  10. 移动互联网和Android给你带来的机会[轉]