Redhat/CentOS系統KVM虛擬機安裝過程詳解

什麼是 KVM ?

KVM 是指基於 Linux 內核的虛擬機(Kernel-based Virtual Machine)。 2006 年 10 月,由以色列的Qumranet 組織開發的一種新的「虛擬機」實現方案。 2007 年 2 月發佈的 Linux 2.6.20 內核第一次包含了 KVM 。增長 KVM 到 Linux 內核是 Linux 發展的一個重要里程碑,這也是第一個整合到 Linux 主線內核的虛擬化技術。python

KVM 在標準的 Linux 內核中增長了虛擬技術,從而咱們能夠經過優化的內核來使用虛擬技術。在 KVM 模型中,每個虛擬機都是一個由 Linux 調度程序管理的標準進程,你能夠在用戶空間啓動客戶機操做系統。一個普通的 Linux 進程有兩種運行模式:內核和用戶。 KVM 增長了第三種模式:客戶模式(有本身的內核和用戶模式)。mysql

一個典型的 KVM 安裝包括如下部件:linux

  • 一個管理虛擬硬件的設備驅動,這個驅動經過一個字符設備 /dev/kvm 導出它的功能。經過 /dev/kvm每個客戶機擁有其自身的地址空間,這個地址空間與內核的地址空間相分離或與任何一個正運行着的客戶機相分離。web

  • 一個模擬硬件的用戶空間部件,它是一個稍微改動過的 QEMU 進程。從客戶機操做系統執行 I/O 會擁有QEMU 。 QEMU 是一個平臺虛擬化方案,它容許整個 PC 環境(包括磁盤、顯示卡(圖形卡)、網絡設備)的虛擬化。任何客戶機操做系統所發出的 I/O 請求都被攔截,並被路由到用戶模式用以被 QEMU 過程模擬仿真。sql

CentOS上安裝KVM功能模塊步驟

1.KVM 須要有 CPU 的支持(Intel VT 或 AMD SVM),在安裝 KVM 以前檢查一下 CPU 是否提供了虛擬技術的支持。centos

  •   基於 Intel 處理器的系統,運行grep vmx /proc/cpuinfo查找 CPU flags 是否包括 vmx 關鍵詞api

  •   基於 AMD 處理器的系統,運行grep svm /proc/cpuinfo查找 CPU flags 是否包括 svm 關鍵詞安全

  •   檢查BIOS,確保BIOS裏開啓VT選項:bash

注 : 一些廠商禁止了機器 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_ftp
iptables -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o em1  -j ACCEPT
iptables -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 ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT#for kvmiptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT

iptables -A INPUT -p tcp -j REJECT --reject-with tcp-resetiptables -A INPUT -j DROP
iptables -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 autostart
drwx------. 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 
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE 
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit vm_1
or other application using the libvirt API.
--><domain type='kvm'>
  <name>vm_1</name>  //此處爲hostname  <uuid>2f952159-b231-80a4-8086-d49978513fb4</uuid>  //此處爲uuid標識  <memory unit='KiB'>8388608</memory>  //此處爲內存  <currentMemory unit='KiB'>8388608</currentMemory>
  <vcpu placement='static'>6</vcpu>  //此處爲cpu核數  <os>
    <type arch='x86_64' machine='rhel6.5.0'>hvm</type>
    <boot dev='hd'/>  //此處爲啓動項目,若想從光盤啓動可設置爲<boot dev='cdrom'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>  //此處爲關機命令 使用 virsh destroy vm_1 關閉  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>  //此處爲硬盤信息      <driver name='qemu' type='raw' cache='none'/>
      <source file='/home/kvm/vm_1.qcow2'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='block' device='cdrom'>  //此處爲cdrom信息,可修改成iso的路徑      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0'>  //此處爲usb接口信息      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='network'>  //此處爲網卡1信息,使用network也就是nat模式鏈接virbr0聯網      <mac address='52:54:00:9a:d7:82'/>
      <source network='default'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <interface type='bridge'>  //此處爲網卡2信息,使用bridge橋接方式到br1      <mac address='52:54:11:fd:39:23'/>
      <source bridge='br1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </interface>//若要添加網卡可新加配置,注意修改mac地址    <interface type='bridge'>
      <mac address='52:54:21:fd:39:23'/>
      <source bridge='br0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </interface>

    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5920' autoport='no' listen='0.0.0.0'>  //此處爲VNC鏈接端口      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </memballoon>
  </devices></domain>[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 
<network>
  <name>default</name>
  <uuid>a8e0859c-4761-4d78-bcd6-eaeeceace429</uuid>
  <bridge name="virbr0" />
  <mac address='52:54:00:C9:D5:1E'/>
  <forward/>
  <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.122.2" end="192.168.122.254" />
    </dhcp>
  </ip></network>[root@localhost qemu]#

建立方法:

使用virsh net-start default來啓動nat網絡,同時,虛擬機支持模塊會修改iptables規則,經過命令能夠查看:

# iptables -t nat -L -nv
Chain PREROUTING (policy ACCEPT 16924 packets, 2759K bytes)
pkts bytes target     prot opt in     out     source               destination
Chain 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

#手動IP
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.122.3
NETMASK=255.255.255.0
GATEWAY=192.168.122.1
DNS1=192.168.122.1
TYPE=Ethernet
BOOTPROTO=static
IPV6INIT=no
USERCTL=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=br0
BOOTPROTO=none
TYPE=Bridge
IPADDR=114.137.122.233
NETMASK=255.255.255.128
GATEWAY=114.137.102.139
DNS1=202.96.122.83
IPV6INIT=no
NM_CONTROLLED=yes
ONBOOT=yes
USERCTL=no

[root@localhost network-scripts]# cat ifcfg-br1
DEVICE=br1
BOOTPROTO=none
TYPE=Bridge
IPADDR=192.168.1.12
NETMASK=255.255.255.0
IPV6INIT=no
ONBOOT=yes
USERCTL=no

[root@localhost network-scripts]# cat ifcfg-em1 
DEVICE=em1
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br0
TYPE=Ethernet
IPV6INIT=no
USERCTL=no

[root@localhost network-scripts]# cat ifcfg-em2
DEVICE=em2
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br1
TYPE=Ethernet
IPV6INIT=no
USERCTL=no

========kvm==========

[root@gateway-2 network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
IPADDR=114.137.122.222
NETMASK=255.255.255.128
GATEWAY=114.137.102.139
DNS1=202.96.122.83

[root@gateway-2 network-scripts]# cat ifcfg-eth0:1
DEVICE=eth0:1
TYPE=Ethernet
ONBOOT=yes
IPADDR=114.137.122.123
NETMASK=255.255.255.128
NM_CONTROLLED=yes
BOOTPROTO=static

[root@gateway-2 network-scripts]# cat ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.1.25
NETMASK=255.255.255.0
TYPE=Ethernet
BOOTPROTO=static
IPV6INIT=no
USERCTL=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的也沒發現問題~~~~

真實匪夷所思~~~

最後抱着嘗試一下的心態按照http://www.linuxidc.com/Linux/2012-05/61445.htm這篇文章配置了,果斷就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

<network>
  <name>default</name>
  <uuid>ea07af3d-fd95-444d-a1d2-a0ae5fce43de</uuid>
  <forward mode='nat'/>   //此處增長mode參數爲nat
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='52:54:00:89:DD:12'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
    </dhcp>
  </ip>
</network>

[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

······
    <interface type='network'>
      <mac address='52:54:00:66:6e:49'/>
      <source network='default'/>
      <model type='virtio'/>  //此處爲新增參數mode
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
······