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

一 .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 VTAMD-V)的Linux全虚拟化解决方案。
3).它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.kokvm-intel.kokvm-AMD.ko)。
4).KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
5).KVM能在不改变linuxwindows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。
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) 这个选项;具体设置如下图:

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 是与该库联系相当密切的。通过下图可以看出它的架构设计思想。

从该图可以看出,在 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地址:

输入 VNC 服务器的密码:

进入虚拟化平台:

等待后续操作。

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

启动后如图:

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

#vncviewer :5900

我这里进入 winpe 安装系统:

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

安装完毕后重启就黑屏了。

进不去,算了,就这样吧。

我们下面使用一个测试系统 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

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

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

查看虚拟机的网卡:

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

再到 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 监视器;

如图所示:

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 次云环境探测,我们可以忽略其错误;

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

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

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

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

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

下面我们停止文本窗口的虚拟机,指定好 mac 地址后再启动虚拟机哦!

同样按组合键 CTRL+a  再按 c 切换到虚拟机界面输入 poweroff 关闭虚拟机电源:

再次启动虚拟机:指定好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

启动后如图:

地址分配的不一样了。

我们来测试一下能否 ping通 第一台虚拟机;

测试 ping 通,桥接网络是互通的。

至此,基于 Qemu-kvm 创建和管理虚拟机的实验就完成了。至于制作镜像和编辑配置文件,下期会讲到。谢谢大家!

你可能感兴趣的:(KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机)