技术分享
利用python 编写 简单 虚拟机管理
2020-10-22
利用python 编写 类似于 virsh 的虚拟机管理软件
第一步 请下载linux (本次演示利用 ubuntu 16.04 desktop 64位 下载链接 请自行百度)
第二步 虚拟机安装ubuntu 网络 记得选择 桥接 cpu 记得打开 虚拟化
第三步 进入 root 权限 更新 ubuntu 命令:apt-get update apt-get upgrade
第四步 安装三个包
第一个 qemu-kvm 命令 apt-get install qemu-kvm
第二个 libvirt-bin 命令 apt-get install libvirt-bin
第三个 python-libvirt 命令 apt-get install python-libvirt
第五步 编写 python 代码
基础的api函数:
conn = libvirt.open("qemu:///system") # 打开系统的 qemu 获取conn 连接
dom = conn.createXML(xmlconfig) # 创建一个临时的虚拟机
dom = conn.defineXML(xmlconfig) # 创建一个永久的虚拟机
dom.create( ) # 启动一个永久虚拟机(临时虚拟机创建自动启动)
dom.destroy( ) # 关闭一个虚拟机
dom.undefine( ) # 销毁一个虚拟机
dom.suspend( ) # 虚拟机暂停
dom.resume( ) # 虚拟机恢复
api简单分析:
conn =libvirt.open("qemu:///system")
获取一个qemu的系统连接创建虚拟机需要conn连接
dom = conn.createXML(xmlconfig)
创建一个临时的虚拟机需要获取一个 xml的信息根据xml信息来创建虚拟机
如果创建成功返回一个dom的域(虚拟机)的对象
conn.defineXML(xmlconfig)
创建一个临时的虚拟机需要获取一个 xml的信息根据xml信息来创建虚拟机
如果创建成功返回一个dom的域(虚拟机)的对象
dom.create( )
启动dom这个域利用 virsh工具可以查看虚拟机已经运行 list –all
dom.destroy( )
关闭dom这个域(虚拟机)
dom.undefine( )
销毁一个(域)虚拟机
dom.suspend( )
暂停一个(域)虚拟机
dom.resume( )
恢复暂停中的(域)虚拟机
代码分析:
import sys
import libvirt
导包(模块)
xmlfile =open("/home/tu/xml/demo.xml","r")
xmltext =xmlfile.read()
xmlconfig = xmltext
这是读取一个xml文件把xml内容读取成一个字符串
def open_qemu():
conn =libvirt.open("qemu:///system")
if conn ==None:
print('打开qemu错误qemu:///system')
exit(1)
returnconn
这是一个打开系统qemu的函数如果成功返回一个conn连接下面函数需要使用
如果失败打印错误退出程序
defcreate_domain(conn):
domVar =conn.createXML(xmlconfig)
if domVar== None:
print('创建临时虚拟机错误')
exit(1)
returndomVar
这是一个创建临时虚拟机的函数如果创建成功返回一个虚拟机对象 domVar下面程序可以使用
如果失败打印错误退出程序
def create_domain_permanent(conn):
domVar =conn.defineXML(xmlconfig)
if domVar== None:
print('创建永久虚拟机错误')
exit(1)
returndomVar
这是一个创建永久虚拟机的函数如果创建成功返回一个虚拟机对象 domVar下面程序可以使用
如果失败打印错误退出程序
defstart_domain(domVar):
if domVar== None:
print('启动虚拟机失败')
exit(1)
else:
domVar.create()
从上面获取的虚拟机对象domVar来启动虚拟机(只能启动永久虚拟机临时虚拟机创建就启动)
defstop_domain(domVar):
if domVar== None:
print('停止虚拟机失败')
exit(1)
else:
domVar.destroy()
从上面获取的虚拟机对象domVar来停止虚拟机(只能停止正在运行虚拟机)
defdestory_domain(domVar):
if domVar== None:
print('销毁虚拟机失败')
exit(1)
else:
domVar.undefine()
从上面获取的虚拟机对象domVar来销毁虚拟机
defsuspend_domain(domVar):
if domVar== None:
print('暂停虚拟机')
exit(1)
else:
domVar.suspend()
从上面获取的虚拟机对象domVar来暂停虚拟机
defresume_domain(domVar):
if domVar== None:
print('恢复虚拟机')
exit(1)
else:
domVar.resume()
从上面获取的虚拟机对象domVar来恢复虚拟机
注:上面的函数名都可以自定义
fuction_dictionary ={"create_domain":"创建临时域",\
"create_domain_permanent":"创建永久域",\
"start_domain":"启动域",\
"stop_domain":"停止域",\
"destory_domain":"删除域",\
"suspend_domain":"暂停域",\
"resume_domain":"恢复域",\
"help":"帮助",\
"quit":"退出"}
defshow_fuction(fuction_dictionary):
for k,v infuction_dictionary.items():
print("%s\t\t\t%s"%(k,v))
输出帮助信息
这是一个字典存的是函数的名字和对应的中文意思
你们可以直接利用print来输出帮助信息
def main():
conn =open_qemu()
whileconn:
chose= raw_input("CMD>>>").strip()
ifchose == "help":
show_fuction(fuction_dictionary)
elifchose == "create_domain":
creat_domain(conn)
elifchose == "create_domain_permanent":
create_domain_permanent(conn)
elifchose == "start_domain":
start_domain(conn)
elifchose == "stop_domain":
stop_domain(conn)
elifchose == "destory_domain":
destory_domain(conn)
elifchose == "suspend_domain":
suspend_domain(conn)
elifchose == "resume_domain":
resume_domain(conn)
elifchose == "quit":
conn.close()
print("Bye")
sys.exit()
else:
print("错误的命令请输入help显示帮助")
主函数接受用户输入的命令
执行相应的功能顺序为创建启动暂停恢复停止销毁(永久虚拟机)
创建暂停恢复停止销毁(临时虚拟机)
Xml文件分析' # ' 后面为注释
<domaintype='kvm'>
<name>demo</name>#虚拟机名字
<memory>1048576</memory>#内存大小换算成MB需要除以1024
<vcpu>1</vcpu># cpu个数
<os>#系统类型不用管
<typearch='x86_64' machine='pc'>hvm</type>
<bootdev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clockoffset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<disktype='file' device='disk'>
<sourcefile='/home/tu/img/ubuntu.img'/> #镜像路径修改成自己的
<drivername='qemu' type='raw'/>
<targetdev='hda' bus='ide'/>
</disk>
<inputtype='mouse' bus='ps2'/>
<graphicstype='vnc' port='-1' autoport='yes' keymap='en-us'/>
</devices>
</domain>
- 标签:
-
行业资讯