KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法


Posted in Javascript onOctober 05, 2016

一.KVM简介

KVM(名称来自英语:Kernel-basedVirtual Machine的缩写,即基于内核的虚拟机),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。
KVM在具备Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。

关于KVM:

1).KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
2).是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
3).它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
4).KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
5).KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。
6).在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。

————摘自WIKI百科

KVM 与 vbox的区别
vbox 是由 qemu 改写而成,包含大量qemu 代码。

1).可以使用于"不支持"虚拟化技术的cpu。
2).值得说的一点:vbox 在图形方面比较好,能进行2D 3D加速;但cpu控制不理想(估计是因为图形支持的缘故);操作上有独立的图形界面,易于上手。

kvm 是linux内核包含的东西,使用qemu作为上层管理(命令行)。

1).要求cpu 必须支持虚拟化。
2).性能:作为服务器很好,可是图形能力十分的差。即使放电影,图像也是像刷油漆一样,一层一层的。
3).cpu使用率控制很好。
4).控制上比较简洁,功能比较丰富:比如使用“无敌功能”所有更改指向内存,你的镜像永远保持干净。“母镜像”功能让你拥有n个独立快照点。还有很多参数。另外,kvm作为内核级的虚拟机,刚开始发展关注的公司比较多——但是还没有达到商业应用的水平。

总体而言:在支持虚拟化的情况下,vbox 和 kvm 的性能差不多,主要是面向对象不同:kvm适用于服务器,vbox适用于桌面应用。
 
qemu 全称Quick Emulator。是独立虚拟软件,能独立运行虚拟机(根本不需要kvm)。kqemu是该软件的加速软件。kvm并不需要qemu进行虚拟处理,只是需要它的上层管理界面进行虚拟机控制。虚拟机依旧是由kvm驱动。所以,大家不要把概念弄错了,盲目的安装qemu和kqemu。qemu使用模拟器
 
KVM内存管理

 KVM继承了Linux系统管理内存的诸多特性,比如,分配给虚拟使用的内存可以被交换至交换空间、能够使用大内存页以实现更好的性能,以及对NUMA的支持能够让虚拟机高效访问更大的内存空间等。
 KVM基于Intel的EPT(ExtendedPage Table)或AMD的RVI(Rapid Virtualization Indexing)技术可以支持更新的内存虚拟功能,这可以降低CPU的占用率,并提供较好的吞吐量。
 此外,KVM还借助于KSM(Kernel Same-pageMerging)这个内核特性实现了内存页面共享。KSM通过扫描每个虚拟机的内存查找各虚拟机间相同的内存页,并将这些内存页合并为一个被各相关虚拟机共享的单独页面。在某虚拟机试图修改此页面中的数据时,KSM会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有相同GuestOS的虚拟机之间出现相同内存页面的概率是很的,比如共享库、内核或其它内存对象等都有可能表现为相同的内存页,因此,KSM技术可以降低内存占用进而提高整体性能。
 
相关连接:

KVM的官方地址:http://www.linux-kvm.org/page/Main_Page
KVM的Howto文档:http://www.linux-kvm.org/page/HOWTO
Kqemu源码地址:http://sourceforge.net/projects/kqemu/
Qemu下载地址:http://wiki.qemu.org/Main_Page
 
二.KVM虚拟化平台构建

1.安装准备
查看你的硬件是否支持虚拟化。命令:

#egrep '(vmx|svm)' /proc/cpuinfo

注意:

1).要有 vmx 或 svm 的标识才行。总的说来,AMD在虚拟化方面作得更好一些。
2).我用的是虚拟机,我使用了VBOX,发现其不支持硬件虚拟化,启动虚拟机后执行查看命令无法发现上述的选项;所以我就换成了VMware Workstation 10,并在虚拟机的设置中打开了CPU设置中的虚拟化引擎,选择了Intel VT-x/EPT或AMD-V/RVI(V)这个选项;具体设置如下图:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

2.安装KVM
由于Linux内核已经将KVM收录了,在安装系统时已经加入了KVM,我们只需要在命令行模式下启用KVM即可:
启用KVM模块

#modprobe kvm

功能区分intel/amd的启用:

#modprobe kvm-intel
# lsmod |grep kvm
kvm_intel       55496 0
kvm          337772 1 kvm_intel

3.KVM虚拟机创建和管理所依赖的组件介绍

KVM虚拟机的创建依赖qemu-kvm:
虽然kvm的技术已经相当成熟而且可以对很多东西进行隔离,但是在某些方面还是无法虚拟出真实的机器。比如对网卡的虚拟,那这个时候就需要另外的技术来做补充,而qemu-kvm则是这样一种技术。它补充了kvm技术的不足,而且在性能上对kvm进行了优化。

我们还可以使用virt-manager,virt-viewer来管理虚拟机;

我们在创建和管理KVM虚拟机时还需要libvirt这个重要的组件:
它是一系列提供出来的库函数,用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术,kvm、xen与lxc等,都可以调用libvirt提供的api对虚拟机进行管理。有这么多的虚拟机技术,它为何能提供这么多的管理功能那。是因为它的设计理念,它是面向驱动的架构设计。对任何一种虚拟机技术都开发设计相对于该技术的驱动。这样不同虚拟机技术就可以使用不同驱动,而且相互直接不会影响,方便扩展。而且libvirt提供了多种语言的编程接口,可以直接通过编程,调用libvirt提供的对外接口实现对虚拟机的操作。如今流行的云计算中的IaaS是与该库联系相当密切的。通过下图可以看出它的架构设计思想。

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

从该图可以看出,在libvirtapi之上会有很多个driver,对于每一种虚拟机技术都会有一种driver,用来充当该虚拟机技术与libvirt之间的包装接口。如此设计就可以避免libvirt需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用libvirt提供的接口来完成自己所需要的功能。

4.安装KVM所需组件

yum源提供了,直接安装:

#yum install -y qemu-kvm libvirt virt-manager

安装完成后启动libvirtd服务:

#service libvirtd start

会自动启动一个桥设备,这相当于VMware Workstation中的host-only仅主机的网络设备;

# ifconfig
eth0   Link encap:Ethernet HWaddr00:0C:29:3E:63:26 
     inet addr:172.16.31.7 Bcast:172.16.255.255 Mask:255.255.0.0
     inet6 addr: fe80::20c:29ff:fe3e:6326/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:25460 errors:0 dropped:0overruns:0 frame:0
     TX packets:9728 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1000
     RX bytes:35156437 (33.5 MiB) TXbytes:800196 (781.4 KiB)
 
lo    Link encap:Local Loopback 
     inet addr:127.0.0.1 Mask:255.0.0.0
     inet6 addr: ::1/128 Scope:Host
     UP LOOPBACK RUNNING MTU:65536 Metric:1
     RX packets:12 errors:0 dropped:0 overruns:0 frame:0
     TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:1024 (1024.0 b) TXbytes:1024 (1024.0 b)
 
virbr0  Link encap:Ethernet HWaddr52:54:00:30:54:41 
     inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:0 (0.0 b) TX bytes:0(0.0 b)

使用网桥管理命令查看:

# brctl show
bridge name   bridge id        STP enabled   interfaces
virbr0     8000.525400305441    yes       virbr0-nic

像VMware Workstation中我们需要创建物理桥接设备,可以使用virsh创建桥设备关联网卡到桥接设备上:
需要将NetworkManager服务关闭,开机启动也关闭:

# chkconfig NetworkManager off
# service NetworkManager stop

然后在创建桥接设备及关联网卡到桥接设备上:

# virsh iface-bridge eth0 br0

查看桥接设备及其他网络设备运行情况:

# ifconfig
br0   Link encap:Ethernet HWaddr00:0C:29:3E:63:26 
     inet addr:172.16.31.7 Bcast:172.16.255.255 Mask:255.255.0.0
     inet6 addr: fe80::20c:29ff:fe3e:6326/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:76 errors:0 dropped:0 overruns:0 frame:0
     TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:9781 (9.5 KiB) TXbytes:8957 (8.7 KiB)
 
eth0   Link encap:Ethernet HWaddr00:0C:29:3E:63:26 
     inet6 addr: fe80::20c:29ff:fe3e:6326/64 Scope:Link
     UP BROADCAST RUNNINGMULTICAST MTU:1500 Metric:1
     RX packets:176 errors:0 dropped:0 overruns:0 frame:0
     TX packets:97 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1000
     RX bytes:26793 (26.1 KiB) TXbytes:11385 (11.1 KiB)
 
lo    Link encap:Local Loopback 
     inet addr:127.0.0.1 Mask:255.0.0.0
     inet6 addr: ::1/128 Scope:Host
     UP LOOPBACK RUNNING MTU:65536 Metric:1
     RX packets:4 errors:0 dropped:0 overruns:0 frame:0
     TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:344 (344.0 b) TXbytes:344 (344.0 b)
 
virbr0  Link encap:Ethernet HWaddr52:54:00:30:54:41 
     inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:0 (0.0 b) TX bytes:0(0.0 b)

查看桥接设备:

# brctl show
bridge name   bridge id        STP enabled   interfaces
br0       8000.000c293e6326    yes       eth0
virbr0     8000.525400305441    yes       virbr0-nic

至此,我们的虚拟化平台就构建完毕,下面就开始在KVM虚拟化平台上创建和管理虚拟机,我们先使用qemu-kvm来创建和管理虚拟机。

三.使用qemu-kvm管理KVM虚拟机


1.Qemu-kvm介绍
Qemu是一个广泛使用的开源计算机仿真器和虚拟机。当作为仿真器时,可以在一种架构(如PC机)下运行另一种架构(如ARM)下的操作系统和程序。而通过动态转化,其可以获得很高的运行效率。当作为一个虚拟机时,qemu可以通过直接使用真机的系统资源,让虚拟系统能够获得接近于物理机的性能表现。qemu支持xen或者kvm模式下的虚拟化。当用kvm时,qemu可以虚拟x86、服务器和嵌入式powerpc,以及s390的系统。

QEMU 当运行与主机架构相同的目标架构时可以使用KVM。例如,当在一个x86兼容处理器上运行 qemu-system-x86 时,可以利用 KVM 加速——为宿主机和客户机提供更好的性能。

Qemu有如下几个部分组成:

处理器模拟器(x86、PowerPC和Sparc);
仿真设备(显卡、网卡、硬盘、鼠标等);
用于将仿真设备连接至主机设备(真实设备)的通用设备;
模拟机的描述信息;
调试器;
与模拟器交互的用户接口;

基于libvirt的工具如virt-manager和virt-install提供了非常便捷的虚拟机管理接口,但它们事实上上经二次开发后又封装了qemu-kvm的工具。因此,直接使用qemu-kvm命令也能够完成此前的任务。

2.Qemu-kvm的使用帮助

在RHEL6/CentOS6上,qemu-kvm位于/usr/libexec目录中。由于此目录不属于PATH环境变量,故无法直接使用,这样也阻止了可以直接使用qemu作为创建并管理虚拟机。如若想使用qemu虚拟机,可以通过将/usr/libexec/qemu-kvm链接为/usr/bin/qemu实现。

# ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm

qemu-kvm命令使用格式为“qemu-kvm [options] [disk_image]”,其选项非常多,不过,大致可分为如下几类。

标准选项;
USB选项;
显示选项;
i386平台专用选项;
网络选项;
字符设备选项;
蓝牙相关选项;
Linux系统引导专用选项;
调试/专家模式选项;
PowerPC专用选项;
Sparc32专用选项;

qemu-kvm的标准选项
qemu-kvm的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。

-name name:设定虚拟机名称;
-M machine:指定要模拟的主机类型,如Standard PC、ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”获取所支持的所有类型;
-m megs:设定虚拟机的RAM大小;
-cpu model:设定CPU模型,如coreduo、qemu64等,可以使用“qemu-kvm -cpu ?”获取所支持的所有模型;
-smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]:设定模拟的SMP架构中CPU的个数等、每个CPU的核心数及CPU的socket数目等;PC机上最多可以模拟255颗CPU;maxcpus用于指定热插入的CPU个数上限;
-numa opts:指定模拟多节点的numa设备;
-fda file
-fdb file:使用指定文件(file)作为软盘镜像,file为/dev/fd0表示使用物理软驱;
-hda file
-hdb file
-hdc file
-hdd file:使用指定file作为硬盘镜像;
-cdrom file:使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用;将file指定为/dev/cdrom可以直接使用物理光驱;
-drive option[,option[,option[,...]]]:定义一个硬盘设备;可用子选项有很多。
file=/path/to/somefile:硬件映像文件路径;
if=interface:指定硬盘设备所连接的接口类型,即控制器类型,如ide、scsi、sd、mtd、floppy、pflash及virtio等;
index=index:设定同一种控制器类型中不同设备的索引号,即标识号;
media=media:定义介质类型为硬盘(disk)还是光盘(cdrom);
snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或off;
cache=cache:定义如何使用物理机缓存来访问块数据,其可用值有none、writeback、unsafe和writethrough四个;
format=format:指定映像文件的格式,具体格式可参见qemu-img命令;
-boot [order=drives][,once=drives][,menu=on|off]:定义启动设备的引导次序,每种设备使用一个字符表示;不同的架构所支持的设备及其表示字符不尽相同,在x86 PC架构上,a、b表示软驱、c表示第一块硬盘,d表示第一个光驱设备,n-p表示网络适配器;默认为硬盘设备;
-boot order=dc,once=d

qemu-kvm的显示选项
显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。

-nographic:默认情况下,qemu使用SDL来显示VGA输出;而此选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台;
-curses:禁止图形接口,并使用curses/ncurses作为交互接口;
-alt-grab:使用Ctrl+Alt+Shift组合键释放鼠标;
-ctrl-grab:使用右Ctrl键释放鼠标;
-sdl:启用SDL;
-spice option[,option[,...]]:启用spice远程桌面协议;其有许多子选项,具体请参照qemu-kvm的手册;
-vga type:指定要仿真的VGA接口类型,常见类型有:
  cirrus:Cirrus Logic GD5446显示卡;
  std:带有Bochs VBI扩展的标准VGA显示卡;
  vmware:VMWare SVGA-II兼容的显示适配器;
  qxl:QXL半虚拟化显示卡;与VGA兼容;在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型;
  none:禁用VGA卡;
-vnc display[,option[,option[,...]]]:默认情况下,qemu使用SDL显示VGA输出;使用-vnc选项,可以让qemu监听在VNC上,并将VGA输出重定向至VNC会话;使用此选项时,必须使用-k选项指定键盘布局类型;其有许多子选项,具体请参照qemu-kvm的手册;

i386平台专用选项

-no-acpi:禁用ACPI功能,GuestOS与ACPI出现兼容问题时使用此选项;
-balloon none:禁用balloon设备;
-balloon virtio[,addr=addr]:启用virtio balloon设备;

网络属性相关选项
网络属性相关选项用于定义网络设备接口类型及其相关的各属性等信息。这里只介绍nic、tap和user三种类型网络接口的属性,其它类型请参照qemu-kvm手册。

-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]:创建一个新的网卡设备并连接至vlan n中;PC架构上默认的NIC为e1000,macaddr用于为其指定MAC地址,name用于指定一个在监控时显示的网上设备名称;emu可以模拟多个类型的网卡设备,如virtio、i82551、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,其支持的类型可能只包含前述列表的一部分,可以使用“qemu-kvm -net nic,model=?”来获取当前平台支持的类型;
-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]:通过物理机的TAP网络接口连接至vlan n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本;
-net user[,option][,option][,...]:在用户模式配置网络栈,其不依赖于管理权限;有效选项有:
  vlan=n:连接至vlan n,默认n=0;
  name=name:指定接口的显示名称,常用于监控模式中;
  net=addr[/mask]:设定GuestOS可见的IP网络,掩码可选,默认为10.0.2.0/8;
  host=addr:指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2;
  dhcpstart=addr:指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31;
  dns=addr:指定GuestOS可见的dns服务器地址;默认为GuestOS网络中的第三个地址,即x.x.x.3;
  tftp=dir:激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录;
  bootfile=file:BOOTP文件名称,用于实现网络引导GuestOS;如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0

3.使用qemu-kvm安装虚拟机Guest OS

测试安装windows xp

1).下载系统镜像文件,我这里有个windows XP的ghost系统,我们来试着安装。

winxp_ghost.iso
 
创建虚拟机的磁盘文件存放目录:

# mkdir /kvm/images -pv
 
创建虚拟磁盘文件:

# qemu-img create -o preallocation=metadata -f qcow2 /kvm/images/winxp.qcow2 60G
# ll -h /kvm/images/
total 9.6M
-rw-r--r-- 1 root root 61G Feb 7 23:50 winxp.qcow2

2).在kvm平台安装vnc-server和tigervnc这个vncviewer

# yum install vnc-server tigervnc -y
设置vncserver的密码;
# vncpasswd
Password:
Verify:
启动vncserver
# vncserver
 
New 'createOS:1 (root)' desktop iscreateOS:1
 
Creating default startup script/root/.vnc/xstartup
Starting applications specified in/root/.vnc/xstartup
Log file is /root/.vnc/createOS:1.log

我们通过windows客户端的vncviewer连接到虚拟机上进行操作;

输入虚拟化平台ip地址:

 KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

输入VNC服务器的密码:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

进入虚拟化平台:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

等待后续操作。

3).安装虚拟机
我们在命令行模式下安装启动虚拟机:
创建一个名为winxp的虚拟机,其RAM大小为512MB,有一颗CPU的SMP架构,默认引导设备是硬盘,有一个光驱设备和硬盘设备,usb设备为tablet;

#qemu-kvm -cpu host -smp 1 -name winxp -m 512 -drive file=/kvm/images/winxp.qcow2,if=ide,meida=disk,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom -boot dc -usbdevice tablet

启动后如图:

 KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

我们到图形界面上进行连接:

#vncviewer :5900

 KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

我这里进入winpe安装系统:

 KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

选择全自动恢复GHO镜像到C盘,开始安装:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

安装完毕后重启就黑屏了。
进不去,算了,就这样吧。
我们下面使用一个测试系统cirros来测试KVM的虚拟化平台;

4.安装cirros虚拟机

1).cirros镜像文件下载
镜像下载
32位镜像下载地址:https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-i386-disk.img
64位镜像的下载地址:https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img

我这里使用的是cirros-0.3.0-x86_64-disk.img
我们查看一些镜像文件信息:

# qemu-imginfocirros-0.3.0-x86_64-disk.img
image: cirros-0.3.0-x86_64-disk.img
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 9.3M
cluster_size: 65536

2).安装启动cirros虚拟机
我们在启动虚拟机时加入网卡设备。

# mv cirros-0.3.0-x86_64-disk.img /kvm/images

如果我们加入网卡设备,那么必须要涉及到系统启动后桥接网络到br0上,我们通过脚本实现启动和停止系统时桥接网络和删除桥接的自动执行操作:
启动虚拟机将网卡桥接到桥接设备上:

# cat /etc/qemu-ifup
#!/bin/bash
#
bridge=br0
 
if [ -n "$1" ]; then
  ip link set $1 up
  sleep 1
  brctl addif $bridge $1
  [ $? -eq 0 ] && exit 0 || exit 1
else
  echo "Error: no interfacespecified."
  exit 1
fi

关闭虚拟机后自动将网卡从桥接设备上移除:

# cat/etc/qemu-ifdown
#!/bin/bash
#
bridge=br0
 
if [ -n "$1" ];then
  brctl delif $bridge $1
  ip link set $1 down
  exit 0
else
  echo "Error: no interfacespecified."
  exit 1
fi

给予脚本执行权限;

#chmod +x /etc/qemu-ifup
#chmod +x /etc/qemu-ifdown

启动cirros虚拟机系统:

# qemu-kvm -m 128 -name cirros -drive file=/kvm/images/cirros-0.3.0-x86_64-disk.img,media=disk,format=qcow2,if=ide-net nic -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -boot c

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

启动完成后,通过vncviewer连接我们启动的虚拟机:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

输入用户名和密码进入系统并且切换到root用户:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

查看虚拟机的网卡:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

使用ping测试,测试到达网关与否:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

再到KVM虚拟化平台上查看一下vnet0是否生成:

[root@createOS ~]#ifconfig
br0   Link encap:Ethernet HWaddr00:0C:29:3E:63:26 
     inetaddr:172.16.31.7 Bcast:172.16.255.255 Mask:255.255.0.0
     inet6 addr:fe80::20c:29ff:fe3e:6326/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:380906errors:0 dropped:0 overruns:0 frame:0
     TX packets:165151errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:748466471 (713.7MiB) TXbytes:78691011 (75.0 MiB)
 
eth0   Link encap:Ethernet HWaddr00:0C:29:3E:63:26 
     inet6 addr:fe80::20c:29ff:fe3e:6326/64 Scope:Link
     UP BROADCAST RUNNINGMULTICAST MTU:1500 Metric:1
     RX packets:838156errors:0 dropped:0 overruns:0 frame:0
     TX packets:206259errors:0 dropped:0 overruns:0 carrier:0
     collisions:0txqueuelen:1000
     RX bytes:864246873 (824.2MiB) TXbytes:80899673 (77.1 MiB)
 
lo    Link encap:Local Loopback 
     inetaddr:127.0.0.1 Mask:255.0.0.0
     inet6 addr: ::1/128Scope:Host
     UP LOOPBACK RUNNING MTU:65536 Metric:1
     RX packets:91986 errors:0dropped:0 overruns:0 frame:0
     TX packets:91986 errors:0dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:85874602 (81.8MiB) TXbytes:85874602 (81.8 MiB)
 
virbr0  Link encap:Ethernet HWaddr52:54:00:30:54:41 
     inetaddr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
     UP BROADCAST RUNNINGMULTICAST MTU:1500 Metric:1
     RX packets:0 errors:0dropped:0 overruns:0 frame:0
     TX packets:0 errors:0dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:0 (0.0 b) TX bytes:0(0.0 b)
 
vnet0  Link encap:Ethernet HWaddrC6:E4:5A:0D:A1:1C 
     inet6 addr:fe80::c4e4:5aff:fe0d:a11c/64 Scope:Link
     UP BROADCAST RUNNINGMULTICAST MTU:1500 Metric:1
     RX packets:85 errors:0dropped:0 overruns:0 frame:0
     TX packets:33815 errors:0dropped:0 overruns:0 carrier:0
     collisions:0txqueuelen:500
     RX bytes:6866 (6.7KiB) TXbytes:9643416 (9.1 MiB)

至此,一个完整的cirros虚拟机就完成安装了。

5.Qemu监视器的使用

我们可以通过Qemu监视器来监测虚拟机的运行情况;
1).Qemu监视器打开的方式:
图形窗口模式的打开方式:
CTRL+ALT+2 :通过输入快捷键就能打开Qemu的监视器;
CTRL+ALT+1 :输入快捷键即可返回虚拟化机界面;

文本窗口模式的打开方式:
CTRL+a c :这组快捷键可以实现虚拟机界面和Qemu监视器之间的切换;

注意:如果需要让虚拟机运行在文本窗口模式,我们需要在创建和启动虚拟机时键入:-nographic的选项。

2).打开cirros虚拟机的Qemu监视器

按CRTL+ALT+2组合键即可打开Qemu监视器;
如图所示:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法 

3).Qemu监视器下的常用命令

help:显示帮助
info:显示一些虚拟机系统信息的
     如:infocpus,infotlb
savevm,loadvm,delvm:保存、装载、删除虚拟机快照
commit:提交虚拟机修改部分
change:改变虚拟机配置
     如:changevncpassword
device_add&device_del:实现动态添加和移除设备
usb_add&usb_del:添加和移除usb设备
migrate,migrate_cancel:迁移和取消迁移指令
cpu:设定默认CPU
log&logfile:记录日志和将日志记录到日志文件中
sendkey:向虚拟机发送指令
system_powerdown:向客户端发送关闭电源通知
system_reset:重启虚拟机
system_wakeup:唤醒虚拟机
q or quit:退出qemu监视器,qemu进程会终止;

6.我们启动一个在文本窗口模式下的虚拟机
我们再次下载一个cirros虚拟机磁盘镜像文件,将其名称更改后启动:

# cp cirros-0.3.0-x86_64-disk.img /kvm/images/cirros-0.3.0-x86_64-disk2.img

启动cirros虚拟机:

# qemu-kvm -m 128 -name cirros2 -drive file=/kvm/images/cirros-0.3.0-x86_64-disk2.img,media=disk,format=qcow2,if=ide -net nic tap,ifname=vnet1,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -boot c -nographic

启动会进行30次云环境探测,我们可以忽略其错误;

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

启动会在虚拟终端自动进行,启动后如图:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法 

这里会存在一个问题,就是我们未指定网卡的mac地址,会造成启动的两台虚拟机的IP地址是一致的,mac地址都是52:54:00:12:34:56 ,如图:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

我们必须指定虚拟机的mac地址来避免虚拟机IP地址一致性问题。

使用快捷键切换到qemu监视器,先按CTRL+a 后松手输入“c”字母即可进入qemu的监视器:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

我们可以发现一个优点是文本窗口模式下的qemu监视器的命令行可以翻页,是不是比图形化的好啊! <^_^>!

下面我们停止文本窗口的虚拟机,指定好mac地址后再启动虚拟机哦!
同样按组合键CTRL+a 再按c切换到虚拟机界面输入poweroff关闭虚拟机电源:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

再次启动虚拟机:指定好mac地址哦!

# qemu-kvm -m 128 -name cirros2 -drive file=/kvm/images/cirros-0.3.0-x86_64-disk2.img,media=disk,format=qcow2,if=ide-net nic,macaddr=52:54:00:65:43:21 -net tap,ifname=vnet1,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -boot c -nographic

启动后如图:

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

地址分配的不一样了。
我们来测试一下能否ping通第一台虚拟机;
测试ping通,桥接网络是互通的。

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法

至此,基于Qemu-kvm创建和管理虚拟机的实验就完成了

Javascript 相关文章推荐
javascript 文本框水印/占位符(watermark/placeholder)实现方法
Jan 15 Javascript
JS中Iframe之间传值的方法
Mar 11 Javascript
FireBug 调试JS入门教程 如何调试JS
Dec 23 Javascript
ext combobox动态加载数据库数据(附前后台)
Jun 17 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
May 13 Javascript
JavaScript中的acos()方法使用详解
Jun 14 Javascript
三分钟带你玩转jQuery.noConflict()
Feb 15 Javascript
Node.js 文件夹目录结构创建实例代码
Jul 08 Javascript
JS快速实现移动端拼图游戏
Sep 05 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
Dec 07 Javascript
Angular6 正则表达式允许输入部分中文字符
Sep 10 Javascript
layui table去掉右侧滑动条的实现方法
Sep 05 Javascript
js改变html的原有内容实现方法
Oct 05 #Javascript
浅谈javascript:两种注释,声明变量,定义函数
Oct 05 #Javascript
jQuery 局部div刷新和全局刷新方法总结
Oct 05 #Javascript
浅谈jQuery添加的HTML,JS失效的问题
Oct 05 #Javascript
jQuery的Cookie封装,与PHP交互的简单实现
Oct 05 #Javascript
jQuery实现手机版页面翻页效果的简单实例
Oct 05 #Javascript
浅谈jQuery双事件多重加载的问题
Oct 05 #Javascript
You might like
自动跳转中英文页面
2006/10/09 PHP
生成php程序的php代码
2008/04/07 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
php链式操作的实现方式分析
2019/08/12 PHP
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
python带参数打包exe及调用方式
2019/12/21 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
Python3开发环境搭建详细教程
2020/06/18 Python
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
大学毕业生的自我鉴定
2013/11/30 职场文书
面试后的感谢信范文
2014/02/01 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
成本会计实训报告
2014/11/05 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript