首页 > 代码库 > Linux实现KVM+QEMU+libvirt的虚拟机环境 并使用virsh对虚拟机进行管理

Linux实现KVM+QEMU+libvirt的虚拟机环境 并使用virsh对虚拟机进行管理

说明:
本文使用的实验环境是运行在windows10上的Vmware workstation 12.5 pro,宿主机操作系统是Ubuntu16(机器名称为KVM_test),kvm+qemu+libvirt安装在KVM_test上。运行在KVM_test上的客户机操作系统也是Ubuntu16(机器名称为test_ubuntu)。
本实验需要的软件有Vmware workstation、vnc viewer、ubuntu16的ios镜像。Vnc viewer需要注册码,请自行百度查找。
本实验所有的操作和文件均是放置在/home/joe/的目录下。如果使用其他目录,请自行适当更改后面所出现的命令。**



实验步骤:
首先需要在Vmware中安装好宿主机KVM_test,注意要在(虚拟机设置->硬件->处理器)里打开虚拟化,如下图箭头所指。宿主机的安装不是本实验的重点,在此不做过多赘述。
技术分享



安装完成宿主机之后,最好先检查一下是否能够联网,因为之后需要下载安装KVM-qemu和libvirt。
检查完成后在终端中使用命令lsmod | grep kvm,查看硬件是否支持辅助虚拟化。(如果之前没有在虚拟机设置中打开虚拟化的话这里可能看不到任何信息)。如有图中信息表示cpu支持硬件辅助虚拟化。
技术分享



接下来我们需要安装qemu-kvm,使用命令

sudo apt-get install qemu-kvm

安装qemu-kvm的软件包,由于软件源的原因可能需要比较长的时间。
技术分享



安装完qemu之后,我们要安装libvirt,使用命令:

sudo apt-get install libvirt-bin

libvirt,同样等待一段时间后,安装成功。
技术分享



安装完libvirt之后,我们需要安装virt-install
使用命令

sudo apt-get install virtinst

安装完成后我们就完成了初期的软件环境配置。
技术分享



接下来我们要给test_ubuntu划分一个磁盘空间,作为该虚拟机的硬盘。
使用命令

qemu-img create -f qcow2 test.qcow2 10G

其中10G表示磁盘空间的大小,大家可以根据需要进行调整。如果安装Ubuntu16这样的操作系统最好是有10G以上,要不然安装的时候会提示空间不足。
技术分享



新建一个demo.xml文件作为虚拟机的配置文件
使用命令:

touch demo.xml

使用命令gedit demo.xml编辑该文件,其内容如下

<domain type=‘kvm‘>
        <name>test_ubuntu</name> //虚拟机名称
        <memory>1048576</memory> //最大内存,单位k
        <currentMemory>1048576</currentMemory> //可用内存,单位k
        <vcpu>2</vcpu> //虚拟cpu个数
        <os>
          <type arch=‘x86_64‘ machine=‘pc‘>hvm</type>
          <boot dev=‘cdrom‘/> //光盘启动
       </os>
       <features>
         <acpi/>
         <apic/>
         <pae/>
       </features>
       <clock offset=‘localtime‘/>
       <on_poweroff>destroy</on_poweroff>
       <on_reboot>restart</on_reboot>
       <on_crash>destroy</on_crash>
       <devices>
         <emulator>/usr/bin/kvm</emulator>
         <disk type=‘file‘ device=‘disk‘>
          <driver name=‘qemu‘ type=‘qcow2‘/>
           <source file=‘/home/joe/test.qcow2‘/> //目的镜像路径
           <target dev=‘hda‘ bus=‘ide‘/>
         </disk>
         <disk type=‘file‘ device=‘cdrom‘>
           <source file=‘/home/joe/Ubuntu16.iso‘/> //光盘镜像路径
           <target dev=‘hdb‘ bus=‘ide‘/>
         </disk>
        <interface type=‘bridge‘> //虚拟机网络连接方式
          <source bridge=‘virbr0‘/> //当前主机网桥的名称
          <mac address="00:16:3e:5d:aa:a8"/> //为虚拟机分配mac地址,务必唯一,否则dhcp获得同样ip,引起冲突
        </interface>
        <input type=‘mouse‘ bus=‘ps2‘/>
         <graphics type=‘vnc‘ port=‘19‘ autoport=‘yes‘ listen = ‘0.0.0.0‘ keymap=‘en-us‘/>//vnc方式登录,端口号自动分配,自动加1,可以通过virsh vncdisplay来查询
       </devices>
     </domain>



在编写完配置文件之后,需要将下载好的Ubuntu16 的ios镜像复制到/home/joe/目录下,如图所示。
技术分享



然后执行命令

virsh define demo.xml

定义虚拟机及其配置信息。
技术分享
如果这里报错说找不到什么kvm目录的话可能就是配置文件里的这一行参数有问题。

<emulator>/usr/bin/kvm</emulator>

有的系统可能目录是/usr/bin/qemu或者是/usr/libexec/qemu-kvm
可以都尝试一下。



然后执行命令,启动虚拟机

virsh start test_ubuntu

执行命令查看当前运行的虚拟机状态

virsh list

执行命令可以看到该虚拟机对应的端口号

virsh vncdisplay test_ubuntu

于是我们可以使用vnc viewer 远程连接虚拟机(test_ubuntu)
技术分享


在使用vnc viewer连接虚拟机之前我们还需要知道当前的宿主机(也就是安装kvm的Ubuntu)的ip地址。所以我们使用命令 查看其网络信息如下。

ifconfig

技术分享


查看到ip地址后,我们就可以使用之前下载好的vnc viewer客户端连接虚拟机(test_ubuntu)了。
技术分享


由于是第一次开机,所以我们需要按照常规方法在test_ubuntu上安装Ubuntu16的操作系统。
技术分享



安装的过程和在实体机上安装没有任何区别,我们选择install Ubuntu,然后最简单的方式就是一直点continue就好了,接下来就是漫长的等待了。
安装完成后需要重启,点击restart now 就能重启test_ubuntu。
技术分享



重启之后,进入系统就是和宿主机一样熟悉的Ubuntu的桌面了。
技术分享


来一张总图,左边是宿主机KVM_test,右边是客户机test_ubuntu
技术分享


在能够成功访问客户机之后,我们先将客户机关闭。然后使用virsh命令对虚拟机的常见参数进行一些修改。
在宿主机中使用命令:

virsh shutdown test_ubuntu //关闭客户机

技术分享


`virsh setmem test_ubuntu 940000 
//表示将test_ubuntu 的内存设置`为940000KB约为896MB

在test_ubuntu中打开system monitor查看机器资源如下。
技术分享
对比之前的图,可以发现内存从992MB变成了886MB
(至于为什么设置的内存为896MB但是最后机器里只看到886MB我也不是很清楚,等以后研究清楚再更新)


我们再更改一下cpu的个数试试,使用命令:

virsh setvcpus test_ubuntu 4 //设置4个虚拟cpu

技术分享



出现了错误,提示说设置的cpu数不能大于定义的时候的cpu数。不过好像要调小cpu数也是不行的,会出现以下错误。
技术分享



关于要提高和减少cpu数,貌似只能够在关机情况下,修改虚拟机的配置文件来解决。
使用命令:

virsh edit test_ubuntu 

然后将vcpu属性改成4,然后使用Ctrl+x保存退出。
技术分享


再次启动客户机test_ubuntu,并查看资源值

virsh start test_ubuntu

并打开system monitor 可以看到如下图所示,cpu数从之前的2个变成了4个。
技术分享



Virsh除了能够进行内存和cpu的管理之外,还可以进行其他的一些管理,下面列出一些常用的命令参数。

virsh list                    #显示本地活动虚拟机
virsh list –all               #显示本地所有的虚拟机(活动的+不活动的)
virsh define ubuntu.xml       #通过配置文件定义一个虚拟机(这个虚拟机还不是活动的)
virsh start ubuntu            #启动名字为ubuntu的非活动虚拟机
virsh create ubuntu.xml       #创建虚拟机(创建后,虚拟机立即执行,成为活动主机)
virsh suspend ubuntu          #暂停虚拟机
virsh resume ubuntu           #启动暂停的虚拟机
virsh shutdown ubuntu         #正常关闭虚拟机
virsh destroy ubuntu          #强制关闭虚拟机
virsh dominfo ubuntu          #显示虚拟机的基本信息
virsh domname 2               #显示id号为2的虚拟机名
virsh domid ubuntu            #显示虚拟机id号
virsh domuuid ubuntu          #显示虚拟机的uuid
virsh domstate ubuntu         #显示虚拟机的当前状态
virsh dumpxml ubuntu          #显示虚拟机的当前配置文件(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给虚拟机分配id号、uuid、vnc端口号等等)
virsh setmem ubuntu 512000    #给不活动虚拟机设置内存大小
virsh setvcpus ubuntu 4       #给不活动虚拟机设置cpu个数
virsh edit ubuntu             #编辑配置文件(一般是在刚定义完虚拟机之后)

参数说明:
help 显示该命令的说明
quit 结束 virsh ,回到 Shell
connect 连接到指定的虚拟机服务器
create 启动一个新的虚拟机
destroy 删除一个虚拟机
start 开启(已定义的)非启动的虚拟机
define 从 XML 定义一个虚拟机
undefine 取消定义的虚拟机
dumpxml 转储虚拟机的设置值
list 列出虚拟机
reboot 重新启动虚拟机
save 存储虚拟机的状态
restore 回复虚拟机的状态
suspend 暂停虚拟机的执行
resume 继续执行该虚拟机
dump 将虚拟机的内核转储到指定的文件,以便进行分析与排错
shutdown 关闭虚拟机
setmem 修改内存的大小
setmaxmem 设置内存的最大值
setvcpus 修改虚拟处理器的数量

参考资料:
http://blog.csdn.net/panfengyun12345/article/details/16878873
http://blog.sina.com.cn/s/blog_999d1f4c0101f00g.html

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    Linux实现KVM+QEMU+libvirt的虚拟机环境 并使用virsh对虚拟机进行管理