- 环境配置
系统使用ubuntu14.04桌面版。
#sudo apt-get install libvirt-bin virt-manager qemu-kvm python-dev
安装的包依次为livirt可执行文件、libvirt图形化管理界面、qemu虚拟机、python的依赖包。
测试成功:
#virsh –version
Qemu和virt-manager之后用的时候再验证。
Python的libvirt包可以导入时验证:
- 功能叙述
暂时能实现的还不算多:
- 创建一个自定义的虚拟机;
- 虚拟机关机;
- 销毁虚拟机。
- Libvirt自带工具实现管理
可以先说一下直接使用shell管理qemu的方式。
就是刚才验证的virsh,libvirt与虚拟机交互的虚拟终端。
所有关于qemu或kvm的操作基本virsh都有:
命令 | Description |
help | 打印基本帮助信息。 |
list | 列出所有客户端。 |
dumpxml | 输出客户端 XML 配置文件。 |
create | 从 XML 配置文件生成客户端并启动新客户端。 |
start | 启动未激活的客户端。 |
destroy | 强制客户端停止。 |
define | 为客户端输出 XML 配置文件。 |
domid | 显示客户端 ID。 |
domuuid | 显示客户端 UUID。 |
dominfo | 显示客户端信息。 |
domname | 显示客户端名称。 |
domstate | 显示客户端状态。 |
quit | 退出这个互动终端。 |
reboot | 重新启动客户端。 |
restore | 恢复以前保存在文件中的客户端。 |
resume | 恢复暂停的客户端。 |
save | 将客户端当前状态保存到某个文件中。 |
shutdown | 关闭某个域。 |
suspend | 暂停客户端。 |
undefine | 删除与客户端关联的所有文件。 |
migrate | 将客户端迁移到另一台主机中。 |
命令 | Description |
setmem | 为客户端设定分配的内存。 |
setmaxmem | 为管理程序设定内存上限。 |
setvcpus | 修改为客户端分配的虚拟 CPU 数目。 |
vcpuinfo | 显示客户端的虚拟 CPU 信息。 |
vcpupin | 控制客户端的虚拟 CPU 亲和性。 |
domblkstat | 显示正在运行的客户端的块设备统计。 |
domifstat | 显示正在运行的客户端的网络接口统计。 |
attach-device | 使用 XML 文件中的设备定义在客户端中添加设备。 |
attach-disk | 在客户端中附加新磁盘设备。 |
attach-interface | 在客户端中附加新网络接口。 |
detach-device | 从客户端中分离设备,使用同样的 XML 描述作为命令attach-device。 |
detach-disk | 从客户端中分离磁盘设备。 |
detach-interface | 从客户端中分离网络接口。 |
命令 | Description |
version | 显示 virsh 版本 |
nodeinfo | 有关管理程序的输出信息 |
其实这样看的话,那么操作其实很简单的,不过之所以写py是因为想锻炼一下而已,所以还要使用不太成熟的python-libvirt的库。
创建、关机、强制关机、销毁的命令都说一下吧:
- 创建虚拟机
创建虚拟机的前提是要有一个镜像来存放,通常是qcow2或img格式,所以肯定要先创建一个固定大小的镜像:
#qemu-img create -f qcow2 /var/qemu-vm/路径名 镜像名.qcow2 文件大小
当提示成功创建时说明可以继续操作。
接下来可以直接使用命令行安装系统:
<pre>
#virt-install --connect qemu:///system -n vm1 -r 512 --vcpus=2 --disk path=/var/lib/libvirt/images/vm1.img,size=12 -c ubuntu-11.10-server-amd64.iso --vnc --noautoconsole --os-type Linux --accelerate –hvm
也还有另一种创建方式:用xml配置文件来配置虚拟机并创建:
#vm1.xml <domain type='qemu'> <name>windowsXP</name> <uuid></uuid> <memory>500000</memory> <currentMemory>500000</currentMemory> <vcpu>1</vcpu> <os> <type arch='i686'machine='pc'>hvm</type> <boot dev='hd'/> <boot dev='cdrom'/> </os> <devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file' device='cdrom'> <sourcefile='/home/turnupthesun/kvm/windowsXP.iso'/> <target dev='hdc'/> <readonly/> </disk> <disk type='file' device='disk'> <sourcefile='/home/turnupthesun/kvm/windowsXP.img'/> <target dev='hda'/> </disk> <graphicstype='vnc' port='14' listen='127.0.0.1'/> </devices> </domain>
下面介绍其中几个比较重要的元素及属性。
1).<domain>元素的type属性指定运行域的虚拟机管理器,针对kvm应当选择“qemu”。
2)<name>元素的内容指定域的名字。
3)<memory>元素和<currentMemory>元素的内容非别指定启动时为域分配的最大内存和实际分配的内存。
4)<os></os>元素之间的内容用来指定操作系统启动的一些信息。其中重复的<boot>元素形成了一个启动顺序表,比如例子中先从磁盘启动,磁盘无法启动再从光盘启动。
5)<disk>元素的device属性指明不同的设备,<source>标签的file属性指明这些设备的位置。
基本一些关于虚拟机基本信息都在xml里可以配置。
如果用xml配置文件创建虚拟机,我们可以用如下命令来开启定义并开启虚拟机:
#virsh define vm1.xml #virsh start 虚拟机名字
接下来可以打开virt-manager的图形管理:
#virt-manager –c ‘qemu:///system’
会跳出来一个框,看到上面有个虚拟机名字跟之前定义的一样就对了,再打开vnc连上去就可以了。
- 关闭和强制关闭和销毁
关闭(不是所有时候都有用,这里的关闭是正常关机):
#virsh shutdown 虚拟机名字
强制关闭:
#virsh destroy 虚拟机名字
销毁:
#virsh undefine 虚拟机名字
这里的销毁有个小问题,就是命令行销毁时只销毁列表里的虚拟机,但是qcow2或img镜像文件并没有删除,但是图形化管理工具可以删除相关的所有文件,但是所有文件包括了安装系统时使用的系统镜像。所以我感觉可以在undefine后再手动删除qcow2或img,当然可能需要提前将其位置存在某个变量里。
- Python的libvirt库实现及问题及结果
用xml文件配置并创建:
代码较长,就用截图来代替
第一部分是创建镜像文件并且将xml配置文件写入xmlconfig这个变量。
第二部分是先尝试通过libvirt的模块连接qemu,接下来用createXML方法创建xml配置文件并且启动客户端。(create命令就是通过xml启动客户端的)
不过前面的代码写了一堆事为了把xml文件里的关键信息抠出来做成自定义,直接用变量替换,raw_input输入,这样可以让用户自己决定xml文件,不过需要对用户输入的内容进行判断,不然直接将非法的值加入xml中,会导致无法创建正确的xml文件的客户端。
部分条件判断如下:
另一个问题,也是写代码时遇到的,就是raw_input和input的区别,还有raw_input的数据类型。Raw_input的数据类型默认str,不过我在判断时需要比较数值大小,所以想改成int,不过改完后一定你还要改回来,因为xml的其他字符串的类型都是str,所以还要改回来,不然会报错:无法将str和int的字符串拼接起来。
结果示意:
可以根据提示自己填,也可以直接留空回车默认配置。
双击vm-001或者点击后点击打开:
Xml里配置了vnc的话其实可以将其端口映射到本地0端口,直接vnc连上127.0.0.1:0直接连上也可以,不用打开virt-manager图形化界面。
关闭那些的都用的virsh直接import os后执行shell命令了,因为不知道为啥在我系统里说libvirt没有那个函数,不过我看过python库里的libvirt.py,里面是有shutdown、destroy函数的:
from __future__ import print_function import sys import libvirt import os from sys import argv domain = argv[1] os.system('virsh shutdown '+domain)
其他两个也跟这个一样,就不写了。
其实可以在这个基础上,加上东西,比如先跳出来存活和非存活的主机名字,再让用户选择要操作的主机名,再加上判断主机在关闭时能否执行该操作,比如不能再关机时再关机。代码写好了,可惜老报没有这个函数,可能需要重新配置环境,也许编译安装了libvirt才可以。