使用 Python Libvirt 接口管理 KVM 虚拟机

内容目录

Libvirt 提供了一套强大的 API 接口,可以通过编程的方式调用 KVM,管理虚拟机。Libvirt 支持多种编程语言,包括 Python、C、Go 等,下面重点介绍 Python 调用 Libvirt 管理 KVM 虚拟机 的常用方法。


使用 Python Libvirt 接口管理 KVM 虚拟机

在 Python 中,Libvirt 提供了 libvirt 模块,可以直接操作 KVM 虚拟化平台。


1. 安装必要依赖

安装 Libvirt 库和 Python 绑定

在 Ubuntu 中执行以下命令:

sudo apt update
sudo apt install -y libvirt-dev python3-libvirt

确保 libvirt 服务正在运行:

sudo systemctl enable libvirtd
sudo systemctl start libvirtd

2. Libvirt 基本用法

导入模块并连接到 Hypervisor

通过 libvirt 连接到 KVM 的 qemu 后端:

import libvirt

# 连接到本地 KVM
conn = libvirt.open('qemu:///system')  # 本地系统连接
if conn is None:
    print("无法连接到 KVM")
    exit(1)

print("连接成功!")
  • 'qemu:///system':表示连接到系统级别的 KVM。
  • 'qemu:///session':表示用户级别的 KVM。

3. 虚拟机管理方法

获取虚拟机列表

获取运行中的虚拟机

for id in conn.listDomainsID():
    dom = conn.lookupByID(id)
    print(f"虚拟机 ID:{id}, 名称:{dom.name()}")

获取所有虚拟机

for name in conn.listDefinedDomains():
    print(f"已定义但未运行的虚拟机:{name}")

启动和关闭虚拟机

启动虚拟机

vm_name = "ubuntu-vm"
dom = conn.lookupByName(vm_name)
if dom.isActive() == 0:
    dom.create()
    print(f"虚拟机 {vm_name} 已启动")
else:
    print(f"虚拟机 {vm_name} 已经在运行中")

关闭虚拟机

if dom.isActive() == 1:
    dom.shutdown()
    print(f"虚拟机 {vm_name} 正在关闭")
else:
    print(f"虚拟机 {vm_name} 已经处于关闭状态")

定义与删除虚拟机

定义虚拟机(使用 XML)

可以通过 XML 文件定义虚拟机:

vm_xml = """
<domain type='kvm'>
  <name>test-vm</name>
  <memory unit='KiB'>1048576</memory>
  <vcpu>1</vcpu>
  <os>
    <type>hvm</type>
  </os>
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/test-vm.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='network'>
      <source network='default'/>
    </interface>
    <graphics type='vnc' port='-1' autoport='yes'/>
  </devices>
</domain>
"""

dom = conn.defineXML(vm_xml)
if dom:
    print("虚拟机定义成功")

删除虚拟机定义

dom.undefine()
print("虚拟机定义已删除")

快照管理

创建快照

snapshot_xml = """
<domainsnapshot>
  <name>snapshot1</name>
</domainsnapshot>
"""

dom.snapshotCreateXML(snapshot_xml, 0)
print("快照已创建")

列出快照

snapshots = dom.snapshotListNames()
print("快照列表:", snapshots)

恢复到快照

snapshot = dom.snapshotLookupByName("snapshot1")
dom.revertToSnapshot(snapshot)
print("已恢复到快照 snapshot1")

获取虚拟机信息

查看虚拟机状态

state, reason = dom.state()
print(f"虚拟机状态:{state}")

查看 CPU 和内存信息

info = dom.info()
print(f"CPU 数量:{info[3]}, 内存分配:{info[1]} KiB")

4. 磁盘与网络管理

查看磁盘信息

for disk in dom.blockList():
    print(f"磁盘:{disk}")

获取网络信息

for iface in dom.interfaceAddresses(libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_AGENT):
    print(f"网络接口:{iface}")

5. 关闭连接

脚本执行完毕后,关闭连接:

conn.close()
print("连接已关闭")

6. 综合示例:列出所有虚拟机并显示状态

import libvirt

# 连接到 KVM
conn = libvirt.open('qemu:///system')
if conn is None:
    print("无法连接到 KVM")
    exit(1)

# 列出运行中的虚拟机
print("运行中的虚拟机:")
for id in conn.listDomainsID():
    dom = conn.lookupByID(id)
    print(f"ID: {id}, 名称: {dom.name()}, 状态: 运行中")

# 列出已定义但未运行的虚拟机
print("\n未运行的虚拟机:")
for name in conn.listDefinedDomains():
    print(f"名称: {name}, 状态: 未运行")

conn.close()
print("\n操作完成!")

7. 其他高级操作

  • 动态调整 CPU 和内存:使用 dom.setMemory()dom.setVcpus()
  • 实时迁移虚拟机dom.migrate()
  • 性能监控:通过 dom.interfaceStats()dom.blockStats() 查看网络和磁盘 I/O。

8. 参考资料

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容