什么是 KVM ?

KVM 是指基于 Linux 内核的虚拟机(Kernel-based Virtual Machine)。 2006 年 10 月,由以色列的Qumranet 组织开发的一种新的“虚拟机”实现方案。 2007 年 2 月发布的 Linux 2.6.20 内核第一次包含了 KVM 。增加 KVM 到 Linux 内核是 Linux 发展的一个重要里程碑,这也是第一个整合到 Linux 主线内核的虚拟化技术。

KVM 在标准的 Linux 内核中增加了虚拟技术,从而我们可以通过优化的内核来使用虚拟技术。在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可以在用户空间启动客户机操作系统。一个普通的 Linux 进程有两种运行模式:内核和用户。 KVM 增加了第三种模式:客户模式(有自己的内核和用户模式)。

一个典型的 KVM 安装包括以下部件:

  • 一个管理虚拟硬件的设备驱动,这个驱动通过一个字符设备 /dev/kvm 导出它的功能。通过 /dev/kvm每一个客户机拥有其自身的地址空间,这个地址空间与内核的地址空间相分离或与任何一个正运行着的客户机相分离。

  • 一个模拟硬件的用户空间部件,它是一个稍微改动过的 QEMU 进程。从客户机操作系统执行 I/O 会拥有QEMU 。 QEMU 是一个平台虚拟化方案,它允许整个 PC 环境(包括磁盘、显示卡(图形卡)、网络设备)的虚拟化。任何客户机操作系统所发出的 I/O 请求都被拦截,并被路由到用户模式用以被 QEMU 过程模拟仿真。

CentOS上安装KVM功能模块步骤

1.KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安装 KVM 之前检查一下 CPU 是否提供了虚拟技术的支持。

  •   基于 Intel 处理器的系统,运行grep vmx /proc/cpuinfo查找 CPU flags 是否包括 vmx 关键词

  •   基于 AMD 处理器的系统,运行grep svm /proc/cpuinfo查找 CPU flags 是否包括 svm 关键词

  •   检查BIOS,确保BIOS里开启VT选项:

注 : 一些厂商禁止了机器 BIOS 中的 VT 选项 , 这种方式下 VT 不能被重新打开。**

注意:/proc/cpuinfo 仅从 Linux 2.6.15(Intel) 和 Linux 2.6.16(AMD) 开始显示虚拟化方面的信息。请使用 uname -r 命令查询您的内核版本。如有疑问,请联系硬件厂商。

2.iptables设置

[root@localhost qemu]# cat /bin/iptables.sh modprobe ip_conntrack_ftpiptables -Fiptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o em1  -j ACCEPTiptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT#for ping:iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPTiptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT#for kvmiptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPTiptables -A INPUT -p tcp -j REJECT --reject-with tcp-resetiptables -A INPUT -j DROPiptables -A FORWARD -j DROP[root@localhost qemu]#

3.安装与启动

yum install kvm libvirt python-virtinst qemu-kvm virt-viewer bridge-utils

/etc/init.d/libvirtd start

4.建立虚拟机

划分硬盘

qemu-img create -f qcow2 -o preallocation=metadata /home/kvm/centos65-x64-mysql.qcow2 200G

安装KVM,下面是两种常见的网络连接方式,默认是default,适用于不同需求的网络环境,后面配置KVM中会详细说明。

bridge网络模式

virt-install --name=gatewat-4 --ram 4096 --vcpus=4 -f /home/kvm/gateway-4.qcow2 --cdrom /home/iso/CentOS-6.5-x86_64-bin-DVD1.iso --graphics vnc,listen=0.0.0.0,port=5920, --network bridge=br0 --force --autostart

NAT网络模式

virt-install --name=test --ram 512 --vcpus=1 -f /home/kvm/test.qcow2 --cdrom /opt/CentOS-6.5-x86_64-bin-DVD1.iso --graphics vnc,listen=0.0.0.0,port=5988, --network network=default, --force --autostart

5.启动

使用virsh list --all查看已安装的kvm

使用virsh start test启动虚拟机

使用VNC工具连接KVM来进行初始化配置

配置KVM

使用virsh-install安装完KVM之后,会自动生成相应配置

KVM的配置文件存储在/etc/libvirt/qemu/

[root@localhost ~]# cd /etc/libvirt/qemu/[root@localhost qemu]# lltotal 24drwxr-xr-x. 2 root root 4096 Jul 24 17:30 autostartdrwx------. 3 root root 4096 Jun 20 19:21 networks-rw-------. 1 root root 2566 Aug 20 18:28 vm_1.xml-rw-------. 1 root root 2560 Jul  4 02:02 vm_2.xml-rw-------. 1 root root 2566 Aug 20 18:28 vm_3.xml

长的大概是这个样子

[root@localhost qemu]# cat vm_1.xml 
  
vm_1
  //此处为hostname  
2f952159-b231-80a4-8086-d49978513fb4
  //此处为uuid标识  
8388608  //此处为内存  
8388608  
6  //此处为cpu核数  
    
hvm    
  //此处为启动项目,若想从光盘启动可设置为
  
  
    
    
    
  
  
  
destroy
  //此处为关机命令 使用 virsh destroy vm_1 关闭  
restart
  
restart
  
    
/usr/libexec/qemu-kvm
    
  //此处为硬盘信息      
      
      
      
        
  //此处为cdrom信息,可修改为iso的路径      
      
      
      
        
  //此处为usb接口信息      
        
      
        
  //此处为网卡1信息,使用network也就是nat模式连接virbr0联网      
      
      
        
  //此处为网卡2信息,使用bridge桥接方式到br1      
      
      
    //若要添加网卡可新加配置,注意修改mac地址    
      
      
      
        
      
        
      
        
    
  //此处为VNC连接端口      
        
    
      
      
[root@localhost qemu]#

后期可能会因为需求对KVM重新配置,这个时候我们只需要修改对应的xml文件即可

修改配置的时候需要关闭KVM virsh destroy vm_1

使用virsh define vm_1.xml使配置生效

使用virsh start vm_1启动虚拟机

配置网路环境

1.nat模式配置

KVM默认采用nat模式,用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机。在公网IP不够使用KVM还需要上网的时候可以使用,大大节省了公网IP!同时这种模式也使得KVM不用暴露在公网之中,也增加了安全性。

下图是虚拟机管理模块产生的接口关系:

请输入图片描述

其中virbr0是由宿主机虚拟机支持模块安装时产生的虚拟网络接口,也是一个switch和bridge,负责把内容分发到各虚拟机。

从图上可以看出,虚拟接口和物理接口之间没有连接关系,所以虚拟机只能在通过虚拟的网络访问外部世界,无法从网络上定位和访问虚拟主机。

下面是nat的default配置,可以自定义地址池

[root@localhost qemu]# cat /etc/libvirt/qemu/networks/default.xml 
  
default
  
a8e0859c-4761-4d78-bcd6-eaeeceace429
  
  
  
  
    
      
    
  
[root@localhost qemu]#

创建方法:

使用virsh net-start default来启动nat网络,同时,虚拟机支持模块会修改iptables规则,通过命令可以查看:

# iptables -t nat -L -nvChain PREROUTING (policy ACCEPT 16924 packets, 2759K bytes)pkts bytes target     prot opt in     out     source               destinationChain POSTROUTING (policy ACCEPT 2009 packets, 125K bytes)pkts bytes target     prot opt in     out     source               destination         421 31847 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24   ----------->这条是关键,它配置了NAT功能。Chain OUTPUT (policy ACCEPT 2011 packets, 125K bytes)pkts bytes target     prot opt in     out     source               destination
 

如果你由于不小心将IPTABLE清空或者STOP导致IPTABLE配置丢失,可以通过如下操作来恢复:

#virsh net-destroy default#virsh net-start default

确认路由转发开启

[root@localhost qemu]# more /proc/sys/net/ipv4/ip_forward 1

下面是一个KVM的nat模式的范例

[root@vm_1 data]# cat /etc/sysconfig/network-scripts/ifcfg-eth0#使用dhcp#DEVICE=eth0#ONBOOT=yes#TYPE=Ethernet#BOOTPROTO=dhcp#手动IPDEVICE=eth0ONBOOT=yesIPADDR=192.168.122.3NETMASK=255.255.255.0GATEWAY=192.168.122.1DNS1=192.168.122.1TYPE=EthernetBOOTPROTO=staticIPV6INIT=noUSERCTL=no[root@vm_web_1_1 data]#

2.Bridge方式

虚拟网桥(Virtual Bridge):设置好后客户机与互联网,客户机与主机之间都可以通信,试用于需要多个公网IP的环境。

Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。

桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。

请输入图片描述

如上图,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据。

创建方法:

不用过多命令,只需要修改好网卡的桥接方式,配好IP即可,下面是范例,不用注释仔细读一遍就能看懂了!

========kvm_server==========[root@localhost network-scripts]# cat ifcfg-br0 DEVICE=br0BOOTPROTO=noneTYPE=BridgeIPADDR=114.137.122.233NETMASK=255.255.255.128GATEWAY=114.137.102.139DNS1=202.96.122.83IPV6INIT=noNM_CONTROLLED=yesONBOOT=yesUSERCTL=no[root@localhost network-scripts]# cat ifcfg-br1DEVICE=br1BOOTPROTO=noneTYPE=BridgeIPADDR=192.168.1.12NETMASK=255.255.255.0IPV6INIT=noONBOOT=yesUSERCTL=no[root@localhost network-scripts]# cat ifcfg-em1 DEVICE=em1ONBOOT=yesBOOTPROTO=noneBRIDGE=br0TYPE=EthernetIPV6INIT=noUSERCTL=no[root@localhost network-scripts]# cat ifcfg-em2DEVICE=em2ONBOOT=yesBOOTPROTO=noneBRIDGE=br1TYPE=EthernetIPV6INIT=noUSERCTL=no========kvm==========[root@gateway-2 network-scripts]# cat ifcfg-eth0DEVICE=eth0TYPE=EthernetONBOOT=yesNM_CONTROLLED=yesIPADDR=114.137.122.222NETMASK=255.255.255.128GATEWAY=114.137.102.139DNS1=202.96.122.83[root@gateway-2 network-scripts]# cat ifcfg-eth0:1DEVICE=eth0:1TYPE=EthernetONBOOT=yesIPADDR=114.137.122.123NETMASK=255.255.255.128NM_CONTROLLED=yesBOOTPROTO=static[root@gateway-2 network-scripts]# cat ifcfg-eth1DEVICE=eth1ONBOOT=yesIPADDR=192.168.1.25NETMASK=255.255.255.0TYPE=EthernetBOOTPROTO=staticIPV6INIT=noUSERCTL=no
注意:网络配置可以同时存在nat和Bridge

由于按照上文的NAT方式配置的机器,过了几个月宿主机重启之后死活连接不上外网ping不通virbr0(192.168.122.1),virsh net-destroy default和 virsh net-start default之后也是不行,尝试了各种方案,最后/etc/init.d/libvirtd restart之后会偶尔联上外网ping通192.168.122.1,但是virsh net-destroy default和 virsh net-start default之后又连不上外网,今天又在测试环境测试都是OK的也没发现问题~~~~

真实匪夷所思~~~

最后抱着尝试一下的心态按照这篇文章配置了,果断就OK了!再此记录一下!

宿主机配置

[root@web8 qemu]# cp /etc/libvirt/qemu/networks/default.xml /etc/libvirt/qemu/networks/default.xml.bk [root@web8 qemu]# cat /etc/libvirt/qemu/networks/default.xml
  
default
  
ea07af3d-fd95-444d-a1d2-a0ae5fce43de
  
   //此处增加mode参数为nat  
  
  
    
      
    
  
[root@web8 qemu]# virsh net-define /etc/libvirt/qemu/networks/default.xml[root@web8 qemu]# virsh net-destroy default[root@web8 qemu]# virsh net-start default[root@web8 qemu]# cat  vm.xml······    
      
      
      
  //此处为新增参数mode      
    ······