Python libvirt 模块接口使用
Python 调用 libvirt
安装 libvirt
yum install gcc
yum install python3-devel
yum install libvirt-python
wget http://mirrors.aliyun.com/repo/Centos-7.repo
yum install libvirt-devel gcc python3-devel libvirt-python -y
# ps: 多数情况下安装不上是因为 gcc 和 python3-devel 没有安装
基本使用
以上下文管理方式连接 libvirt
# 此处上下文用于下文:连接 libvirt
import libvirt
class ConnectLibvirt:
def __enter__(self):
conn = libvirt.open("qemu:///system")
return conn
def __exit__(self):
conn.close()
with ConnectLibvirt() as conn:
# 此时 conn 为 libvirt.open("qemu:///system") 对象
print(conn)
2.1 基本使用
# 导入 libvirt 模块
import libvirt
instance_name = "instance_name"
# 打开qemu
conn = libvirt.open("qemu:///system")
# 通过名字寻找虚拟机
dom = conn.lookupByName(instance_name)
# 伪代码 virtDomain 中的相关函数
class virtDomain:
# 获取虚拟机的名字
instance_name = dom.name()
# 获取虚拟机的 UUID
UUID = dom.UUIDString()
# 获取虚拟机最大内存(分配的内存)
maxMemory = dom.maxMemory()
# 获取虚拟机CPU数量
maxVcpus = dom.maxVcpus()
# 获取虚拟机的源数据
metadata =dom.metadata()
# 获取虚拟机内存相关信息
instance_memory = dom.memoryStats()
2.2 内存使用情况
import libvirt
coon = libvirt.open("qemu://system")
with ConnectLibvirt() as conn:
# 主机内存剩余获取 /1024/1024/1024
host_free_memory = conn.getFreeMemory()
# 虚拟机内存使用情况 instance 是一个字典
dom = conn.lookupByName()
instance_memory = dom.memoryStats()
instance_unused_memory = instance_memory["unused"] # 未被使用得内存
instance_total_memory = instance_memory["total"] # 被分配的
2.3 获取某一台 or 多台虚拟机的方式
### class virConnect 中的函数
# 寻找某一台虚拟机的相关信息
dom = conn.lookupByName(instance_name)
dom = conn.lookupByID(instance_id)
dom = conn.lookupByUUID(instance_uuid)
dom = conn.lookupByUUIDString(instance_uuid_str)
# 寻找 所有虚拟机 virDomains 对象;
# ps: dom_list 中的元素为 virDomains 对象。
dom_list = conn.listAllDomains()
for dom in dom_list:
print(dom.name())
dom.UUIDString()
# 获取所有虚拟机 ID
listDomainsID = conn.listDomainsID()
foi id in listDomainsID:
domain = conn.lookupByID(id)
instance_name = domain.name()
instance_UUID = domain.UUIDString()
# 列出 已经关机 的虚拟机名字
dom_list = conn.listDefinedDomains()
["name1", "name2"]
# 列出 所有开机的 虚拟机的 ID
dom_list = conn.listDomainsID()
[11, 12]
# ps 只要开机的虚拟机才能获取其 memory 相关熟悉
2.4 物理机相关信息获取
# import libvirt
coon = libvirt.open("qemu://system")
# 获取 CPU 数
cpu_nums = coon.getCPUMap()[0]
# 获取 avaiable 内存使用情况
ava_memory = coon.getFreeMemory()
其他:KVM气球动态扩容
# 获取虚拟机的内存使用情况
import libvirt
# 创建连接
conn = libvirt.open("qemu:///system")
# 获取所有 All 虚拟机
# dom_list = conn.listAllDomains()
# 获取所有 running 虚拟机
dom_list = conn.listDomainsID()
for dom in dom_list:
domain = conn.lookupByID(dom)
domain.setMemoryStatsPeriod(1)
instance_memory = domain.memoryStats()
total_memory = instance_memory["actual"]
unused_memory = instance_memory["unused"]
print(total_memory, unused_memory)
参考文档: https://blog.51cto.com/10616534/1878609
libvirt 创建虚拟机
1.条件准备
- 创建一个镜像
# 创建一个qcow2的稀疏文件虚拟磁盘文件, -f: 指定格式, -o:指定选项,/root/kvm.qcow2 表示指定创建的虚拟磁盘路径, 80G指定磁盘大小;
# 就是说刚创建出来的文件并没有8G,它会随着数据的增多慢慢增加,直到8G;
#
qemu-img create -f qcow2 -b /path/image_name.qcow2 -o preallocation=metadata -o backing_fmt=qcow2 /root/kvm.qcow2 80G
# backing_fmt, 设置后端镜像的镜像格式
- 创建一个 虚拟机xml 文件
# xml 文件中的变量为 name uuid source
# 以下为一个简写的xml
<domain type='kvm'>
# 虚拟机的名字
<name>idv-96c1b882-99aa-46f5-95c7-52daafa6fdf5</name>
# 虚拟机的uuid
<uuid>96c1b882-99aa-46f5-95c7-52daafa6fdf5</uuid>
<memory unit='KiB'>6291456</memory>
<currentMemory unit='KiB'>6291456</currentMemory>
<vcpu placement='static'>4</vcpu>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
# 虚拟机的镜像位置
<source file='/opt/idv/image/incrementImage/96c1b882-99aa-46f5-95c7-52daafa6fdf5.qcow2'/>
<target dev='sda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</disk>
</devices>
</domain>
2.Python 调用 libvirt 创建虚拟机
with ConnectLibvirt() as conn:
# 创建一个虚拟机 传入参数为: xml 字符串
conn.defineXML(xml)
libvirt 删除虚拟机
- 思路:
- 找到这台虚拟机
- 调用 libvirt 接口删除这台机器
def delete_instance(instance_name):
"""
instance_name: 虚拟机名字
"""
with ConnectLibvirt() as conn:
# 查找此虚拟机
dom = conn.lookupByName(instance_name)
# 删除虚拟机函数
dom.undefine()
libvirt 虚拟机开机
def start_instance(instance_name):
"""
instance_name: 虚拟机名字
"""
with ConnectLibvirt() as conn:
# 查找此虚拟机
dom = conn.lookupByName(instance_name)
# 虚拟机开机函数
dom.create()
libvirt 虚拟机关机
dom = conn.lookupByName(instance)
ret = dom.shutdownFlags()
def stop_instance(instance_name):
"""
instance_name: 虚拟机名字
"""
with ConnectLibvirt() as conn:
# 查找此虚拟机
dom = conn.lookupByName(instance_name)
# 删除虚拟机函数
# ret = dom.destroy()
ret = dom.shutdownFlags()
libvirt 获取虚拟机状态
def get_instance_state(instance_name):
"""
instance_name: 虚拟机名字
"""
with ConnectLibvirt() as conn:
# 查找此虚拟机
dom = conn.lookupByName(instance_name)
# 删除虚拟机函数
dom.state()
libvirt 重启虚拟机
def restart_instance(instance_name):
"""
instance_name: 虚拟机名字
"""
with ConnectLibvirt() as conn:
# 查找此虚拟机
dom = conn.lookupByName(instance_name)
# 重启虚拟机函数
dom.reboot()

浙公网安备 33010602011771号