内容目录
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. 参考资料
- Libvirt 官方文档: https://libvirt.org
- Python Libvirt API: https://libvirt.org/python.html
- KVM XML 格式参考: https://libvirt.org/formatdomain.html
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容