IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> libcareplus一个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: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 **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;
 }

在第一条日志中添加了字符串,同时,增加一条日志,打印实际使用内存情况。

下面就可以使用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 list
 Id   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=2048

info: # virsh dommemstat 2

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


Copyright (C) CESTC Com.
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:50:06  更:2021-10-11 17:50:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:41:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码