You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过libvirt-python获取磁盘实际大小?三个相关问题

解答你的libvirt磁盘信息相关问题

1. 用libvirt-python实现virsh domblkinfo的功能

直接调用libvirt-python中的virDomainGetBlockInfo方法即可实现,以下是示例代码:

import libvirt

# 连接本地libvirt服务
conn = libvirt.open('qemu:///system')
if not conn:
    raise SystemExit('无法连接到libvirt服务')

# 通过ID获取目标虚拟机域
dom = conn.lookupByID(10)
if not dom:
    raise SystemExit('找不到指定的虚拟机')

# 获取磁盘vda的信息,返回包含capacity、allocation、physical的字典
try:
    block_info = dom.blockInfo('vda')
    print(f"Capacity: {block_info['capacity']}")
    print(f"Allocation: {block_info['allocation']}")
    print(f"Physical: {block_info['physical']}")
except libvirt.libvirtError as e:
    print(f"获取磁盘信息失败: {e}")

# 关闭连接
conn.close()

注意:参数传入磁盘的目标设备名(如vda)即可,返回的三个值单位均为字节。如果遇到显示unknown的情况,大概率是设备名错误,或者虚拟机处于离线状态(部分磁盘信息需要虚拟机在线才能读取)。

2. 关于文档中“块大小”的歧义

你的判断是对的,virsh domblkinfo返回的数值单位就是字节。文档里的“块大小”属于表述模糊,实际指的是存储块的总字节数,而非单个磁盘块的大小(比如4KB这类)。你可以直接将数值除以1024**3转换成GiB,或者除以10**9转换成十进制GB,就能和宿主机/客户机内的数值对应上。

3. 多出的5GB容量来源排查

你遇到的“qemu-img定义25GB,但virsh显示30GB”的问题,常见原因有以下几种:

  • 镜像缩容不彻底:如果该磁盘曾扩容到30GiB,之后用qemu-img resize --shrink缩小到25GiB,但未删除所有快照(qcow2存在快照时无法真正完成缩容),会导致libvirt仍读取到原有的最大容量。可以用qemu-img info <镜像路径>查看virtual size字段,确认镜像实际定义的容量。
  • libvirt域XML配置不匹配:通过virsh edit 10查看虚拟机的XML配置,找到磁盘对应的<capacity>标签,检查数值是否为30GiB。如果是,说明XML配置与实际镜像大小不一致,手动修改为25GiB并重启虚拟机即可。
  • 后端存储容量干扰:如果磁盘基于LVM卷、iSCSI等后端存储而非本地qcow2文件,libvirt可能读取的是后端存储的总容量,而非qcow2的虚拟容量,这种情况需要核对后端存储的实际配置。
  • 客户机识别的是分区而非磁盘:如果客户机内看到的25GB是分区大小而非整个磁盘容量,那磁盘本身确实是30GiB,只是剩余空间未进行分区。可以在客户机内用fdisk -l查看整个磁盘的总大小。

内容的提问来源于stack exchange,提问作者PatrickF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:15:55