使用KVM解决企业虚拟化方案

什么是KVM?

kernel-based virtual machine (KVM的全称)给予内核的虚拟机(简称内核寄生虫),最初为Qumranet公司所研发(以色列),依赖于HVM(intel:VT-X | AMD:AMD-v)。后来还被收入进linux内核,所以xen立刻被林纳斯淘汰。接着红帽把收养的儿子也扔进了垃圾箱并且全面支持KVM!

关于KVM的组件:

① /dev/kvm:用来管理虚拟机重要入口,在用户可通过ioctl()系统调用来完成的创建启动等管理功能。它是一个字符设备功能有:创建VM,为VM分配内存、读写VCPU的寄存器、向VCPU注入中断、运行VCPU等等。(虚拟机组组件都在设备文件里面了!)

② qemu进程:工作于用户空间,主要实现模拟PC机的I/O设备。并且你会发现自带的工具栈也是它!

关于KVM的特性:

①内存管理:
支持将分配给VM的内存交换至SWAP;
支持使用Huge page;
支持使用Intel EPT | AMD RUI技术完成内存地址映射,GUA→GPA→HPA
支持KSM (kernel same page merging)

② 硬件支持:
这个取决于linux内核,在/dev有的设备基本都支持!

③ 存储:
支持本地存储
支持网络附加存储
支持使用存储区域网络
支持分布式存储(GlustFS)

④ 可以实时迁移VM

⑤ 支持的GUEST OS:
Linux windows openBSD freeBSD opensolaris ……

⑥关于设备驱动:
I/O设备的完全虚拟化:模拟硬件
I/O设备的半虚拟化,在cnetos中安装驱动:virtio virtio-blk virtio-pci virtro-console virtio-ballon

KVM的局限性:

任何程序都有他的优缺点,KVM也不例外!

① (cpu)overcommit 过载使用会下降性能
② cpu时间记录难以精确,依赖于时间同步机制
③MAC地址:
VM量过大时会存在MAC地址冲突
④ 实施迁移:有固定要求
⑤ 性能局限性,性能损失

KVM工具栈:

工具站有两个,一个自带的还有一个是红帽开发的一款工具站,使用较为简单!

①qumu:

qemu-kvm专门管理KVM虚拟机
qemu-img 创建磁盘映像
qemu主要用到以下几个部分:

处理器仿真
仿真I/O设备
关联模拟的设备至真实设备
调试器
与模拟器交互的用户接口

②libvirt:

GUI:virt-manager virt-viewer
CLI:virt-install ,virsh

安装KVM:

终于说到重头戏了不?安装KVM其实比较XEN简单不少,在centos7还有一件包组可以安装!安装需要首先查看机器是否可以进行安装,随后centos7的可以安装包组即可!

[root@localhost ~]# grep -E --color=auto "(vmx|svm)" /proc/cpuinfo 
#查看cpu是否可以虚拟化?显示如下所示:
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 rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt
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 rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt
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 rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt
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 rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt
[root@localhost ~]# modprobe kvm #装载KVM模块
[root@localhost ~]# modprobe kvm intel
#随后安装包组:yum groupinstall "Virtualization Host"

对于centos6的来说也可以安装相关包组:

①virtualiztion 负责提供qemu-kvm的组建,必装
②virtualization client 提供python-virtinst virt-manager virt-viewer的GUI包
③virtualization platform 提供libvirt libvirt-client等相关包
④virtualization tools 提供libguestfs,在云环境中才会用到

注意:安装只需要安装前三个包组即可!


使用qemu工具来创建一个KVM虚拟机:

本案例以centos6.8为VM安装对象,使用qemu工具栈来创建虚拟机使用的命令是qemu-kvm。并且qemu为KVM的默认工具栈。

①首先创建一个文件链接!因为默认qemu-kvm命令会在/usr/bin目录下进行寻找,如果没有添加链接会出现这种情况:

[root@localhost ~]# qemu-kvm
-bash: qemu-kvm: command not found
[root@localhost ~]# ln -s /usr/libexec/qemu-kvm /usr/bin/
#将上面的链接添加上去您再试试?

②创建一个磁盘映像文件:

[root@localhost kvm]# cd centos6.8\ test1/ #创建一个给第一个虚拟机使用的文件夹
[root@localhost centos6.8 test1]# qemu-img create -f qcow2 -o size=15G,preallocation="metadata" centos6.8 #创建磁盘映像文件
Formatting 'centos6.8', fmt=qcow2 size=16106127360 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off
[root@localhost centos6.8 test1]# ls
centos6.8
[root@localhost centos6.8 test1]# ls -lh
total 2.6M
-rw-r--r-- 1 root root 16G Sep 12 14:49 centos6.8

③创建一个桥设备(在上一期xen中说过过程一样…不过我还是写写吧)

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-br0 #创建br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=128.168.1.88
PREFIX=24
GATEWAY=128.168.1.254
DNS1=223.6.6.6
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp2s0 #修改原先网卡的配置文件
TYPE="Ethernet"
NAME="enp2s0"
DEVICE="enp2s0"
ONBOOT="yes"
NM_CONTROLLED=no
BOOTPROTO=none
BRIDGE=br0
#随后重启网络,别忘了先把netowrkmanager关闭并且取消开机启动!

④创建两个脚本,一个为启动一个为停止,帮助实现系统启动和停止时桥接网络和删除桥接的自动执行操作;注意:如果设备桥名称修改了那么也要对应修改脚本中switch变量。

[root@localhost kvm]# vi start #创建一个启动文件脚本
#!/bin/bash
switch=br0
if [ -n "$1" ]; then
 ip link set $1 up
 sleep 1
 brctl addif $switch $1
 exit 0
else
 echo "Error: No Interface."
 exit 1
fi
[root@localhost kvm]# vi stop #新建一个停止脚本
#!/bin/bash
switch=br0
if [ -n "$1" ];then
 brctl delif $switch $1
 ip link set $1 down
 exit 0
else
 echo "Error: No Interface."
 exit 1
fi
[root@localhost kvm]# chmod +x start stop #添加执行权限
[root@localhost kvm]# ls -lh #查看一下
total 16K
drwxr-xr-x 2 root root 4.0K Sep 12 14:49 centos6.8 test1
drwxr-xr-x 2 root root 4.0K Aug 26 13:47 iso
-rwxr-xr-x 1 root root 174 Sep 12 16:28 start
-rwxr-xr-x 1 root root 163 Sep 12 16:28 stop

⑤安装VNC软件以便能够开启虚拟机后方便进行安装:

[root@localhost kvm]# yum install tigervnc -y #直接安装即可

⑥执行qemu-kvm命令让虚拟机启动起来!

首先qemu-kvm有许多子命令,这个我在博客中不详细说明(只列出比较常用的),如果有问题可以参考KVM官网 | redhat的说明

qemu-kvm -name "centos6.8 test1" \
> -m 512 \
> -smp 1 \
> -drive file=centos6.8,if=virtio,media=disk,snapshot=on,format=qcow2 \
> -drive file=/kvm/iso/CentOS-6.8-x86_64-minimal.iso,media=cdrom \
> -net nic -net tap,ifname=vnet0,script=/kvm/start,downscript=/kvm/stop \
> -boot order=cd,once=d
#说明:其中-name给虚拟机起名
#-m为内存大小默认以MB为单位
#-smp为vcpu个数我这边选了一个
#第一个-drive为写明了磁盘映像文件位置和相关属性!
#第二个-drive写明了iso映像文件位置!
#-net我写了两个第一个写明了创建一个新的网卡第二个写明了网卡名称然后还有启动和停止脚本位置
#最后一项-boot写明了启动顺序,第一次开机使用的光盘!

⑦使用安装好的VNC进行连接:

注意:首先要和xen使用图形化一样需要安装x window system包组,随后还得在putty->ssh->tunnels添加端口的映射。source为源端口就是VNCVIEWER提示的端口,不行使用ss -tnl查看!Destination为目标端口,格式为:127.0.0.1:5972 就是IP+端口

启用之后应该是这样的:

kvm01

看到它监听的端口了吗?5900?此时不要使用ctrl+c打断打开一个新的ssh窗口按照这样就能打开:

kvm02

打开之后就是正常安装啦:

kvm03

安装完毕以后看看IP地址等项目是否符合你的要求,随后就能使用ssh连入虚拟机了!


使用libvirt工具来创建一个KVM虚拟机:

①首先还是老样子创建一个映像文件:

[root@localhost centos7 test1]# qemu-img create -f qcow2 -o size=15G,preallocation="metadata" centos7.qcow2 #至于放在哪里那是你的事情哦!
[root@localhost centos7 test1]# ls -lh
total 2.6M
-rw-r--r-- 1 root root 16G Sep 13 10:37 centos7.qcow2

②创建一个桥接网卡设备,我在使用qemu-kvm工具栈已经说过了这里不在详述。不过不用桥接也可以使用libvirt中的默认NAT网络!

③使用virt-install来创建一个centos7虚拟机:

virt-install -n "centos7" \
> -r 768 --vcpus=1 \
> -c /kvm/iso/CentOS-7-x86_64-Minimal-1511.iso \
> --os-type=linux \
> --disk path=centos7.qcow2,device=disk,bus=virtio,size=15,format=qcow2 \
> --network bridge=br0,model=virtio \
> --graphics vnc,listen=0.0.0.0,port=5900
#其中-n 为指明名称
#-r&--vcpus为指明内存大小(默认单位为MB)和虚拟cpu核心数量
#-c指明iso文件路径
#--os-type写出操作系统属于哪一种(可写可不写)
#--disk 其中path为路径、device是存储种类、bus为存储链接的线缆(ide sata等)size为大小format为磁盘映像文件格式
#--network 我这边写的是桥接接口使用的设备为virtio 如果需要使用nat网络可以这样写为:network=default
#--graphics这个写为图像输出位置,我这里写的是vnc不过不写也可以使用virt-viewer不过别忘了先安装这个包!

④安装操作系统,这个完成第三步就已经算OK了接下来直接自行安装和测试!放个成功的图片:kvm04

那么安装好以后如何管理虚拟机呢?如何通过命令来停止或者启动?如果删除不要的虚拟机?怎么样使用virt-manager图形化来管理虚拟机?我从下一篇开始慢慢讲!

Comments

Leave a Reply

Your email address will not be published. Name and email are required