一、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
測試可以正常啟動安裝。
- 以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 登陸測試
測試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
在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鏡像鏡像引導啟動
為了示範,這裡僅啟動的是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
可以看到node2上的vnc連接配接處于空白狀态。等待遷移
node1:
使用本地vnc連接配接檢視IP
vncviewer :5901
在主控端長ping測試
遷移操作開始:
# 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的節點自動變成活動狀态
ping的測試結果
有一個丢包;遷移過程中的延遲較大。可能與機器性能相關。
到此實時遷移完成。
-------------------------------------------------------------------------------------------
五、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 ...
.................安裝正在進行中
- 基于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".
# 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配置以完成。