Libvirt domblkinfo 命令源码跟踪记 (GDB)

Libvirt domblkinfo 命令源码跟踪记 (GDB)

💡 原文中文,约7200字,阅读约需18分钟。
📝

内容提要

本文讨论了如何使用GDB调试libvirt命令,特别是分析KVM虚拟机磁盘使用情况不准确的问题。通过跟踪libvirtd进程,作者深入源码,检查了domblkinfo命令的执行过程,发现信息获取函数virDomainGetBlockInfo的实现细节,最终定位到QEMU的query-block协议,揭示了磁盘使用情况查询的调用栈。

🎯

关键要点

  • 使用 GDB 跟踪 libvirt 命令执行过程,发现 KVM 虚拟机磁盘利用率不准确的问题。

  • 通过 virsh 命令查看磁盘使用情况,发现返回的容量、分配和物理值相同,显示存在问题。

  • 分析源码,找到获取信息的函数 virDomainGetBlockInfo,并跟踪其执行过程。

  • 在跟踪过程中发现 info->allocation 的值来自 entry->wr_highest_offset,进一步分析其赋值过程。

  • 最终定位到 libvirt 调用 QEMU 的 query-block 协议,揭示了磁盘使用情况查询的调用栈。

延伸问答

如何使用GDB调试libvirt命令?

可以通过跟踪libvirtd进程,使用GDB设置断点并逐步执行代码来调试libvirt命令。

KVM虚拟机磁盘利用率不准确的原因是什么?

原因在于libvirt获取磁盘信息的函数virDomainGetBlockInfo实现存在问题,导致返回的容量、分配和物理值相同。

virsh命令返回的磁盘信息有什么问题?

返回的容量、分配和物理值相同,显示出磁盘使用情况查询存在问题。

如何定位libvirt调用QEMU的query-block协议?

通过分析源码,跟踪virDomainGetBlockInfo函数的调用过程,最终发现libvirt调用了QEMU的query-block协议。

在调试过程中如何设置GDB断点?

可以使用命令`break`设置断点,例如在virDomainGetBlockInfo函数的特定行设置断点。

libvirt查询磁盘使用情况的调用栈是怎样的?

libvirt查询磁盘使用情况的调用栈涉及多个函数,包括virDomainGetBlockInfo和qemuDomainGetBlockInfo等,最终调用QEMU的query-block协议。

➡️

继续阅读