第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 服务器虚拟化,桌面虚拟化,应用虚拟化
服务器虚拟化
数量少的情况推荐使用ESXI,XenServer
数量大的情况推荐使用KVM,RHEV(并不开源),oVirt,Openstack,Vmvare 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)更好的商业支持及服务保障
7)Centos7较Centos6默认支持cpu热添加,内存的热添加,大页内存默认都是开启的
2.2 支持虚拟化的条件
inter的cpu:vmx
AMD的cpu:svm
本文使用的是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 # libvirt为Python提供的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
修改完成之后重启虚拟机
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
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 准备
克隆的虚拟机,首先要做的是:
清除网卡配置的UUID和MAC地址,否则克隆后网卡错乱
清空>/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 修改以下四行
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