Home > All > 用libvirt对qemu虚拟机进行简单管理

用libvirt对qemu虚拟机进行简单管理

  • 环境配置

系统使用ubuntu14.04桌面版。

#sudo apt-get install libvirt-bin virt-manager qemu-kvm python-dev

安装的包依次为livirt可执行文件、libvirt图形化管理界面、qemu虚拟机、python的依赖包。

测试成功:

#virsh –version

54t37_u6_5_sbu6c3s1

Qemu和virt-manager之后用的时候再验证。

Python的libvirt包可以导入时验证:

b36q2wbs_z3fex73

  • 功能叙述

暂时能实现的还不算多:

  1. 创建一个自定义的虚拟机;
  2. 虚拟机关机;
  3. 销毁虚拟机。
  • 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的库。

创建、关机、强制关机、销毁的命令都说一下吧:

  1. 创建虚拟机

创建虚拟机的前提是要有一个镜像来存放,通常是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连上去就可以了。

  1. 关闭和强制关闭和销毁

关闭(不是所有时候都有用,这里的关闭是正常关机):

#virsh shutdown 虚拟机名字

强制关闭:

#virsh destroy 虚拟机名字

销毁:

#virsh undefine 虚拟机名字

这里的销毁有个小问题,就是命令行销毁时只销毁列表里的虚拟机,但是qcow2或img镜像文件并没有删除,但是图形化管理工具可以删除相关的所有文件,但是所有文件包括了安装系统时使用的系统镜像。所以我感觉可以在undefine后再手动删除qcow2或img,当然可能需要提前将其位置存在某个变量里。

  • Pythonlibvirt库实现及问题及结果

用xml文件配置并创建:

代码较长,就用截图来代替

oqyjhv0ft06r8_74yh3y

第一部分是创建镜像文件并且将xml配置文件写入xmlconfig这个变量。

2b3x_ks_hzl4o4ycrg8

第二部分是先尝试通过libvirt的模块连接qemu,接下来用createXML方法创建xml配置文件并且启动客户端。(create命令就是通过xml启动客户端的)

不过前面的代码写了一堆事为了把xml文件里的关键信息抠出来做成自定义,直接用变量替换,raw_input输入,这样可以让用户自己决定xml文件,不过需要对用户输入的内容进行判断,不然直接将非法的值加入xml中,会导致无法创建正确的xml文件的客户端。

部分条件判断如下:

8cg3jylho35_93ldz7tld

另一个问题,也是写代码时遇到的,就是raw_input和input的区别,还有raw_input的数据类型。Raw_input的数据类型默认str,不过我在判断时需要比较数值大小,所以想改成int,不过改完后一定你还要改回来,因为xml的其他字符串的类型都是str,所以还要改回来,不然会报错:无法将str和int的字符串拼接起来。

结果示意:

57kuu0x6412y1le9x71

可以根据提示自己填,也可以直接留空回车默认配置。

v9iwi4grotipms42mr

双击vm-001或者点击后点击打开:

h9h72xtsrotwcxdjm75

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)

v7lsru_czd1_6olh9s91

其他两个也跟这个一样,就不写了。

其实可以在这个基础上,加上东西,比如先跳出来存活和非存活的主机名字,再让用户选择要操作的主机名,再加上判断主机在关闭时能否执行该操作,比如不能再关机时再关机。代码写好了,可惜老报没有这个函数,可能需要重新配置环境,也许编译安装了libvirt才可以。

You may alo like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注