第1章 虚拟化的分类

1.1  全虚拟化与半虚拟化

全虚拟化 
又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层–Hypervisor,或者叫做虚拟机管理程序(VMM)。hypervisor 可以划分为两大类。首先是类型 1,这种 hypervisor 是直接运行在物理硬件之上的。其次是类型 2,这种 hypervisor 运行在另一个操作系统(运行在物理硬件之上)中。类型 1hypervisor 的一个例子是基于内核的虚拟机(KVM —— 它本身是一个基于操作系统的hypervisor)。类型 2 hypervisor 包括 QEMU WINE。因为运行在虚拟机上的操作系统通过Hypervisor来最终分享硬件,所以虚拟机发出的指令需经过Hypervisor捕获并处理。为此每个客户操作系统(Guest OS)所发出的指令都要被翻译成CPU能识别的指令格式,这里的客户操作系统即是运行的虚拟机,所以Hypervisor的工作负荷会很大,因此会占用一定的资源,所以在性能方面不如裸机。但是运行速度要快于硬件模拟。全虚拟化最大的优点就是运行在虚拟机上的操作系统没有经过任何修改,唯一的限制就是操作系统必须能够支持底层的硬件,不过目前的操作系统一般都能支持底层硬件,所以这个限制就变得微不足道了。 


半虚拟化 
半虚拟化技术是后来才出现的技术,半虚拟化技术英文是paravirtualization,也叫做准虚拟化技术,现在比较热门,它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervisor的工作负担变得非常的小,因此整体的性能也有很大的提高。不过缺点就是,要修改包含该API的操作系统,但是对于某些不含该API的操作系统(主要是windows)来说,就不行能用这种方法,Xen就是一个典型的半虚拟化的技术。 


 

1.2 服务器虚拟化,桌面虚拟化,应用虚拟化

服务器虚拟化 
数量少的情况推荐使用ESXIXenServer 
数量大的情况推荐使用KVMRHEV(并不开源),oVirtOpenstackVmvare vshpere

 

桌面虚拟化 
桌面虚拟化依赖于服务器虚拟化,在数据中心的服务器上进行服务器虚拟化,生成大量的独立的桌面操作系统(虚拟机或者虚拟桌面),同时根据专有的虚拟桌面协议发送给终端设备。用户终端通过以太网登陆到虚拟主机上,只需要记住用户名和密码及网关信息,即可随时随地的通过网络访问自己的桌面系统,从而实现单机多用户。多用于IP外包,呼叫中心,银行办公、移动桌面。

 

应用虚拟化 
技术原理是基于应用/服务器计算A/S架构,采用类似虚拟终端的技术,把应用程序的人机交互逻辑(应用程序界面、键盘及鼠标的操作、音频输入输出、读卡器、打印输出等)与计算逻辑隔离开来。在用户访问一个服务器虚拟化后的应用时,用户计算机只需要把人机交互逻辑传送到服务器端,服务器端为用户开设独立的会话空间,应用程序的计算逻辑在这个会话空间中运行,把变化后的人机交互逻辑传送给客户端,并且在客户端相应设备展示出来,从而使用户获得如同运行本地应用程序一样的访问感受。 
3)硬件虚拟化和软件虚拟化 
参考: 
http://virtualization.ctocio.com.cn/38/11466538.shtm

 

 

 

第2章 虚拟化之KVM

2.1 kvm的虚拟化特性

1)嵌入到linxu正式kernel(提高了兼容性) 
2)代码级资源调用(提高性能) 
3)虚拟机就是一个进程(内存易于管理) 
4)直接支持NUMA技术(提高扩展性) 
5)虽然被Redhat收购了,但是依然保持着开源发展模式,社区活跃 
6)更好的商业支持及服务保障 
7Centos7Centos6默认支持cpu热添加,内存的热添加,大页内存默认都是开启的

 

 

 

 

 

2.2 支持虚拟化的条件

intercpuvmx 
AMDcpusvm 
本文使用的是vmvare,需要开启如下两个条件即可,如果是物理机,需要在bios里面设置,默认都是开启状态

  

 


 

 


 

第3章   kvm

 


3.1  cpuinfo中可以查看具体的支持虚拟化的信息

[root@CentOS6 ~]# grep -E '(vmx|svm)' /proc/cpuinfo--color

flags          : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov patpse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc uparch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperfunfair_spinlock pni pclmulqdq vmx ssse3cx16 pcid sse4_1 sse4_2 x2apic popcnt xsave avx f16c hypervisor lahf_lm aratepb xsaveopt pln pts dts tpr_shadow vnmi ept vpid fsgsbase smep

 

 



 

3.2  安装kvm

yum -y install qemu-kvm qemu-kvm-tools virt-managerlibvirt python-virtinst libvirt-python

 

kvm: linux内核的一个模块,模块不需要安装,只需要加载 
qemu:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化出不是x86架构的) 
qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的

 

 

 

CentOS7安装kvm

yum -y install qemu-kvm qemu-kvm-tools virt-managerlibvirt virt-install

 

 

3.3  kvm管理命令

systemctl enable libvirtd.service
systemctl start libvirtd.service

 

 

 

[root@KVM ~]# rpm -qa|grep -E 'qemu|libvirt|virt'
python-virtinst-0.600.0-29.el6.noarch   # 一套Python的虚拟机安装工具
gpxe-roms-qemu-0.9.7-6.14.el6.noarch    # 虚拟机iPXE的启动固件,支持虚拟机从网络启动
virt-manager-0.9.0-29.el6.x86_64        # 基于Libvirt的图像化虚拟机管理软件,需要图形界面操作系统
qemu-img-0.12.1.2-2.479.el6.x86_64      # 用于操作虚拟机硬盘镜像的创建、查看和格式转化
libvirt-python-0.10.2-54.el6.x86_64     # libvirtPython提供的API
qemu-kvm-0.12.1.2-2.479.el6.x86_64      # KVM在用户空间运行的程序
qemu-kvm-tools-0.12.1.2-2.479.el6.x86_64
libvirt-0.10.2-54.el6.x86_64            # 用于管理虚拟机,它提供了一套虚拟机操作API
libvirt-client-0.10.2-54.el6.x86_64     # Libvirt的客户端,最重要的功能之一就是就在宿主机关机时可以通知虚拟机也关机,使虚拟机系统正常关机,而不是被强制关机,造成数据丢失
virt-top-1.0.4-3.15.el6.x86_64          # 类似于top命令,查看虚拟机的资源使用情况
virt-what-1.11-1.2.el6.x86_64           # 在虚拟机内部执行,查看虚拟机运行的虚拟化平台
virt-viewer-0.5.6-8.el6.x86_64          # 显示虚拟机的控制台console

 

 

 

 

3.4启动虚拟化

C6:

修改qemu.conf配置

vim /etc/libvirt/qemu.conf

vnc_listen = "0.0.0.0"

 

/etc/init.d/libvirtd start

 


 

 

3.5 查看网络

[root@CentOS6 ~]# brctl show

bridge name    bridge id               STP enabled     interfaces

virbr0         8000.5254001285d4       yes             virbr0-nic

 

[root@centos72 ~]# brctl show

bridge name    bridge id               STPenabled     interfaces

virbr0         8000.525400d724b6       yes             virbr0-nic

 

 

 

 

 

3.6查看kvm模块

[root@CentOS6 ~]# lsmod|grep kvm

kvm_intel              55624  0

kvm                   341551  1 kvm_intel

 

 

 

3.7  kvm网卡桥接配置

1安装tunctl

yum install -y tunctl

 

2.禁用网络管理器(这步先不做,后面根据实际情况禁用

chkconfig NetworkManager off   #和桥接有冲突,要关闭

service NetworkManager stop

 

 

 

 

 

 

 

3.修改eth0(本实验以eth0为实例)物理网卡,br0为桥接网口配置文件

C6:

cat ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

ONBOOT=yes

NM_CONTROLLED=no

#BOOTPROTO=none

#IPADDR=10.0.0.27

#PREFIX=24

#GATEWAY=10.0.0.2

#DEFROUTE=yes

#IPV4_FAILURE_FATAL=yes

#IPV6INIT=no

#NAME="System eth0"

BRIDGE=br0

 

cp ifcfg-eth0 ifcfg-br0

 

cat ifcfg-br0

DEVICE=br0

TYPE=Bridge

ONBOOT=yes

NM_CONTROLLED=no

BOOTPROTO=static

NETMASK=255.255.255.0

IPADDR=10.0.0.27

GATEWAY=10.0.0.2

 

 

 

 

C7:

cat /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet

NAME=eth0

DEVICE=eth0

ONBOOT=yes

BRIDGE=br0

 

cat /etc/sysconfig/network-scripts/ifcfg-br0

TYPE=Bridge

NAME=br0

DEVICE=br0

ONBOOT=yes

BOOTPROTO=static

NETMASK=255.255.255.0

IPADDR=10.0.0.171

GATEWAY=10.0.0.2

 

 

[root@CentOS7 ~]# cat/etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet

BOOTPROTO=none

DEFROUTE=yes

NAME=eth0

UUID=638d185d-ef0d-4fef-9668-893d397cddf2

DEVICE=eth0

ONBOOT=yes

BRIDGE=br0

[root@CentOS7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0

TYPE=Bridge

NAME=br0

DEVICE=br0

ONBOOT=yes

BOOTPROTO=static

NETMASK=255.255.255.0

IPADDR=10.0.0.202

GATEWAY=10.0.0.2

 

 

重启网络服务

 

查看网络

brctl show

bridge name    bridge id               STPenabled     interfaces

br0             8000.000c29ec932b       no              eth0

virbr0         8000.5254001285d4       yes             virbr0-nic

 

 

提示:

如果上面不能成功访问外网,请删除kvm自动生成两个桥接卡

virsh net-destroy default

virsh net-undefine default

/etc/init.d/libvirtd restart

 

 

3.7.1 修改kvm虚拟机网卡模式

virsh edit c73-moban

 

   

     

     bridge='br0'/>

     

     

   

 

修改完成之后重启虚拟机

 

3.8创建虚拟机磁盘文件

创建一个虚拟磁盘,-f 指定格式

mkdir -p /application/kvm_data
cd /application/kvm_data
qemu-img create -f qcow2 /application/kvm_data/moban.qcow2 20G

 

 

3.9查看内核中kvm状态

[root@centos72 kvm_data]# qemu-img infomoban.qcow2                                           

p_w_picpath: moban.qcow2

file format: qcow2

virtual size: 20G (21474836480 bytes)

disk size: 196K

cluster_size: 65536

Format specific information:

    compat:1.1

    lazyrefcounts: false

 

 

3.10 导入镜像

mkdir -p /application/tools

cd /application/tools

dd if=/dev/sr0 of=/application/tools/CentOS7_3.iso

 

 

 

 

3.11 创建虚拟机

C6

NAT

virt-install --virt-type=kvm --name=kvm-demo -r1024 --cdrom /mnt/centos6.iso --network network=default --graphicsvnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel6 --diskpath=/mnt/kvm.raw

 

桥接

virt-install --virt-type=kvm --name=kvm1-demo -r1024 -cdrom /mnt/centos6.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0--noautoconsole --os-type=linux --os-variant=rhel6 --disk path=/mnt/kvm1.raw

 

添加多块网卡

--network bridge=br0--network bridge=br1

 

C7

NAT

virt-install --virt-type=kvm --name=c73-moban --vcpus=1 -r 1024 --cdrom /application/tools/CentOS7_3.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel7 --disk path=/application/kvm_data/moban.qcow2,size=20,format=qcow2

 

桥接

virt-install --virt-type=kvm --name=c73-moban --vcpus=1 -r 1024 --cdrom /application/tools/CentOS7_3.iso --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel7 --disk path=/application/kvm_data/moban.qcow2,size=20,format=qcow2

 

 

 

 

安装windows

virt-install --virt-type=kvm --name=window_moban --vcpus=1 -r1024 --cdrom /application/tools/windowsxp.iso --network bridge=br0 --graphicsvnc,listen=0.0.0.0 --noautoconsole --os-type=windows --os-variant=win7 --diskpath=/application/kvm_data/windows.qcow2,size=20,format=qcow2

 

virsh list --all

 


 

3.12  工作环境中的参数命令:

size是以G为单位的

第一种

virt-install --name=sa01 --ram 12288 --vcpus=8--disk path=/data/kvm-vhost/sa01.img,size=100 --accelerate --cdrom/data/iso/CentOS-6.5-x86_64-bin-DVD1.iso --graphics vnc,port=5901 --networkbridge=br0 --force --autostart

第二种

virt-install --name=win2008 --ram 8192 --vcpus=2--disk path=/kvm_vhost/win2008.img,size=100 --accelerate --cdrom/data/iso/windows_server_2008_r2x64.iso --graphics vnc,port=5901 --networkbridge=br0 --network bridge=br1 --network bridge=br2 --force --autostart

第三种

virt-install --name=mysql--1 --ram=512 --vcpus=1--disk path=/kvm/mysql--1.img,size=200,bus=virtio,cache=writeback--cdrom=/kvm/centos6.iso --vnc --vncport=5905 --noautoconsole --accelerate--autostart --network=bridge:br0,model=virtio --force--extra-args='console=tty0 console=ttyS0,115200n8 serial'

第四种

usr/libexec/qemu-kvm -name memcached--2 -S -Mrhel6.6.0 -enable-kvm -m 10240 -realtime mlock=off -smp8,sockets=8,cores=1,threads=1 -uuid 738d2778-bdaa-9cad-b1a4-fb24de9f7ee8-nodefconfig -nodefaults -chardevsocket,id=charmonitor,path=/var/lib/libvirt/qemu/memcached--2.monitor,server,nowait-monchardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown-device

ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1-device

ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2-drive

file=/kvm/mem--2.img,if=none,id=drive-virtio-disk0,format=raw,cache=writeback-devicevirtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1-drive

if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdev tap,fd=25,id=hostnet0,vhost=on,vhostfd=31-device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:1f:97:38,bus=pci.0,addr=0x3-chardevpty,id=charserial0-device isaserial,chardev=charserial0,id=serial0

-vnc

127.0.0.1:5

-vga

cirrus

-incoming

fd:23

-device

virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6

-msg

timestamp=on

 

报错:

开始安装......

ERROR    内部错误 Process exited while readingconsole log output: char device redirected to /dev/pts/0

qemu-kvm: -drivefile=/root/windows_7_sp1_x64.iso,if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw:could not open disk p_w_picpath /root/windows_7_sp1_x64.iso: Permission denied

解决:

修改 qemu.conf 配置,把下面几个地方的注释去掉,然后把dynamic_ownership 的值改成0,禁止libvirtd 动态修改文件的归属:

vim /etc/libvirt/qemu.conf

...

user = "root"

group = "root"

dynamic_ownership = 0

...

重启 libvirtd 服务再用上面的 virt-install 命令安装就应该可以了

 

 

3.13  移除虚拟机

[root@centos72 ~]# virsh list --all

 Id    名称                         状态

----------------------------------------------------

 -     c73-clone                      关闭

 -     c73-moban                      关闭

 

[root@centos72 ~]# virsh undefine c73-clone

c73-clone 已经被取消定义

 

[root@centos72 ~]# virsh list --all       

 Id    名称                         状态

----------------------------------------------------

 -     c73-moban                      关闭

 

 

 

 

快照存在,虚拟机不能移除

[root@centos72 ~]# virsh undefine c73-moban

错误:取消定义域 c73-moban 失败

错误:所需操作无效:无法删除使用 1 快照的不活跃域

[root@centos72 ~]# virsh snapshot-list c73-moban

 名称               生成时间              状态

------------------------------------------------------------

 c73-moban_shot1      2017-03-13 16:05:07 +0800 shutoff

 

[root@centos72 ~]# virsh snapshot-delete c73-mobanc73-moban_shot1

已删除域快照 c73-moban_shot1

 

[root@centos72 ~]# virsh snapshot-list c73-moban                 

 名称               生成时间              状态

------------------------------------------------------------

 

[root@centos72 ~]# virsh list --all

 Id    名称                         状态

----------------------------------------------------

 -     c73-moban                      关闭

 

[root@centos72 ~]# virsh undefine c73-moban

c73-moban 已经被取消定义

 

[root@centos72 ~]# virsh list --all       

 Id    名称                         状态

----------------------------------------------------

 

 

3.14vnc连接kvm虚拟机

 

[root@centos72 ~]# netstat -lntp |grep 59

tcp       0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      6689/qemu-kvm      

tcp       0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      7028/qemu-kvm

 

 

默认端口  5900



 kvm虚拟化_第1张图片


kvm虚拟化_第2张图片

 



 

3.15查看虚拟机

[root@oldboy mnt]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     kvm-demo                       关闭

 

 

3.16 启动虚拟机

[root@oldboy mnt]# virsh start kvm-demo  
 kvm-demo 已开始

 

[root@oldboy mnt]# virsh list --all      
 Id    名称                         状态
----------------------------------------------------
 2     kvm-demo                       running

 

 

3.17正常关机

virsh shutdown kvm-demo

  

 

3.18强制关机

virsh destroy kvm-demo

 

 

第4章  克隆(添加)虚拟机

4.1 准备

克隆的虚拟机,首先要做的是:

清除网卡配置的UUIDMAC地址,否则克隆后网卡错乱

清空>/etc/udev/rules.d/70-persistent-net.rules,否则克隆后网卡错乱

最后关闭虚拟机,在虚拟机中使用halt命令关机。

 

4.2导出配置文件

virsh dumpxml kvm-demo >new.xml

 

4.3复制磁盘文件

cp /mnt/kvm.raw /mnt/new.raw

 

4.4修改配置文件

生成uuid

[root@centos72 ~]# uuidgen

53308fa7-6e18-49af-b778-f67208b38105

 

 

vim new.xml   修改以下四行

 kvm-clone

 1f1cf248-bd86-1e45-6ac9-0d4c05f15dd5

 

 

 

 

 

 

4.5克隆(添加)虚拟机

[root@oldboy mnt]# virsh  define new.xml 
定义域 kvm-clone(从 new.xml

 

 

 

 

 

[root@oldboy mnt]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     kvm-demo                       关闭

 

 


 

第5章  虚拟机快照

  

5.1转换磁盘格式   

关机状态转换 (此处很慢)

qemu-img convert -c -f raw -O qcow2 new.rawnew.qcow2

 

 

5.2编辑

virsh edit kvm-clone

修改以下两行

23      

24      

 

 

 

5.3创建快照

virsh snapshot-create-as kvm-clone kvm-clone_shot1

 

 

 

5.4查看快照

[root@oldboy mnt]# virsh snapshot-list kvm-clone

     
 名称               Creation Time             状态
------------------------------------------------------------
 kvm-clone_shot1      2016-08-14 19:19:18 +0800 running

 

 

 


[root@oldboy mnt]# virsh snapshot-info kvm-clone kvm-clone_shot1         
名称:       kvm-clone_shot1
Domain:         kvm-clone
Current:        yes
状态:       running
Location:       internal
Parent:         -
Children:       0
Descendants:    0
Metadata:       yes

 

 

5.5还原快照

virsh snapshot-revert kvm-clone kvm-clone_shot1    

 

 

5.6删除快照

virsh snapshot-delete kvm-clone kvm-clone_shot1