天天看點

虛拟化工具KVM的安裝配置詳解

一、KVM定義

基于核心的虛拟機(英語:Kernel-based Virtual Machine,簡稱KVM),是一種用于Linux核心中的虛拟化基礎設施。KVM目前支援Intel VT及AMD-V的原生虛拟技術。

  • 是x86架構且硬體支援虛拟化技術(如 intel VT 或 AMD-V)的Linux全虛拟化解決方案。
  • 它包含一個為處理器提供底層虛拟化 可加載的核心子產品kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
  • KVM還需要一個經過修改的QEMU軟體(qemu-kvm),作為虛拟機上層控制和界面。
  • 在主流的Linux核心,如2.6.20以上的核心均已包含了KVM核心。
  • KVM能在不改變linux或windows鏡像的情況下同時運作多個虛拟機,(它的意思是多個虛拟機使用同一鏡像)并為每一個虛拟機配置個性化硬體環境(網卡、磁盤、圖形擴充卡……)。

可以對kvm進行控制管理的元件主要有兩個:

QEMU-KVM:

在 Linux 系統中,首先我們可以用 modprobe 系統工具去加載 KVM 子產品,如果用 RPM 安裝 KVM 軟體包,系統會在啟動時自動加載子產品。加載了子產品後,才能進一步通過其他工具建立虛拟機。但僅有 KVM 子產品是遠遠不夠的,因為使用者無法直接控制核心子產品去做事情,還必須有一個使用者空間的工具。關于使用者空間的工具,KVM 的開發者選擇了已經成型的開源虛拟化軟體 QEMU。QEMU 是一個強大的虛拟化軟體,它可以虛拟不同的 CPU 構架。比如說在 x86 的 CPU 上虛拟一個 Power 的 CPU,并利用它編譯出可運作在 Power 上的程式。KVM 使用了 QEMU 的基于 x86 的部分,并稍加改造,形成可控制 KVM 核心子產品的使用者空間工具 QEMU-KVM。是以 Linux 發行版中分為 kernel 部分的 KVM 核心子產品和 QEMU-KVM 工具。這就是 KVM 和 QEMU 的關系。

Libvirt/Virsh/Virt-manager:

盡管 QEMU-KVM 工具可以建立和管理 KVM 虛拟機,RedHat 為 KVM 開發了更通用的輔助工具libvirt。Libvirt 是一套提供了多種語言接口的 API,為各種虛拟化工具提供一套友善、可靠的程式設計接口,不僅支援 KVM,而且支援 Xen 等其他虛拟機。使用 libvirt,你隻需要通過 libvirt 提供的函數連接配接到 KVM 或 Xen 主控端,便可以用同樣的指令控制不同的虛拟機了。Libvirt 不僅提供了 API,還自帶一套基于文本的管理虛拟機的指令 virsh,你可以通過使用 virsh 指令來使用 libvirt 的全部功能。同時還能使用圖形界面進行管理操作,其工具是 Virt-manager。他是一套用 python 編寫的虛拟機管理圖形界面,使用者可以通過它直覺地操作不同的虛拟機。Virt-manager 就是利用 libvirt 的 API 實作的。

二、安裝軟體

1、需要先檢視主機是否支援虛拟化

# grep -Ei --color=auto "vmx|svm" /proc/cpuinfo
如果能grep到相關關鍵字就說明支援
可以手動裝載子產品
# modprobe kvm_intel
# modprobe kvm
# lsmod | grep kvm
kvm_intel              54285  0 
kvm                   333172  1 kvm_intel
裝載完成後kernel就已經轉換成hypervisor;可以使用kvm虛拟機      

2、安裝配置qemu-kvm

# yum -y install qemu-kvm qemu-kvm-tools
由于安裝完成後預設的目錄不在PATH環境變量中;需要做個連結才能使用qemu虛拟機
# ln -sv /usr/libexec/qemu-kvm /usr/sbin/      
  • 擷取幫助資訊
# qemu-kvm -help
usage: qemu [options] [disk_p_w_picpath]
'disk_p_w_picpath' is a raw hard p_w_picpath p_w_picpath for IDE hard disk 0
Standard options:
-h or -help     display this help and exit
-version        display version information and exit
-M machine      select emulated machine (-M ? for list)
-cpu cpu        select CPU (-cpu ? for list)
......

# qemu-kvm -cpu ?
x86       Opteron_G5  AMD Opteron 63xx class CPU                      
x86       Opteron_G4  AMD Opteron 62xx class CPU                      
x86       Opteron_G3  AMD Opteron 23xx (Gen 3 Class Opteron)          
x86       Opteron_G2  AMD Opteron 22xx (Gen 2 Class Opteron)
....
選項太多;這裡不做一一解釋;幫助資訊說明也很詳細;後續用到的做說明      
  • 建立虛拟機
為了顯示友善;需要安裝vnc軟體
# yum -y install tigervnc tigervnc-server
# mkdir /p_w_picpaths/vm1 -pv        建立目錄存儲鏡像檔案
# ls rhel-server-6.4-i386-dvd.iso    本地CD光牒鏡像檔案
# qemu-img create -f qcow2 -o size=100G,preallocation=metadata /p_w_picpaths/vm1/redhat6.qcow2
建立一個100G的檔案
# qemu-kvm -name "redhat" -m 512 -smp 1 -drive file=/p_w_picpaths/vm1/redhat6.qcow2,\
> if=virtio,index=0,media=disk,format=qcow2 \
> -drive file=/root/rhel-server-6.4-i386-dvd.iso,media=cdrom,index=1 \
> -boot order=d
VNC server running on `::1:5900'
-m 512:指定記憶體
-smp 1:指定vcpu
-drive:指定磁盤
if=virtio,index=0,media=disk,format=qcow2     #磁盤參數;具體可以qemu-kvm -help檢視
-boot order=d:指定引導次序;a、b表示軟驅、c表示第一塊硬碟,d表示第一個光驅裝置,n-p表示網絡擴充卡
VNC server running on `::1:5900':vnc server啟動運作在5900端口
#另起一個ssh視窗連接配接本地連接配接vnc測試
# vncviewer :5900      
虛拟化工具KVM的安裝配置詳解

測試可以正常啟動安裝。

  • 以pxe引導安裝
#需要網卡支援;是以需要寫一個配置網卡接口的腳本;預設在/etc/qemu-ifup
# vim /etc/qemu-ifup 
#!/bin/bash
#
switch=br0
if [ -n $1 ];then
        ifconfig $1 up
        sleep 1
        brctl addif $switch $1
        exit 0
else
        echo "Error: No Specifed interface."
        exit 1
fi
# chmod +x /etc/qemu-ifup
#腳本能自動調用指令中ifname=""網卡的名稱      
# qemu-kvm -name "redhat" -m 512 -smp 1 -drive file=/p_w_picpaths/vm1/redhat6.qcow2,if=virtio,index=0,media=disk,format=qcow2 -boot order=n -net nic,model=virtio -net tap,ifname=vnet0,downscript=no
VNC server running on `::1:5900'
# downscript是在關閉虛拟機是自動調用一個down的腳本;是以在此關閉就不會報錯
# 參數與上述的CD光牒安裝沒有太多不同;唯一啟動次序更改為網絡啟動n
# vncviewer :5900       登陸測試      
虛拟化工具KVM的安裝配置詳解

測試pxe引導安裝正常。

3、登陸測試

注意:在系統安裝完成後再次啟動時;還是一樣的指令;指定各種屬性。隻是引導方式改變了。

# qemu-kvm -name "rhel6" -m 512 -smp 2 -drive file=/p_w_picpaths/vm1/rhel6.qcow2,media=disk,if=virtio,index=0,format=qcow2 -net nic,model=virtio -net tap,ifname=vnet0,downscript -vnc :1 --daemonize
# ss -tunlp | grep 5901
tcp    LISTEN     0      1                      *:5901                  *:*      users:(("qemu-kvm",6528,13))
測試在背景啟動正常
# ifconfig vnet0        可以看到網卡已建立成功
vnet0     Link encap:Ethernet  HWaddr 92:3A:BB:E4:2D:6A  
# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c295e1e4f	no		eth0
							vnet0
#檢視已關聯到橋br0      
虛拟化工具KVM的安裝配置詳解

在windows用戶端登陸vnc,測試可以正常登陸虛拟機。

關閉虛拟機;隻需kill掉程序即可

# netstat -tunlp | grep 5901
tcp        0      0 0.0.0.0:5901                0.0.0.0:*                   LISTEN      6528/qemu-kvm       
# kill 6528      

測試啟動windows

# qemu-kvm -name "winxp" -m 512 -smp 2 -drive file=/p_w_picpaths/vm1/winxp.qcow2,if=virtio,media=disk,index=0,format=qcow2 -drive file=/root/winxp_ghost.iso,media=cdrom -boot order=d -vnc :1
#使用winxp的Ghost鏡像鏡像引導啟動      
虛拟化工具KVM的安裝配置詳解

為了示範,這裡僅啟動的是PE;并沒有真正的安裝。

4、虛拟機詳細資訊檢視

# qemu-kvm -name "rhel6" -m 512 -smp 2 -drive file=/p_w_picpaths/vm1/rhel6.qcow2,if=virtio,media=disk,index=0,format=qcow2 -net nic,model=virtio -net tap,ifname=vnet0,downscript=no -vnc none -monitor stdio
QEMU 0.12.1 monitor - type 'help' for more information
(qemu)
-vnc none:表示啟動時不啟動vnc
-monitor stdio:表示監控界面輸出到标準輸入輸出上
 (qemu) change vnc :1        #在監控界面下啟動vnc
 # ss -tunlp | grep 5901
tcp    LISTEN     0      1                      *:5901                  *:*      users:(("qemu-kvm",3215,16))
    
(qemu) info help        #info資訊能檢視虛拟機很多狀态
info version  -- show the version of QEMU
info commands  -- list QMP available commands
info network  -- show the network state
info chardev  -- show the character devices
info block  -- show the block devices
info blockstats  -- show block device statistics
info registers  -- show the cpu registers
.....
(qemu) info cpus        #顯示虛拟cpu;可以看到cpu線程号
* CPU #0: pc=0xffffffff8103eacb (halted) thread_id=3246 
  CPU #1: pc=0xffffffff8103eacb (halted) thread_id=3247      

三、qemu-img的使用

  • 幫助資訊:
# qemu-img --help
usage: qemu-img command [command options]
QEMU disk p_w_picpath utility
Command syntax:
  check [-f fmt] [--output=ofmt] [-r [leaks | all]] filename
  create [-f fmt] [-o options] filename [size]
  commit [-f fmt] [-t cache] filename
  convert [-c] [-p] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-S sparse_size] filename [filename2 [...]] output_filename
....
#可以看到qemu-img除了建立磁盤;可以檢查、轉換等...      
  • 建立磁盤并轉換格式增加容量:
# qemu-img create -f qcow2 -o preallocation=metadata /p_w_picpaths/vm2/test.qcow2 10G
# qemu-img resize /p_w_picpaths/vm2/test.qcow2 +10G    增到10G
Image resized.
# qemu-img info /p_w_picpaths/vm2/test.qcow2
p_w_picpath: /p_w_picpaths/vm2/test.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 1.7M
cluster_size: 65536      
  • 轉換格式:
# qemu-img create -f vmdk -o ? test.vmdk        #模拟檢視相關的幫助資訊
Supported options:
size             Virtual disk size
adapter_type     Virtual adapter type, can be one of ide (default), lsilogic, buslogic or legacyESX
backing_file     File name of a base p_w_picpath
compat6          VMDK version 6 p_w_picpath
    
# qemu-img convert -O vmdk -o adapter_type=lsilogic /p_w_picpaths/vm2/test.qcow2 /p_w_picpaths/vm2/test.vmdk
轉換成VMware的vmdk格式
# qemu-img info /p_w_picpaths/vm2/test.vmdk
p_w_picpath: /p_w_picpaths/vm2/test.vmdk
file format: vmdk
virtual size: 20G (21474836480 bytes)
disk size: 16K      
  • 建立快照
# qemu-img snapshot -l /p_w_picpaths/vm1/rhel6.qcow2       建立之前檢視是否有快照;建議不要同名
# qemu-img snapshot -c rhel6-1.snap /p_w_picpaths/vm1/rhel6.qcow2 
# qemu-img snapshot -l /p_w_picpaths/vm1/rhel6.qcow2
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         rhel6-1.snap              0 2014-05-25 10:51:34   00:00:00.000

Parameters to snapshot subcommand:        #詳細幫助
  'snapshot' is the name of the snapshot to create, apply or delete
  '-a' applies a snapshot (revert disk to saved state)        應用快照
  '-c' creates a snapshot                                     建立快照
  '-d' deletes a snapshot                                     删除快照
  '-l' lists all snapshots in the given p_w_picpath                 檢視快照清單      

四、實時遷移

node1:
# vim /etc/exports        啟動nfs;共享鏡像目錄
/p_w_picpaths/vm1     192.168.0.0/24(rw,no_root_squash)
# service nfs start
# exportfs -v
/p_w_picpaths/vm1   	192.168.0.0/24(rw,wdelay,no_root_squash,no_subtree_check)

-----------------------------------------------------------------------------------------
node2:
# mount -t nfs 192.168.0.111:/p_w_picpaths/vm1/ /p_w_picpaths/vm1/
# ls /p_w_picpaths/vm1/
redhat6.qcow2  rhel6.qcow2
# qemu-kvm -name "rhel6" -m 512 -smp 2 -drive file=/p_w_picpaths/vm1/rhel6.qcow2,if=virtio,media=disk,index=0 -boot order=c -net nic,model=virtio -net tap,ifname=vnet0,downscript=no -monitor stdio -incoming tcp:0:6767
啟動一個虛拟機執行個體,這裡要與node1啟動配置相同,可以copy node1的指令
-incoming:等待别的虛拟機遷移過來;并非正真的啟動虛拟機
tcp:tcp協定
0:表示運作所有主機往本機遷移
6767:監聽在一個沒有被占用的端口等待遷移      
  • 遷移測試:
node1:
# qemu-kvm -name "rhel6" -m 512 -smp 2 -drive file=/p_w_picpaths/vm1/rhel6.qcow2,if=virtio,media=disk,index=0 -boot order=c -net nic,model=virtio -net tap,ifname=vnet0,downscript=no -nographic -monitor stdio
(qemu) migrate tcp:192.168.0.112:6767


node2:
QEMU 0.12.1 monitor - type 'help' for more information
(qemu) Unknown savevm section or instance 'kvm-tpr-opt' 0
load of migration failed
#報錯;找了好久;沒找到答案;貌似說是bug;具體也不太清楚
如有知道的大神;感謝解答      

補充:重新測試突然發現成功了

首先在node1和node2都啟動一個虛拟機執行個體:

#前提是使用的共享存儲;與上述的準備條件是一樣的
node1:
# qemu-kvm -name "node1" -m 512 -smp 2 -drive file=/p_w_picpaths/vm1/rhel6.qcow2,if=virtio,media=disk,index=0 -net nic,model=virtio -net tap,ifname=vnet0,downscript=no -vnc :1 -monitor stdio 

node2:    #注意node2并非正真啟動虛拟機執行個體;隻是等待其他機器的遷移
# qemu-kvm -name "node2" -m 512 -smp 2 -drive file=/p_w_picpaths/vm1/rhel6.qcow2,if=virtio,media=disk,index=0 -net nic,model=virtio -net tap,ifname=vnet0,downscript=no -vnc :1 -monitor stdio -incoming tcp:0:6767
#監聽于6767端口等待其他機器遷移
#本地連接配接vnc監控
vncviewer :5901      
虛拟化工具KVM的安裝配置詳解

可以看到node2上的vnc連接配接處于空白狀态。等待遷移

node1:

使用本地vnc連接配接檢視IP
vncviewer :5901      
虛拟化工具KVM的安裝配置詳解

在主控端長ping測試

虛拟化工具KVM的安裝配置詳解

遷移操作開始:

# qemu-kvm -name "node1" -m 512 -smp 2 -drive file=/p_w_picpaths/vm1/rhel6.qcow2,if=virtio,media=disk,index=0 -net nic,model=virtio -net tap,ifname=vnet0,downscript=no -vnc :1 -monitor stdio
QEMU 0.12.1 monitor - type 'help' for more information
(qemu) migrate tcp:192.168.0.112:6767
#在node1的狀态下操作      

由于上述兩個節點的本地vnc都啟動了;這時可以看到node2的節點自動變成活動狀态

虛拟化工具KVM的安裝配置詳解

ping的測試結果

虛拟化工具KVM的安裝配置詳解

有一個丢包;遷移過程中的延遲較大。可能與機器性能相關。

到此實時遷移完成。

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

五、Libvirt機器相關軟體包的安裝使用

  • 安裝前配置
# yum -y install libvirt virt-manager virt-viewer python-virtinst
# service libvirtd start        啟動libvirt
# virsh         添加網橋
virsh # help iface-bridge
  SYNOPSIS
    iface-bridge <interface> <bridge> [--no-stp] [--delay <number>] [--no-start]
  DESCRIPTION
    bridge an existing network device
  OPTIONS
    [--interface] <string>  existing interface name
    [--bridge] <string>  new bridge device name
    --no-stp         do not enable STP for this bridge
    --delay <number>  number of seconds to squelch traffic on newly connected ports
    --no-start       don't start the bridge immediately
virsh # iface-bridge eth0 br0
Created bridge br0 with attached device eth0
Bridge interface br0 started
# ifconfig br0                            建立成功
br0       Link encap:Ethernet  HWaddr 00:0C:29:DF:70:B6  
          inet addr:192.168.0.112  Bcast:192.168.255.255  Mask:255.255.0.0      
  • 安裝系統
# virt-install -n "centos6" --vcpus 2 -r 512 -l http://172.16.0.1/cobbler/ks_mirror/centos-6.5-x86_64 --disk path=/p_w_picpaths/vm2/cents6.qcow2,bus=virtio,size=10,sparse --network bridge=br0,model=virtio --force
Starting install...
Retrieving file .treeinfo...                                                             |  676 B     00:00 ... 
Retrieving file vmlinuz...                                                               | 7.9 MB     00:00 ... 
.................安裝正在進行中      
虛拟化工具KVM的安裝配置詳解
  • 基于pxe安裝
# virt-install --name "centos6" -r 512 --vcpus 2 --disk path=/p_w_picpaths/vm2/centos.img,size=120 --network bridge=br0,model=virtio --pxe --force
WARNING  KVM acceleration not available, using 'qemu'

Starting install...
Creating domain...                                                                       |    0 B     00:00     
Xlib:  extension "RANDR" missing on display "localhost:13.0".      
虛拟化工具KVM的安裝配置詳解
# virsh list    檢視虛拟機狀态資訊
 Id    Name                           State
----------------------------------------------------
 7     centos6                        running      

幫助資訊檢視

# virsh help        幫助資訊很詳細
Grouped commands:

 Domain Management (help keyword 'domain'):
    attach-device                  attach device from an XML file
    attach-disk                    attach disk device
    attach-interface               attach network interface
    autostart                      autostart a domain
    blkdeviotune                   Set or query a block device I/O tuning parameters.
    blkiotune                      Get or set blkio parameters
  
# virsh help monitor    可以僅檢視關鍵字的資訊
 Domain Monitoring (help keyword 'monitor'):
    domblkerror                    Show errors on block devices
    domblkinfo                     domain block device size information
    domblklist                     list all domain blocks
    domblkstat                     get device block stats for a domain
    domcontrol                     domain control interface state
    domif-getlink                  get link state of a virtual interface
    domiflist                      list all domain virtual interfaces
    domifstat                      get network interface stats for a domain
    dominfo                        domain information
    dommemstat                     get memory statistics for a domain
    domstate                       domain state
    list      

到此;基本的kvm配置以完成。