一 、虚拟化概论

VMM(Virtual Machine Monitor,虚拟机监控器)它包括规划、部署、管理和优化虚拟基础结构等端到端功能,传统的VMM建立在操作系统之上,但是操作系统本身除了作为VMM的承载之外并没有其他作用,所以,为了更加节约资源,去掉了操作系统由VMM来直接取代。就是我们看到了VMM hypervisor

Hypervisor——一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器

XEN和KVM云计算虚拟化技术_xen

Hypervisors是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisors不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行Hypervisor时,它会加载所有虚拟机客户端操作系统同时会分配给每一台虚拟机适量的内存CPU网络磁盘

主流的hypervisor:VMwareESXi、微软的Hyper-V或者思杰的XenServer

CPU虚拟化:

硬件虚拟化(HVM)是在半虚拟化发展后提出的一种解决虚拟化性能的方法,主要就是在cpu上增加了一个RING,然后实现guestVM工作在ring0上的方法。

两大CPU厂商各自提出了自己的方法,INTEL提出了VT-X,而AMD公司使用的是CPU的AMD-V技术。

内存虚拟化:

通过在VMM上添加MMU模块,实现将guestvm的线性地址(内存)通过VMM的MMU来进行转换成实际地址,并返回给guestvm,并且在TLB上添加标签的方式避免不同guestvm之间的地址冲突。

MMU

INTER:EPT

AMD:NPT

虚拟化实现的种类:

hosted:

先说下Hypervisor或叫做Virtual Machine Monitor(VMM),它是管理虚拟机VM的软件平台。在主机虚拟化中,Hypervisor就是跑在基础操作系统上的应用软件,与OS-Level中VE的主要区别在于:

Hypervisor构建出一整套虚拟硬件平台(CPU/Memory/Storage/Adapter),上面需要你再去安装新的操作系统和需要的应用软件,这样底层和上层的OS就可以完全无关化,诸如Windows上跑Linux一点儿问题没有;

VE则可以理解为盗用了底层基础操作系统的资源去欺骗装在VE上的应用程序,每新创建出一个VE,其操作系统都是已经安装好了的,和底层操作系统完全一样,所以VE比较VM(包括主机虚拟化和后面的裸金属虚拟化)运行在更高的层次上,相对消耗资源也少很多。

主机虚拟化中VM的应用程序调用硬件资源时需要经过:VM内核->Hypervisor->主机内核,导致性能是三种虚拟化技术中最差的。主机虚拟化技术代表是VMware Server(GSX)、Workstation和Microsoft Virtual PC、Virtual Server等。

bare-metal

裸金属虚拟化中Hypervisor直接管理调用硬件资源,不需要底层操作系统,也可以理解为Hypervisor被做成了一个很薄的操作系统。这种方案的性能处于主机虚拟化与操作系统虚拟化之间。代表是VMware ESX ServerCitrix XenServerMicrosoft Hyper-V

os-level

在操作系统中模拟出一个个跑应用程序的容器,所有虚拟机共享内核空间,性能最好,耗费资源最少,一个CPU号称可最多模拟500VPS(Virtual Private Server)VE(Virtual Environment)。缺点是操作系统唯一,如底层操作系统跑的WindowsVPS/VE就都得跑Windows。代表是Parallels公司(以前叫SWsoft)的Virtuozzo(商用产品)和OpenVZ(开源项目)。

library

application

参考文件:http://group.vsharing.com/Article.aspx?aid=1148290

XEN和KVM云计算虚拟化技术_xen_02

XEN和KVM云计算虚拟化技术_kvm_03

XEN和KVM云计算虚拟化技术_kvm_04

IO虚拟化:

完全虚拟化

半虚拟化

IO透传技术

XEN和KVM云计算虚拟化技术_xen_05

1、xen虚拟机的一般工作方式:

xen宿主机负责管理物理硬件的cpu,中断、内存,并且自身仅仅是一个内核并不能直接被用户操作,需要一个dom0这样的虚拟机,dom0完成远程登录管理xen和管理其他虚拟机的功能,并且其他虚拟机的调用cpu、内存、中断是通过xen来完成的,而调用硬盘,io则是通过dom0来完成的。

2、qumu

一款高性能的跨物理硬件的开源模拟器软件,这里说跨物理硬件是指模拟器如果是x86平台的,虚拟机可以搭建在x86平台,也可以是64位平台,并且可以按照aix等其他类型的操作系统。如果平台相同可以通过kqemu软件来进行加速。而kvm也是一个qemu的加速器软件。

3、kvm

这样kvm实际上就是接替qemu的一个虚拟化软件,其实就是linux自身的一个模块,当linux加载这个模块后,linux就变成了”VMM”,实现了虚拟机管理器的功能,在此的用户空间创建guestos,此时的guestos就是“VMM”的一个进程,可以随意的kill掉。所以kvm是完全硬件化的虚拟管理器。

XEN和KVM云计算虚拟化技术_kvm_06

二、XEN

1、 redhat5.0版本默认是可以通过加载内核进行安装xen的,实际操作就是通过grub.conf修改加载的内核模块来完成,而到了6.0版本redhat收购了kvm后,就不再支持xen了,而是提供了kvm的支持。只有在linux2.6.37之后的内核版本才正式支持了xen的功能,而到了3.0内核版本支持了完全功能。

XEN支持32位和64位的CPU,而KVM只支持64位CPU并且要求CPU支持虚拟化技术。

XEN和KVM云计算虚拟化技术_xen_07

2、管理工具和接口

每一个应用程序都有管理接口或者管理工具用于管理程序,XEN的主要管理的库包括libxc(控制台),libxenguest(管理虚拟机),xinstore(管理虚拟机元数据的存储),这些库通过libxenlight来管理,在这个之上通过xl,xend,xapi三种管理接口进行管理。

XEN和KVM云计算虚拟化技术_kvm_08

XEN和KVM云计算虚拟化技术_kvm_09

各个版本支持的管理工具(仅仅支持xen):

XEN4.0:xm/xend

XEN4.1:xl,xm/xend,xm和xl两者同一时间只能有一个在运行。

XEN4.2:xl

注意:红帽自己研发的管理工具支持了多个平台的虚拟化解决方案,virsh,它需要在被管理节点上启动一个libvirtd的服务进程。这个进程需要libvirt这个程序。但是由于红帽6.4以后不再支持xen所以需要自行编译安装。

所以实现xen功能的几个基本步骤是:

1、下载linux3.0以上内核,并编译安装,并添加一下选项。


2、下载安装libvirt1.0以上版本。


3、安装kernel-xen3.0以上版本。


三、XEN安装

1、环境介绍:

操作系统:centos6.7mini版

安装参照文件:https://wiki.xen.org/wiki/Xen_Project_Software_Overview#Host_and_Guest_Install

2、安装

[root@localhost ~]# yum install centos-release-xen

[root@localhost ~]# yum install xen

======================================================================================================================

 软件包                           架构           版本                                   仓库                     大小

======================================================================================================================

正在安装:

linux-firmware                   noarch         20170213-71.git6d3bc888.1.el6          centos-virt-xen          49

     replacing  kernel-firmware.noarch 2.6.32-573.el6

 xen                              x86_64         4.6.3-14.el6                           centos-virt-xen         112 k

为依赖而

 SDL                              x86_64         1.2.14-7.el6_7.1                       base                    193 k

atk                              x86_64         1.30.0-1.el6                           base                    195 k

 avahi-libs                       x86_64         0.6.25-17.el6                          base                     55 k

 cairo                            x86_64         1.8.8-6.el6_6                          base                    309 k

 cups-libs                        x86_64         1:1.4.2-77.el6                         base                    322 k

 fontconfig                       x86_64         2.8.0-5.el6                            base                    186

 freetype                         x86_64         2.3.11-17.el6                          base                    361 k

 gdk-pixbuf2                      x86_64         2.24.1-6.el6_7                         base                    501 k

 glusterfs                        x86_64         3.7.9-12.el6                           base                    422 k

 glusterfs-api                    x86_64         3.7.9-12.el6                           base                     58 k

 glusterfs-client-xlators         x86_64         3.7.9-12.el6                           base                    1.1 M

 glusterfs-libs                   x86_64         3.7.9-12.el6                           base                    313 k

 gnutls                           x86_64         2.12.23-21.el6                         base                    389 k

 gtk2                             x86_64         2.24.23-9.el6                          base                    3.2 M

 hicolor-icon-theme               noarch         0.11-1.1.el6                           base                     40 k

 jasper-libs                      x86_64         1.900.1-21.el6_9                       updates                 138 k

 kernel                           x86_64         4.9.25-27.el6                          centos-virt-xen          41 M

 libX11                           x86_64         1.6.4-3.el6                            base                    587 k

 libX11-common                    noarch         1.6.4-3.el6                            base                    171 k

 libau                           x86_64         1.0.6-4.el6                            base                     24 k

 libXcomposite                    x86_64         0.4.3-4.el6                            base                     20 k

 libXcursor                       x86_64         1.1.14-2.1.el6                         base                     28 k

 libXdamage                       x86_64         1.1.3-4.el6                            base                     18 k

 libXext                          x86_64         1.3.3-1.el6                            base                     35 k

 libXfixes                        x86_64         5.0.3-1.el6                            base                     17 k

 libXft                           x86_64         2.3.2-1.el6                            base                     55 k

 libXi                            x86_64         1.7.8-1.el6                            base                     38 k

 libXinerama                      x86_64         1.1.3-2.1.el6                          base                     13 k

 libXrandr                        x86_64         1.5.1-1.el6                            base                     25 k

 libXrender                       x86_64         0.9.10-1.el6                           base                     24 k

 libXxf86vm                       x86_64         1.1.3-2.1.el6                          base                     16 k

 libjpeg-turbo                    x86_64         1.2.1-3.el6_5                          base                    174 k

 libpng                           x86_64         2:1.2.49-2.el6_7                       base                    182 k

 libthai                          x86_64         0.1.12-3.el6                           base                    183 k

 libtiff                          x86_64         3.9.4-21.el6_8                         base                    346 k

 libusb1                          x86_64         1.0.9-0.7.rc1.el6                      base                     80 k

 libxcb                           x86_64         1.12-4.el6                             base                    180 k

 libxslt                          x86_64         1.1.26-2.el6_3.1                       base                    452 k

 mesa-dri-drivers                 x86_64         11.0.7-4.el6                           base                    4.1 M

 mesa-dri-filesystem              x86_64         11.0.7-4.el6                           base                     17 k

 mesa-dri1-drivers                x86_64         7.11-8.el6                             base                    3.8 M

 mesa-libGL                       x86_64         11.0.7-4.el6                           base                    142 k

 mesa-private-llvm                x86_64         3.6.2-1.el6                            base                    6.5 M

 pango                            x86_64         1.28.1-11.el6                          base                    351 k

 pciutils                         x86_64         3.1.10-4.el6                           base                     85 k

 perl                             x86_64         4:5.10.1-144.el6                       base                     10 M

 perl-Module-Pluggable            x86_64         1:3.90-144.el6                         base                     41 k

 perl-Pod-Escapes                 x86_64         1:1.04-144.el6                         base                     33 k

 perl-Pod-Simple                  x86_64         1:3.13-144.el6                         base                    213 k

 perl-libs                        x86_64         4:5.10.1-144.el6                       base                    579 k

 perl-version                     x86_64         3:0.77-144.el6                         base                     52 k

 pixman                           x86_64         0.32.8-1.el6                           base                    243 k

 python-lxml                      x86_64         2.2.3-1.1.el6                          base                    2.0 M

 qemu-img                         x86_64         2:0.12.1.2-2.503.el6_9.3               updates                 846 k

 usbredir                         x86_64         0.5.1-3.el6                            base                     41 k

 xen-hypervisor                   x86_64         4.6.3-14.el6                           centos-virt-xen         932 k

 xen-libs                         x86_64         4.6.3-14.el6                           centos-virt-xen         534 k

 xen-licenses                     x86_64         4.6.3-14.el6                           centos-virt-xen          87 k

 xen-runtime                      x86_64         4.6.3-14.el6                           centos-virt-xen          16 M

 yajl                             x86_64         1.0.7-3.el6                            base                     27 k

为依赖而更新:

 libdrm                           x86_64         2.4.65-2.el6                           base                    136 k


3、查看当前xen中有几个虚拟机

[root@localhost ~]# xl list

Name                                        ID   Mem VCPUs State Time(s)

Domain-0                                     0  1024    24     r-----      28.8

4、基于图形化界面安装虚拟机(guestos),需要先安装libvirt软件包。

[root@localhost ~]# yum install libvirt

[root@localhost ~]# service libvirtd start

Starting libvirtd daemon:                                  [  OK  ]

XEN和KVM云计算虚拟化技术_kvm_10

创建桥设备,用于实现虚拟机和宿主机之间的网络连接方式:

[root@localhost ~]# virsh iface-bridge eth0 xenbr0 //xenbr0名称随意

删除定义的桥设备。使用iface-undefine参数,这个删除完毕需要重启,并且重启后设置的物理网卡会“消失”,需要创建相关的ifcfg-ethx文件,才可以。

查看桥设备,(virbr0是libvirt虚拟出来的)

[root@localhost ~]# brctl show

bridge name bridge id STP enabled interfaces

virbr0 8000.525400a6a9bb yes virbr0-nic

[root@localhost ~]# 

5、ssh登录xen服务器,然后通过virt-manager开启xen的图形化管理界面。

yum install virt-manager

故障点分析:

1、出现一下情况,需要安装 yum -y install xorg-x11-xauth

[root@localhost ~]# virt-manager

Unable to initialize GTK: could not open display

2、出现一下情况的时候,需要创建一个文件/var/lib/dbus/machine-id 并通过dbus-uuidgen生成一个随机码,并放到/var/lib/dbus/machine-id 

[root@localhost ~]# virt-manager 

process 4326: D-Bus library appears to be incorrectly set up; failed to read machine uuid: UUID file '/var/lib/dbus/machine-id' should contain a hex string of length 32, not length 0, with no other text

See the manual page for dbus-uuidgen to correct this issue.

  D-Bus not built with -rdynamic so unable to print a backtrace

已放弃

3、图形界面出现乱码的解决方法:

[root@localhost ~]# yum install dejavu-lgc-sans-fonts

如果按照的版本是virt-manager-0.9.0-34先卸载0.9.0-34版本,然后按照0.9.0-31版本。即可解决问题。

[root@localhost ~]# yum localinstall virt-manager-0.9.0-31.el6.x86_64.rpm 

[root@localhost ~]# vi /etc/sysconfig/i18n

英文:

LANG="en_US.UTF-8"

中文:

LANG="zh_CN.UTF-8"

即时生效

source /etc/sysconfig/i18n

4、启动图形界面后无法连接到xen虚拟机,并提示一下错误。

XEN和KVM云计算虚拟化技术_kvm_11

解决办法,安装qemu相关软件包。

[root@localhost ~]# yum install qemu\*

四、命令行模式配置虚拟机

xen可以通过xm或者xl命令行进行配置,我这里xen4.6自带的是xl我就使用它了,xm已经被合并了。

xl配置虚拟机有一个配置模板,就是/etc/xen/*example*的文件。

通过命令行方式登录虚拟机:

[root@localhost xen]# xl console test

XEN和KVM云计算虚拟化技术_kvm_12

XEN和KVM云计算虚拟化技术_kvm_13XEN和KVM云计算虚拟化技术_xen_14

六、实时迁移

要实现实时迁移,通常是对于高可用情况说的,就是两个服务器共享一个文件存储,其中一个故障,服务会自动转移到另个一服务器上。

安装虚拟机文档:http://blog.csdn.net/jincm13/article/details/8362509

第二部分 KVM

一、KVM简介

简称kernel-based VM,必须运行在64位系统系统上。KVM是一个混合类型的VMM,它能够以模拟方式支持硬件的完全虚拟化,也能够通过guestos中安装驱动程序进而支持部分硬件的半虚拟化。(对于网络设备和块设备来说,半虚拟化能够提高设备性能)REDHAT和IBM连同linux社区开了了一种独立于VMM的半虚拟化驱动程序标准virtio,根据这个标准开发的半虚拟化程序可兼容的运行于多种不同的VMM上,提高了VMM之间的互操作性。

virtio驱动已经集成在linux2.6以上的内核版本中。

常见的虚拟化模型:

type1:hosted(运行在操作系统之上)

type2:bare-metal(直接运行在硬件基础上)

常见虚拟化技术:

完全虚拟化

半虚拟化para:通用半虚拟化技术是virtio。

混合虚拟化

KVM自身是完全虚拟化的,CPU是HVM(硬件虚拟化),但是使用了virtio的kvm实质上是混合技术的KVM。

过量使用CPU:单个虚拟机使用CPU数量建议不要超过真实物理机cpu个数,而虚拟机总数的CPU使用量可以超过。

支持安装的虚拟机(guest)

linux 、windows、openbsd、FreeBSD、solaris。

二、安装KVM(要实现安装虚拟机的功能,就要安装其他软件了比如qemu。)

1、安装模块,需要CPU硬件支持虚拟化。

kvm模块

kvm-intel 或者kvm-amd

查看CPU虚拟化:

[root@localhost ~]# grep -E "svm|vmx" /proc/cpuinfo 

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid

安装kvm模块、kvm-intel模块

[root@localhost ~]# modprobe kvm kvm-intel

kvm虚拟出来的设备,用于API(接口)。

[root@localhost ~]# ll /dev/|grep kvm

crw-rw----.  1 root root     10, 232 5月  31 19:56 kvm

实时迁移要求:

guestos映像文件放在共享存储上,比如iscsi、nfs

目标物理主机的kvm要能够兼容源物理主机的kvm及其准备迁移的guestos。(也就是建议两台物理机型号相同)

在两台主机上,共享存储必须挂载在同一个位置,并且挂载的目录名必须相同。

两台物理主机的cpu必须具有相同的特性

虚拟机没有使用透传I/O

物理机要求时间同步

两台物理主机必须使用一致的网络配置,并且所有网桥和网络配置一致

kvm型号相同,兼容

KVM管理工具

1、libvirtd包括:

virtinst软件包,类似于XEM的xl命令行工具,包括virt-install、virt-clone、virt-convert、virt-p_w_picpath。

virtual machine manager

virsh

virsh的本地和远程管理模式:

2、qemu工具

处理器仿真

设备仿真(显卡,网卡,硬盘)

关联仿真设备到真实设备的通用设备

调试器

仿真主机的描述(pc、power、mac)

与仿真器交互的用户接口

2、安装KVM实现虚拟化

qemu-kvm、virtinst、libvirt、libguestfs(这些文件可以通过安装包组的方式简化依赖关系,具体包组是virtualization、virtualization client、virtualization platform)

[root@localhost ~]# yum groupinstall virtualization

[root@localhost ~]# yum groupinstall "virtualization client"

[root@localhost ~]# yum groupinstall virtualization-platform

将qemu-kvm创建软连接到/bin目录中。

[root@localhost ~]# ln -sv /usr/libexec/qemu-kvm /bin/

创建桥设备,用于虚拟机和物理机通信

[root@localhost ~]# virsh iface-bridge  eth0 br0

通过图形化界面安装操作系统

[root@localhost ~]# virt-manager 

virsh的几个常见命令:

创建虚拟机,事先准备好xml格式的配置文件,可以dump其它已经运行的虚拟机

create:创建并启动

define:创建不启动

删除虚拟机的步骤:

destroy之后undefine,最后删除相关的文件。

所有虚拟机创建完毕后,都在/etc/libvirt/qemu下生成相关的xml文件

[root@localhost ~]# ll /etc/libvirt/qemu

总用量 12

drwxr-xr-x. 2 root root 4096 6月   1 16:36 autostart

drwx------. 3 root root 4096 6月   1 14:51 networks

-rw-------. 1 root root 3191 6月   1 16:45 ttt.xml

[root@localhost ~]# 

改变在线状态(动态)的虚拟机内存空间大小,在当前版本测试中修改内存大小后系统崩溃

[root@localhost ~]# virsh setmem ttt 2048 --live


查看虚拟机cpu格式,并修改。测试时不可用

[root@localhost ~]# virsh vcucount ttt

maximum      config         1

maximum      live           1

current      config         1

current      live           1

创建虚拟磁盘,并挂载到虚拟机上,卸载用detach-disk

[root@localhost ~]# qemu-img create -f raw /root/ttt.img 512M

Formatting '/root/ttt.img', fmt=raw size=536870912 

[root@localhost ~]# virsh attach-disk ttt /root/ttt.img vdb 

查看虚拟机状态相关命令 virt help domain

查看CPU状态信息,cpu-stats

红帽官网解决方法:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-Troubleshooting-Common_libvirt_errors_and_troubleshooting.html#sect-The_URI_failed_to_connect_to_the_hypervisor