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()
posted @ 2021-03-25 10:55  隔江千万里  阅读(3061)  评论(0)    收藏  举报