这其中的 info 包含了所需信息,看一下填充该字段的 virDomainGetBlockInfo 函数实现,用 GDB 跟一下它吧.
跟踪 src/libvirt-domain.c -> virDomainGetBlockInfo
先打个断点:
1 2
(gdb) break virDomainGetBlockInfo Breakpoint 1 at 0x7f4d4394a760: file libvirt-domain.c, line 6094.
再打开一个终端,执行一下命令:
1 2 3 4 5 6 7 8
[root@compute-01 ~]# virsh list Id Name State ----------------------------------- 2 instance-000001b6 running 3 instance-000001b8 running 4 instance-000001b9 running
(gdb) n 12421 virCheckFlags(0, -1); (gdb) n 12413 { (gdb) n 12414 virQEMUDriverPtr driver = dom->conn->privateData; (gdb) n 12421 virCheckFlags(0, -1); (gdb) n 12419 qemuBlockStatsPtr entry = NULL; (gdb) n 12414 virQEMUDriverPtr driver = dom->conn->privateData; (gdb) n 12421 virCheckFlags(0, -1); (gdb) n 12423 if (!(vm = qemuDomObjFromDomain(dom))) (gdb) n 12426 cfg = virQEMUDriverGetConfig(driver); (gdb) n 12428 if (virDomainGetBlockInfoEnsureACL(dom->conn, vm->def) < 0) (gdb) n 12431 if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) (gdb) n 12434 if (!(disk = virDomainDiskByName(vm->def, path, false))) { (gdb) n 12440 if (virStorageSourceIsEmpty(disk->src)) { (gdb) n 12448 if (!virDomainObjIsActive(vm)) { (gdb) n 12460 if (qemuDomainBlocksStatsGather(driver, vm, path, true, &entry) < 0) (gdb) n 12463 if (!entry->wr_highest_offset_valid) { (gdb) n 12466 if (virStorageSourceGetActualType(disk->src) == VIR_STORAGE_TYPE_FILE && (gdb) n 12468 info->allocation = entry->physical; (gdb) n 12466 if (virStorageSourceGetActualType(disk->src) == VIR_STORAGE_TYPE_FILE && (gdb) p info->allocation $2 = 0 (gdb) n 12470 info->allocation = entry->wr_highest_offset; (gdb) n 12484 if (entry->physical == 0 || info->allocation == 0 || (gdb) p info->allocation $3 = 32870912 (gdb) p entry->wr_highest_offset $4 = 32870912
至此,我们知道了 info -> allocation 的值来自 entry->wr_highest_offset ,接下来查看源码, entry->wr_highest_offset 的值应该是在这里被赋予的:
1 2
if (qemuDomainBlocksStatsGather(driver, vm, path, true, &entry) < 0) goto endjob;
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00007f4d4394a760 in virDomainGetBlockInfo at libvirt-domain.c:6094 breakpoint already hit 1 time (gdb) delete 1 (gdb) break qemuDomainBlocksStatsGather Breakpoint 2 at 0x7f4d208e3700: file qemu/qemu_driver.c, line 11427.