RSS訂閱

2015年12月13日 星期日

架設 Linux KVM 虛擬化主機 (Set up Linux KVM virtualization host)

Linux 核心從2007年的2.6.20 版本之後開始支援一種稱為「核心基礎虛擬機器 (Kernel-based Virtual Machine;KVM)」的虛擬化技術,KVM利用模組化的方式讓Linux核心具有Hypervisor的能力,不過比較起大家較為熟悉且市佔率較高的VMWare ESXi、Microsoft Hyper-V與 Xen,目前Linux  KVM不但較少獲得企業市場青睞於線上系統使用,亦較少為技術人員所熟知 ,因此本文將介紹Linux KVM的技術特性並探討說明其安裝、建置與管理維護等實務工作。

壹. KVM 虛擬化技術基礎

Linux KVM採用整合性虛擬化架構,架構中除了包含KVM核心模組外,還整合了QEMU與libvirt這二部份的套件與功能。
KVM 本身實作為Linux核心模組,透過可載入模組可將Linux系統轉換為Hypervisor,提供Linux系統一個完全虛擬化解決方案,亦即讓客體作業系統無需經過任何修改即可在虛擬機器上安裝執行,此外,Linux KVM架構與現代許多型一虛擬化技術(Type 1 Virtualizatio)一樣均需要主機CPU支援硬體協助虛擬化技術(Intel VT-x 或 AMD-V),亦可支援 EPT/NPT、VT-d、IOMMU、SR-IOV等功能,KVM還具有一些重要的特性:
  • KVM實作為Linux核心模組:
    kvm.ko:提供虛擬化基礎結構。
    kvm_intel.ko或 kvm_amd_amd.ko:提供特定處理器硬體平台模組。
  • KVM其它週邊裝置(如網路卡、顯示卡...等)的虛擬化功能,通常需藉助 QEMU 這個開放源始碼(Open Source)軟體來模擬並負責控制虛擬週邊裝置與實體週邊裝置溝通的橋樑。
  • 可支援X86以外的其它架構,如 S390(大型主機) 、PowerPC、ia64(Itanium)。
  • 支援準虛擬化輸入/輸出 (paravirtual I/O)。
  • 支援 CPU、區塊與網路裝置的熱拔插能力
  • 支援CPU和記憶體超額配置 (cpu and  memory overcommit)
  • 可支援 Live Migration。
一套完整而具備實用性的虛擬化軟體除了具有Hypervisor的基本能力之外,還需要有高效能的輸入/輸出裝置虛擬化能力以及易於管理的架構與工具,因此,這就需要搭配與整合QEMU與libvirt這二套軟體。
QEMU (Quick EMUlator)為一個通用性的開放源碼機器模擬器,本身就是一套具彈性和移植能力的完整虛擬化系統,可以單獨用以建立與安裝虛擬機器,QEMU採用一種特殊重新編譯的技術將某處理器的機器碼轉換為另一種處理器的機器碼,不過QEMU在未支援硬體協助虛擬化的機器上效率並不理想,因而可以利用其它支援硬體協助虛擬化技術的Hypervisor來提升效能與加速,而 Linux KVM 就是以 QEMU 為基礎,搭配其 CPU 硬體協助虛擬化技術而內建於Linux核心的虛擬化系統,所以一旦KVM與QEMU整合在一起,QEMU會產生執行緒(thread)來呼叫KVM核心模組來切換至客體模式執行特權指令,因此,KVM負責存取CPU與記憶體,而QEMU則用以模擬其它硬體資源 (如硬碟、網路、顯示、USB)。
另一方面,libvirt 是一套用以管理平台虛擬化的開原碼程式介面、Daemon與管理工具。libvirt提供一致性的方式管理KVM、Xen、VMWare ESX與QEMU等各種Hypervisor虛擬機器及相關虛擬化功能,而無需使用針對某特定Hypervisor所提供的工具,libvirt主要的管理功能包括虛擬機器管理、遠端機器管理、儲存與網路管理等,所以現代Linux的虛擬化功能經常是整合了QEMU、KVM核心模組和libvirt,而以QEMU虛擬化軟體搭配KVM提供硬體加速能力,再加上利用libvirt程式介面與工具來管理虛擬化功能。
下圖顯示了KVM架構中整合了QEMU模擬器與libvirt服務介面的關聯性。
kvm_arch
一. KVM虛擬磁碟格式
KVM 提供了數種虛擬化主機磁碟以及虛擬機器磁碟的方法,各有其優缺點:
  • 映像檔案:最主要的是支援了二種映像檔案格式:
    • 原生映像 (Raw images) :原生映像提供簡單磁碟內容存放而無額外負荷(no metadata),因此通常具有存取上較快的優點。
    • 第二代的 QEMU 格式(QEMU Copy On Write 2;qcow2) :QCOW2磁碟格式具有快照、壓縮與加密等額外的擴充功能,雖然速度稍差,不過第二代的qcow2的效率在許多實測數據上其實已與原生格式相去不遠,而qcow2的磁碟格式由於具有線上快照(snapshot)功能,這對於虛擬機器狀態的還原與備份卻是相當重要的。
  • 區塊裝置 (Block devices):利用區塊裝置來做為虛擬機器所使用的磁碟
    • 整個儲存裝置 (Entire devices):利用整個儲存裝置做為虛擬磁碟,例如 /dev/sdb。
    • 分割區 (Partitions):利用磁碟分割做為虛擬磁碟,例如 /dev/sdb2。
    • 邏輯磁區 (Logical Volumes):利用邏輯磁區管理員( Logical Volume Mamager;LVM) 所建立的邏輯磁區 (LV)來做為虛擬磁碟,例如 /dev/VolGroup00/LogVol00。LVM具有自己的快照功能,不過快照有點慢且會造成大量的主機I/O。
  • 網路服務與磁碟:如ISCSI/FC SAN。
二. 虛擬網路
內部網路虛擬化通常由虛擬交換器與虛擬介面組成,KVM利用 libvirt提供網路功能並且以網路虛擬交換器(Network Virtual Switch)的概念來提供虛擬機器間與外界的互通能力。
就實務面而言,介紹KVM如何建立三種Hypervisor最常用的虛擬網路模式:
  1. NAT網路模式:此為預設模式,利用iptables 的IP偽裝(IP masquerading )的轉址技術來讓虛擬機器可以經由主機介面的IP來與外界溝通,此種較適合用來建立不提供任何網路服務或資源的一般主機。(等同VMWare Workstation預設的NAT網路連線)。 
  2. 橋接網路模式:橋接模式讓虛擬機器直接透過實體網路介面連接至外界,就如同所有網段內其它實體主機一般擁有相同網段的IP位址,這種模式適合用來建立如網站、DNS或郵件伺服器等虛擬伺機器。(相當於VMWare Workstation的橋接模式或Hyper-V的外部網路) 
  3. 隔離網路模式:隔離網路模式允許讓KVM主機內的虛擬機器互通,亦可讓虛擬機與KVM主機連線,但無法與外界連接溝通,此種模式適合測試或實驗用途的機器。(相當於VMWare Workstation的Host-Only網路連接模式或Hyper-V的內部網路)
當系統第一次啟動libvirtd時會建立一個運作於NAT模式的虛擬交換器-- virbr0, 假若您使用ifconfig命令(或 ip addr)則可看到如下圖的顯示內容:
kvm_net1
而虛擬介面 virbr0的IP位址為192.168.122.1,其扮演NAT模式的虛擬交換器功能,另一方面也提供DHCP服務以動態指派IP組態給日後所建立的虛擬機器,因此預設的NAT網路模式架構如下圖所示:
kvm_netmode
由於CentOS KVM預設上只有此NAT虛擬介面,所以建議您額外建立一個橋接網路介面以及一個內部虛擬網路,以便日後新增虛擬機器時,可依據虛擬機器使用特性與連線需求來選擇適當的網路模式。
當您建立虛擬網路時,libvirt會將虛擬網路組態儲存在 /etc/libvirt/qemu/networks 目錄下。
三. 管理工具
由於KVM/QEMU為開放原始碼架構,因此有一堆可免費下載取得的管理工具以及需付費的商用工具,其中亦包括了命令列介面(CLI)、桌面圖形工具以及網頁式工具等多種介面,而大部份工具皆是利用libvirt服務介面來管理Hypervisor與虛擬機器,下列為一些常用的免費管理命令及工具:
  1. 命令指令:
    virsh :一個根據libvirt程式介面撰寫的最少可管理維護虛擬機器與Hypervisor的命令列介面(CLI)程式,可用來啟動、關閉虛擬機器與顯示虛擬機器資訊,此工具內附於libvirt-client套件內。
    virt-install:建立新的虛擬機器
    virt-clone :拷貝虛擬機器的映像
    qemu-img:qemu 磁碟映像管理工具
    libguestfs:這個套件擁有一群用來存取與修改虛擬磁碟的工具。
  2. 圖形介面工具:virt-manager、virt-viewer
下表為最常使用的 virsh工具命令用法:
virsh 命令 說明
list -all 顯示所有虛擬機器
list --inactive 顯示所有未啟動的虛擬機器
dominfo VM 顯示某一虛擬機器的訊息
nodeinfo 顯示有關於客體系統的資訊
edit VM 變更某虛擬機器的設定
start VM 啟動某部虛擬機器
shutdown VM 將某部虛擬機器正常關機
destroy VM 強制關閉某部虛擬機器
suspend VM 暫停某虛擬機器
resume VM 重新恢復先前被暫停的虛擬機器
dumpxml VM 顯示虛擬機器的XML組態檔的內容,可利用 > 來替虛擬機器產生XML組態檔
create vm.xml vm.xml 組態檔案內容來建立一部虛擬機器
undefine VM 刪除整個虛擬機器
save VM 儲存虛擬機器目前的狀態
restore VM 還原先前儲存的虛擬機器狀態
reboot VM 重新啟動某虛擬機器
net-list 顯示虛擬網路資訊
net-dumpxml 顯示某虛擬網路XML組態資訊
net-edit 設定與變更某虛擬網路組態
migrate 將虛擬機器遷移至其它主機


貳.  KVM基本安裝與建立虛擬機器

欲使用Centos Linux KVM虛擬化軟體建立虛擬機器相當直覺而容易,只需透過安裝軟體,準備安裝來源映像檔並新增虛擬機器三步驟即可,本節將說明如何執行這三個步驟並示範建立Windows 10的虛擬機器。
一. 檢查 KVM 硬體需求
KVM Hypervisor 需要在具有硬體協助虛擬化的Intel VT或AMD-V功能下之x86平台上才能夠支援完全虛擬化的運作,因此在安裝之前您需要先檢查機器上的CPU是否支援lntel VT 或 AMD-V這項硬體協助虛擬化功能 (機器上的BIOS上需先開啟虛擬化功能),判斷方法是檢查/proc/cpuinfo檔案中是否出現vmx或svm關鍵字,您可以請執行下列任一命令來確認這項需求:
# grep -c 'vmx\|svm' /proc/cpuinfo  或
# egrep -c '(vmx|svm)' /proc/cpuinfo 或
# cat /proc/cpuinfo | grep flags –m 1 (檢查是否出現關鍵字 vmx或svm)
kvmcputest
執行的結果若大於零則表示CPU可支援KVM硬體協助虛擬化功能,若結果為零則代表處理器並不支援硬體協助虛擬化功能,將無法使用KVM,但您仍可以使用 QEMU/KVM的純軟體虛擬化技術,只不過其執行效能將非常緩慢,此外,上述的命令只能檢查機器上的處理器是否支援lntel VT 或 AMD-V功能,並無法確認是否在BIOS上啟動這項功能,因此您還必需確認BIOS已開啟硬體虛擬化功能。
另一方面,您也可以執行lsmod以查看系統是否已載入 kvm核心模組以及何種CPU支援模組以確定系統可否使用kvm,如下圖例顯示了已核心已載入了Intel KVM模組 (若使用AMD 處理器,則會顯示字串  kvm_amd),右側的數字代表目前已新增的虛擬機器。
lsmodkvm
 二. 安裝 KVM套件 
CentOS 7中,可使用 yum命令安裝kvm相關套件,指令及所安裝的套件如下:
yum -y install qemu-kvm qemu-img virt-manager virt-viewer virt-install libvirt libvirt-python libvirt-client
上述命令所安裝的KVM/QEMU/libvirt相關套件之用途說明如下:
套件名稱
用途
qumu 一套完整和獨立的處理器模擬的自由軟體,由Fabrice Bellard所撰寫,Qemun負責所有週邊硬體的模擬工作
qemu-kvm 使用者層級(user-level) 的KVM模擬器
qumu-img KVM的磁碟映像管理程式
libvirt libvirt是一套管理平台虛擬化的開放原始碼的程式介面、背景服務(libvirtd)和管理工具。可用來管理許多不同的虛擬化軟體,如KVM、VMare ,ESXi、Qemu、Xen、Hyper-V。libvirt的背景服務程式 libvirtd則負責處理程式呼叫並管理虛擬機器和控制Hypervisor,提供Hypervisor與主機系統溝通之程式庫。
virt-install 提供建立虛擬機器的virt-install命令
virt-manager virt-manager也稱為虛擬機器管理員 (Virtual Machine Manager),提供管理虛擬機器的圖形工具,其利用libvirt-client 程式庫為其管理API。
virt-viewer 顯示虛擬機器的圖形主控台
libvirt-client libvirt-client套件提供用戶端程式介面以存取libvirt伺服器,包括了virsh命令列工具以管理和控制虛擬機器和Hypervisor。
libvirt-python
支援程式以 Python 語言呼叫 libvirt的程式介面
一旦安裝完成後,您需要再輸入systemctl status libvirtd ( CentOS 6 改以命令- service status libvirtd)以確認libvirt這個管理服務是否已啟動 ,若發現系統尚未啟動libvirtd,則請立即啟動並設定開機啟動它 (sytemctl start libvirtd;systemctl enable libvirtd):
libvirtd_status
三. 準備虛擬機器安裝的來源映像檔
由於Rhel7/CentOS7基於某些錯誤的緣故而把使用實體CD/DVD的功能(CD/DVD host passthrough disabled)停用了,因此除了經由網路安裝外,您通常需要預先準備好作業系統的來源ISO檔案以進行安裝虛擬機器,一般而言,Linux系統下可直接利用dd命令來將將CD/DVD轉換成可用的ISO映像檔:
dd if=/dev/cdrom of=/路徑/image.iso
另一方面,若您手上已有現存作業系統的ISO檔案,則可以利用任何方式上傳或拷貝至Linux主機機器上(如ftp、samba、NFS...)。
四. 新增虛擬機器
一旦完成KVM相關套件安裝並準備ISO映像檔後就可以簡單的建立第一部虛擬機器,您有二種建立KVM虛擬機器的方式:
  • 命令列指令:virt-install
  • 圖形介面:virt-manaer
◎ virt-install命令新增虛擬機器
一種較彈性的做法是利用virt-install命令來建立虛擬機器,因為這可以支援大部份的設定參數,不過由於需要輸入許多的選項及參數資料,使用時較不友善,底下範例指令建立一部Windows 10的虛擬機器,配置了1500MB記憶體,具有二個虛擬處理器,虛擬磁碟格式採用qcow2類型,使用SATA匯流排類型並且精簡配置20GB大小的磁碟空間 。
virt-install --name wins10 --ram 1500 --vcpus 2 --cdrom /tmp/wins10ent.iso --os-type=windows --disk /var/lib/libvirt/images/win10ent.qcow2,device=disk,bus=sata,format=qcow2,size=20

-n  --name
虛擬機器名稱
-r  --ram 記憶體大小 (MB)
--vcpus 虛擬CPU數量
--cdrom 指出 CD/DVD 的ISO映像檔案的位置與名稱 ,您可以利用location選項來指出安裝的網路位址
--location
作業系統的遠端安裝位置,例如 RHEL 7 x64的安裝位址為:
  -- location= htt p://my.server.com/pub/rhel 7 /install - x86_64/
--os-type 作業系統類型,可為 'linux', 'unix', 'windows'
--disk
指出虛擬磁碟相關選項,包括
    路徑 :
    格式:
    匯流排類型:
    大小 :磁碟大小 (GB)
--graphics
設定如何存取顯示安裝畫面,顯示類型可為 'vnc'、'sdl'、'spice'、'none'
如果您使用X Window來安裝虛擬機器,則可忽略這項參數,因為會自動利用virt-viewer工具 將安裝的虛擬機器顯示在X Server上。
--network
libvirt第一次安裝啟動時,預設上會自動建立一個NAT模式的虛擬交換器之virbr0介面,用以做為虛擬機器與外部溝通的預設網路組態,因此在大部份情境下,您 只使用此預設的NAT模式虛擬交換器預設網路組態即可讓所建立的虛擬機器具備網路連線能力,並無需設定這個網路選項。
但倘若您需要虛擬機器具有完整的直接連出與連入的連線能力,那您需要預先建立橋接網路介面,然後指定如下:
    -- network bridge:<橋接介面>
◎ virt-manager工具新增虛擬機器
由於virt-install命令指令的選項參數眾多,使用起來指令冗長著實不方便,若在X Window下利用圖形介面工具 virt-manager來建立與管理虛擬機器將會友善許多,不過逐頁設定方式缺乏了參數設定的彈性,做法說明如下:
  1. 首先,在X Windows中執行 "virt-manager" 工具。
  2. 按一下『新增』按鈕以啟動「建立新的虛擬機」程式畫面,接下來將依照此程式逐步引導的五個步驟完成虛擬機器新增設定。
    virt-manager0
  3. 第一個步驟需先設定安裝的來源,由於一些錯誤臭蟲的原因,Rhel7/CentOS7已經停用直接CD/DVD安裝方式,因此在此只得由DVD映像ISO檔來進行安裝,倘若是安裝開源碼的Linux系統且具有足夠頻寬下,則可直接由HTTP URL路徑安裝,此外,亦可支援經由網路開機(PXE)進行安裝(如果已架設了PXE 啟動伺服器或微軟的Windows 部署服務)或匯入一個已經存在的虛擬磁碟檔案。
    virt-manager1
  4. 第二個步驟將選取ISO映像檔的路徑與名稱並讓程式根據映像檔來自動判斷是何種作業系統和版本,若是程式無法正確偵測到正確的作業系統,則您也可以自行選擇所欲安裝的作業系統類型與版本。
    virt-manager2
  5. 第三個步驟則是選擇或直接輸入此部虛擬機器的記憶體空間大小和虛擬CPU數量。
    virt-manager3
  6. 第四個步驟將設定虛擬磁碟的大小,預設上會將qcow2格式的虛擬磁碟並以精簡配置(Thin Provisioning )的方式新增至/var/lib/libvirt/images/目錄下。
    virt-manager4
  7. 最後,輸入適當的虛擬機器名稱,若有需要進一步設定則可勾選「在安裝前自訂組態」這個選項以便待會可以更進一步調整設定組態,其次,您也可以於進階選下看到目前預設採用的網路組態為 「'Default':NAT」的網路模式以及其虛擬網卡之卡號。
    vir-manager5
  8. 由於上一個步驟有勾選「在安裝前自訂組態」,因此接下來會自動出現另一個虛擬機器自訂組態的視窗,您可以依據需求自行更改裝置的各項組態(例如處理器、記憶體、磁碟機....等),下圖作者變更了磁碟機匯流類型為SATA,最後,請按一下左上角的「開始安裝」按紐後即會自動啟動virt-viewer程式的虛擬機器視窗,一旦看到開始安裝的畫面就可進行安裝。
    startinstall

一旦建立了KVM虛擬機器後,每部虛擬機的組態會以XML格式存放於/etc/libvirt/qemu/目錄下,因此日後可利用圖形工具virt-manager或命令工具virsh來變更虛擬機器的組態檔設定,例如您可能需要新增某部虛擬機器的CPU或記憶體資源,則可利用virsh edit 指令:
virshedit
另一方面,使用virt-manager圖形介面工具亦可以變更虛擬機器的詳細資料應是另一種較友善的做法。

參. KVM相關功能組態設定

上述的章節逐步的說明了如何安裝Linux kvm虛擬化相關套件並建立虛擬機器,本章節將更進一步說明kvm虛擬化的相關功能的組態設定,內容包括:
  • 使用KVM準虛化驅動 – virtio
  • 新增KVM橋接 (Bridge)網路
  • 新增內部虛擬網路
  • 變更虛擬網路組態
  • 新增 iSCSI儲存集區 (iSCSI Storage Pool)
  • 建立虛擬機器快照 (Snapshot)
  • 轉換完整配置(Thick Provisioning)磁碟至精簡配置(Thin Provisioning)磁碟
一. KVM 準虛擬化驅動 – virtio 
KVM是必需使用硬件協助虛擬化技術(如Intel VT-x、AMD-V)的hypervisor,因此在CPU硬體支援下其CPU運算能力具有較高的效能;其次,若有Intel 延伸分頁表格 (Extended Page Tables;EPT)特性支援的平台上,記憶體存取的效率相對上亦較高,再者,雖然QEMU/KVM提供了全虛擬化執行環境,可以讓客體系統無需經過任何修改就能順利運行在KVM環境中, 不過,KVM在傳統的輸入輸出(I/O)虛擬化方面則是採用QEMU純軟體的方式來模擬I/O設備 (例如模擬網路卡、磁碟、顯示卡等),其所呈現的效率並不高,所以為了解決這項I/O效能不佳的問題, 在KVM中,可以在客體系統中採用準虛擬化驅動程式(Paravirtualized Drivers,PV Drivers)來提升客體機器的I/O性能,而virtio這個Linux上的設備驅動標準框架正是用以實現KVM準虛擬化的驅動技術。
總之,管理員基於效能上的考量可進一步採用KVM準虛擬化 (para-visualized)的驅動程式技術,而目前此一部份包括了網路、區塊、汽球等驅動程式,近年來,由於新版的Linux發行版本(如RHEL 6.3、Fedora 17等)預設上均已將virtio相關驅動器編譯為模組,因而虛擬機器上的客體系大多可直接使用virtio,而主流的Windows系統亦有對應的virtio驅動程式可供下載使用, 底下將示範如何在一部Windows虛擬機器中安裝磁碟與網路介面的virtio驅動程式以實現準虛擬化驅動技術。
  1. 首先,您需要下載 Redhat 的 Windows 版本的Virtio 週邊裝置驅動程式 (https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso)
  2. 接下來,請在虛擬機器關機狀況下,啟用虛擬機器「詳細資料」或「細節」設定頁。
  3. 為了新增 virtio磁碟驅動程式,您需要先新增一個 virtio 匯流排類型的硬碟,此硬碟只是暫時用來安裝virtio磁碟驅動程式,一旦安裝完成後即可刪除,所以並無需給太大空間,如下圖:
    addvirtiostorage
  4. 為了使用 virtio的網路介面,所以請於現有虛擬網路介面設定頁中的「Device Model」列示盒中,變更選取為「virtio」並按下「套用」,如下圖所示:
    net_virtio1
  5. 一旦新增了virtio磁碟並且變更了虛擬網卡為virtio裝置模式後,接下來請在IDE CDROM裝置設定頁中選取上面步驟所下載的virtio驅動程式ISO檔,最後再重新開啟虛擬機器並以管理員身份登入虛擬機器。
    virto_cdselect
  6. 待重新登入Windows虛擬機器後,請啟動「裝置管理員」(devmgmt.msc),在作者的Windows 10系統中可以看到如下圖所示的四個無法辨識的其它裝置,因此接下來將分別為這四個無法辨識的其它裝置安裝virtio驅動程式。
    devicemanager1
  7. 接下來,吾人先更新SCSI控制器的驅動程式,如下圖所示,完成安裝後可知這是一個Red Hat VirtIO SCSI控制器裝置。
     kvm_virio_scsi
  8. 接著更新Ethernet控制卡裝置驅動程式,更新完成後,如預期的可知這是VirtIO Ethernet Adapter。
    updateethernet
  9. 最後,再由virtio光碟中依序更新PCI裝置和PCI簡單通訊控制器驅動程式, 更新完成後顯示為「VirtIO Balloon Driver」和「VirtIP Serial Driver」。
    update2devices
  10. 完成了四個VirtIO裝置驅動程式安裝後,最後的「裝置管理員」已看不到無法辨識的「其它裝置」。
    virto_final 
二. 新增KVM橋接 (Bridge)網路
kvm 預設安裝時,自動建立了一個名稱為 "virbr0" (Virtual Bridge 0)橋接介面用來做為網路位址轉譯(NAT)之用途,不過若您的要虛擬機器規劃做為伺服器用途,則採用直接橋接至實體網路介面的方式應該是較為適當,如下圖所示的KVM橋接網路架構,讓虛擬機器直接可使用實體網段的IP位址與外界連線。
bridgenet
底下將示範如何新增KVM的橋接網路以達成直接連外的目的。
在Linux上建立橋接網路的方法大抵上有三種:
  1. 直接新增並編輯網路介面組態檔案
  2. 利用brctl命令
  3. 使用圖形介面工具--nm-connection-editor或virt-manager
對於新手或系統不夠熟悉的使用者而言,採用圖形介面工具自然是較為友善又容易的方式,不過目前以圖形介面新增橋接介面的工具似乎均有某部份功能於設定上存在錯誤而造成異常,不過只要設定時避開這些功能設即可,相信後續的版本應該會逐漸更正這些錯誤,底下逐步說明圖形介面工具virt-manager新增橋接器的步驟:
  1. 執行 virt-manager後,按一下『編輯↘連線細節』選項或由 "localhost(QEMU) "右鍵功能表按一下『詳細資訊』。
     addbridge1
  2. 於出現的連線細節視窗中,按一下『Network Interfaces』標籤。
  3. 接下來請按下左下角的加號 "+" 按鈕以新增介面。
    addbridge2
  4. 『設定網路介面』設定頁中選取 "橋接" 介面(預設),再按一下『前進』。
    addbridge3
  5. 『設定網路介面』視窗中,請先將『啟動模式』設定為 「onboot」 ,不要勾選『立即啟動』,然後再由底下橋接的介面中選擇要使用的實體介面,最後再決定IP組態設定方式,您有三種選擇:
    (1) 直接拷貝自橋接的實體介面組態
    (2) 由DHCP動態自動取得IP組態
    (3) 靜態手動設定
    addbridge5

    addbridge6 IP組態設定完成後請按下『確定』按紐,畫面可能會出現一個覆蓋警告訊息,按下『是』按紐後,完成新增橋接介面設定,此時程式會在/etc/sysconfig/network-scripts目錄下新增一個名稱為「ifcfg-橋接介面名稱」 的橋接介面。
    addbridge7

    最後請關閉視窗,結束設定。
  6. 不過利用上述方式設定橋接介面的IP組態時,最後所新增的橋接介面組態值並不完整,如果是直接拷貝方式則只會拷貝原來IP並不會新增預設閘道與DNS伺服器,若是手動靜態設定則是會少了DNS伺服器,因此除非您決定於網路上採用DHCP來動態指定IP位址,否則您還需要手動編輯橋接介面組態檔 (/etc/sysconfig/network-scripts/ifcfg-br1) 。
    由於在此採用拷貝自原介面的IP組態方式,所以吾人需編輯撟接介面組態檔並新增了GATEWAY與DNS1二行,如下圖所示。
    addbridge8
  7. 最後,為了讓新增的橋接介面確實生效,建議重新開機。
  8. 一旦重新開機後,您將可以設定虛擬機器使用這個橋接網路。
KVM還可以支援一種新而簡單的虛擬化橋接網路驅動器--MacVTap,它結合了Macvlan 驅動器和 Tap 裝置,讓您的虛擬機器與實體機器位於相同網段並可溝通,使用相同的DHCP伺服器,MacVTap支援了四種模式 (VEPA、Bridge、Private、Passthrough),但由於預設上MacVTap此法的虛擬主機與虛擬機器並無法互通,因此在此並沒有採用,下圖為利用virt-manager設定使用MacVTap橋接方式來讓虛擬機器直接使用實體機器相同的網段。
macvtap
三. 新增KVM內部隔離的網路
除了NAT與橋接二種網路模式可以順利的讓虛擬機器與外界連接之外,另一種不同的使用情境為只允許虛擬機器彼此之間溝通,虛擬機器並無法與KVM主機之外的機器溝通,此種情境需求大多應用於開發或測試用途之環境,因此此時您需要新增另一種如下圖所示的隔離內部網路模式。
isolatenet
新增隔離內部網路的作法不止一種,底下以virt-manager圖形介面新增隔離網路步驟如下:
  1. 啟動 virt-manager。
  2. 先按一下『Virtual Networks』標籤設定頁,然後再按一下左下方的 「+按鈕以建立新的虛擬網路。
    internalnet1
  3. 接下來的設定頁輸入虛擬網路名稱,
    internalnet2
  4. 設定內部網路所使用的IP網段,以及是否啟用DHCP服務並且設定配置IP位址的範圍。
    internalnet3
  5. 下一決定是否啟用IPv6位址空間,在本例中除並不啟用IPv6。
    internalnet4
  6. 最後將設定實體網路連接方式,在此由於是規劃為內部使用網路而不與外界連線,因此勾選『隔離的虛擬網路』並輸入一個網域名稱。
    internalnet5 
  7. 一旦完成後,您將會看到新增了一個名稱為 virbr1的網路介面,其IP位址為192.168.100.1。
  8. 日後管理員新增虛擬機器時就可以選擇這個內部虛擬網路—internal。
    internalnet6
    另一方面,現存的虛擬機器也可以重新設定虛擬網路介面為內部網路。
    internalnet7
根據上述的設計與實作,目前的KVM虛擬機器已可以依據需求來設定三種不同的網路模式--NAT模式、橋接網路和內部網路模式。因此您的介面設計如下:
最後,以作者的KVM伺服器為例,已安裝並啟動二部虛擬器之後,以ipconfig檢視整個網路介面組態顯示如下:
kvm_fullnetwork
另一方面以 brctl show命令亦可顯示目前的虛擬網路設計以及各自有一部已使用的虛擬機器的虛擬介面。
brctl_show
四. 變更虛擬網路組態
日後管理員若需要變更虛擬網路的組態設定,則需要藉助於virsh命令,底下示範如何變更NAT虛擬網路或內部虛擬網路的DHCP組態。
  1. 首先,利用 virsh net-list 檢視目前所有的虛擬網路。由下圖可知目前存在二個虛擬網路,一個為預設的NAT虛擬網路(default),另一個為前面步驟所建立的內部網路(Internal)。
    virshcmd1
  2. 接下來,打算變更內部虛擬網路的DHCP組態設定,因此下達virsh net-edit命令以利用預設編輯器來重新編輯網路組態。
    virshcmd2
  3. 下圖為預設編輯器vi內的原始虛擬網路組態內容,您可以看到有此虛擬介面的名稱,網卡卡號、IP位址以及由其可配置的DHCP IP位址範圍。
    virshcmd3
  4. 在此直接以預設編輯器修改內容,此例中變更了DHCP IP範圍,並保留一部特定虛擬機器租用的IP位址,因此編輯更改後的內容如下圖所示,最後再予以儲存並離開編輯器。
    virshcmd4
  5. 最後為了讓上述所變更的虛擬網路組態生效,您必需重新啟動內部虛擬網路。
    virshcmd5 

五. 新增iSCSI儲存集區 (iSCSI Storage Pool)

iSCSI將傳統的 SCSI命令協定執行於TCP/IP之上,因此實現了IP SAN,iSCSI具有彈性高、互通性佳和高擴充性等優點,而且比起昂貴的FC SAN,更具有成本上的優勢,另一方面,為了支援伺服器虛擬化下的各種高度可用性能力,例如建置叢集技術的共用儲存區或不中斷遷移性的存放功能,因此使用iSCSI網路儲存機制就經常成為首選。

KVM可以支援iSCSI儲存集區,底下說明如何利用virt-manager 工具新增一個虛擬機器所使用的iSCSI網路儲存集區。

首先您需要在網路上設定好軟體或硬體的iSCSI目標,並記住其IP與IQN。

  1. 執行『虛擬機器管理員 』(virt-manager) 工具。
  2. 選取任何一部主機後,由『編輯』功能表下選取『連線細節』選項。
    vm-condetail
  3. 按一下『儲存裝置』標籤,然後再按一下左下角的『+』按鈕。
    vm-addstorage
  4. 接下來於出現的『建立儲存裝置集區』視窗中輸入裝置名稱並選取『iscsi:iSCSI目標』這個類型。
    vm-iscitype
  5. 後續的設定視窗,請正確的輸入您的iSCSI 目標伺服器的IP位址和目標的IQN後,目標路徑保留預設值即可,最後再按『完成』按鈕。
    vm-iscsiiqn
  6. 日後建立虛擬機器時,即可在精靈程式的第四個步驟以瀏覽的方式選取前述步驟所新增的iSCSI儲存集區來做為建立虛擬磁碟檔案的位置。
    vm-selstorage

五. 建立KVM虛擬機器快照
虛擬機器快照(Snapshot)用以保留與維護虛擬機器在某一個時間點時的狀態 (磁碟、記憶體或設定組態),因此管理員可替虛擬機器建立多個快照做為還原點,並在必要時將虛擬機器回復到指定的還原點狀態。
KVM /Qemu 提供了二種快照類型--內部快照(Internal snapshot)與外部快照(External snapshot):

  1. 內部快照:內部快照乃是利用單一qcow2磁碟檔案維護所有快照資訊,亦即內部快照會停止目前虛擬機器的狀能態並且將快照寫入原來的虛擬磁碟的映像檔,此種內部快照因為只有單一檔案因此易於在機器間拷貝或搬移,不過想要使用內部快照需要原始的虛擬磁碟採用qcow2格式,若使用RAW格式時需先加以轉換才行,此外,執行內部快照時虛擬機器可能會停頓一段短暫時間。
    libvirt 可完整支援內部快照,因此libvirt相關工具可以用以建立、刪除與還原內部快照,內部快照亦為預設的快照類型。
  2. 外部快照:每次執行快照時,目前的磁碟檔就會成為一唯讀的儲存狀態之備份檔,然後再建立一個新的qcow2檔案,日後的變動則會寫入到此新產生的檔案。外部快照可支援任何類型的原始磁碟映像格式,不限於qcow2格式,而且執行時幾乎是瞬間完成,虛擬機器較不會有停頓現象,適合用於執行即時線上備份。不過目前的libvirt工具似乎均未完整支援此種類型的快照。
您可以利用virsh命令建立內部與外部快照,另一方面,使用virt-anager圖形介面工具也可以快速的新增內部快照,步驟如下:
  1. 首先,啟動 virt-manager工具。
  2. 開啟打算建立快照的虛擬機器,並進入管理快照設定視窗。
    kvmsnapshot1
  3. 於快照設定視窗中,按一下下方的「+」號按鈕。
    kvmsnapshot2
  4. 接下來的「Create snapshot」設定頁中,輸入快照名稱和描述後,再按「完成」後即會開始建立此快照。
    kvmsnapshot3 

    2015-11-20_153913
  5. 等待少許時間後,就會成功建立可還原的快照,下圖中可看出此部虛擬機器已經建立了三次內部快照。
  6. 日後,您可以由快照右鍵功能表選取還原快照或刪除快照。
    kvmsnapshot4 
另一方面,您也可以利用命令介面 virsh snapshot-create-as來新增一個啟用中的內部快照,如下圖例針對正在啟動執行中的 windows10虛擬機器新增了一個名稱為snap1的內部快照。
kvmsnapshot5
若您需要建立外部快照,目前版本的libvirt並沒有完整的加以支援,而圖形介面的 virt-manager工具亦不支援,您需要於虛擬機器離線時使用virsh snapshot-create-as命令加上--disk-only選項,例如下圖針對wins10這部已關機的虛擬機器建立了名稱為snap-1的外部快照,
kvmsnapshot6
日後若要移除此外部快照可以利用 virsh snapshot-delete 加以  --metadata 選項來移除外部快照,如下圖所示:
kvmsnapshot7

肆. 轉換完整配置(Thick Provisioning)磁碟至精簡配置(Thin Provisioning)磁碟

由於採用的工具、版本與來源的不同,有時所建立虛擬磁碟可能會採用完整配置,其雖有較快的好處,但也讓儲存空間的使用較不具彈性,使用libguestfs-tools套件的virt-sparsify命令可將完整配置虛擬磁碟檔轉換為精簡配置虛擬磁碟檔:

  1. 安裝libguestfs-tools套件
    yum –y install libguestfs-tools
  2. 進入KVM映像檔預設目錄
    cd /var/lib/libvirt/images
  3. 執行virt-sparsify命令,完成後可檢視二個檔案大小與差距
    virt-sparsify -q wins10.qcow2 wins10.qcow22
    ls -l
  4. 由新檔案取代舊檔
    mv -f wins10.qcow22 wins10.qcow2
  5. 重新啟動虛擬機器
    virsh start wins10


伍. 結語

伺服器虛擬化已是現代資訊環境下的必然趨勢,而VMWare vsphere、Hyper-V、XenServer等商業付費的型一Hypervisor虛擬化軟體也已廣泛為業界採用,反倒是免費內建於Linux核心的KVM技術由於起步較相對慢而較少受到業界矚目與青睞,本文探討了如何在CentOS Linux 系統中透過內建核心的KVM來提供機器虛擬化功能,建立與管理虛擬機器,希望日漸成熟的Linux KVM虛擬化功能及穩定性也可以成為企業組織另一項不錯免費的虛擬化選項。
讀者回響 (aohongchen@yahoo.com)