1. 程式人生 > ><Mastering KVM Virtualization>:第三章 搭建獨立的KVM虛擬化

<Mastering KVM Virtualization>:第三章 搭建獨立的KVM虛擬化

sca tin ann 修改 網絡命令 sta 解析 知識 tlb

在第二章,你了解了KVM的內部結構;在本章中,您將了解如何將Linux服務器設置為虛擬化主機。我們正在討論將KVM用於虛擬化並將libvirt作為虛擬化管理引擎。

KVM開啟了虛擬化並利用你的服務器或工作站來運行虛擬機。從技術術語來說,KVM是一組針對具備虛擬化擴展的x86架構硬件的內核模塊;被加載後,它可以將Linux服務器轉化為虛擬化hypervisor。可加載模塊包括kvm.ko,它提供了核心虛擬化功能,以及一個處理器相關的模塊,如kvm-intel.ko或者kvm-amd.ko。

NOTE:根據https://en.wikipedia.org/wiki/Hypervisor。hypervisor/VMM是一種計算機軟件、固件或硬件,用來來創建和運行虛擬機。

要啟動虛擬機,僅僅加載KVM模塊還不夠。您需要emulator來模擬虛擬機的外圍硬件設備。下面是介紹QEMU的時間。

QEMU是一個開源機器仿真軟件。這個模擬器將幫助您在一個架構上運行為另一種架構設計的的操作系統。例如,QEMU 可以在x86平臺上運行為ARM平臺設計的操作系統。然而,這裏有一個問題。由於QEMU使用二進制轉譯(一種用於在主機上執行虛擬機指令的技術),因此VM運行會比較緩慢。

如果QEMU運行緩慢,那它如何能以接近物理機的速度運行基於KVM的虛擬機呢?KVM開發人員考慮到了這個問題,並修改了QEMU作為解決方案。這個修改後的QEMU被稱為QEMU-KVM,它可以直接與KVM模塊交互,並在不使用動態轉譯的情況下,直接在CPU上執行指令。簡而言之,我們使用qemu-kvm來運行基於KVM的虛擬機。

是不是越聽越迷糊了?如果qemu-kvm可以運行虛擬機,那麽為什麽還需要libvirt。答案很簡單,libvirt管理qemu-kvm,qemu-kvm運行KVM虛擬機

NOTE:qemu-kvm已經啟用,現在所有的代碼都已經與qemu-system-x86_64合並了。為了便於理解,我們還是使用qemu-kvm。一些Linux發行版仍然帶有qemu-kvm。

閑話少說,讓我們看看這一章將討論什麽話題:

  • 介紹libvirt
  • libvirt管理工具
  • 硬件組裝建議

熟悉libvirt

libvirt是一組位於最終用戶和hypervisor之間的API。hypervisor可以基於任何libvirt支持的虛擬化技術構建。截至此文成稿時,libvirt支持下列hypervisor:

  • The KVM/QEMU Linux hypervisor
  • The Xen hypervisor on Linux and Solaris hosts
  • The LXC Linux container system
  • The OpenVZ Linux container system
  • The User Mode Linux paravirtualized kernel
  • The VirtualBox hypervisor
  • The VMware ESX and GSX hypervisors
  • The VMware Workstation and Player hypervisors
  • The Microsoft Hyper-V hypervisor
  • The IBM PowerVM hypervisor
  • The Parallels hypervisor
  • The Bhyve hypervisor

libvirt是一個透明層,它接受用戶的命令,根據底層虛擬化技術修改它們,然後在hypervisor上執行它們。這意味著,如果您知道如何使用基於libvirt的管理工具,您就能夠管理前面提到的hypervisor,而不需要一一了解它們。您可以選擇任何虛擬化管理技術。他們都使用libvirt作為後端基礎設施管理層,盡管前端工具看起來不同;例如,oVirt、Red Hat企業虛擬化技術(RHEV)、OpenStack、Eucalyptus等。這本書是關於KVM libvirt及其工具的。

在下面的圖中,我們將總結這些所有的東西是如何連接的:

技術分享

Libvirt將負責存儲、網絡和虛擬硬件需求,以啟動虛擬機和VM生命周期管理。

這裏演示了使用libvirt啟動VM是多麽容易。在這裏,我們使用virsh啟動一個名為TestVM的VM。

# virsh start TestVM

NOTE:virsh是與libvirt服務交互的CLI命令行,而virt-manager是它的GUI前端。稍後,您將在本書中了解更多有關這些工具的知識。

在後端,你可以看到libvirt搭配一系列參數初始化qemu進程:

# qemu-system-x86_64 -machine accel=kvm -name TestVM -S -machine pc-i440fx-1.6,accel=kvm,usb=off -m 4000 -realtime mlock=off -smp 2,sockets=2,cores=1,threads=1 -uuid 39ac4786-1eca-1092-034c-edb6f93d291c -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/TestVM.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/dev/vms/TestVM,if=none,id=drive-virtio-disk0,format=raw,cache=none,aio=native -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2 -netdev tap,fd=27,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:a5:cd:61,bus=pci.0,addr=0x3,bootindex=1 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device usb-tablet,id=input0 -vnc 127.0.0.1:2 -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5

NOTE:在介紹libvirt的同時,我們有意避免提到libvirt的很多特性。這樣做是為了使概念更加清晰,並將重點放在libvirt的關鍵功能上。當你學完這些章節,你將完全掌握這些功能特性。

現在,您已經熟悉了使用基於KVM的虛擬化所需的關鍵內容。在我們學習如何搭建環境之前,我們應該先了解一下系統需求。

Host系統需求

虛擬機需要分配一定數量的CPU、內存和存儲。這意味著您計劃在該主機上運行的虛擬機的數量決定了KVM hypervisor的硬件需求。

讓我們從最低需求開始,在KVM上啟動兩個簡單的虛擬機,每臺756 MB內存:

  • Intel或AMD 64-bit CPU,擁有虛擬化擴展(Intel VT-x或者AMD-v)
  • 2GB 內存
  • 安裝Linux系統後,在KVM hypervisor上有8 GB的空閑磁盤空間
  • 100 Mbps網絡連接

NOTE:我們使用Fedora 21演示書中的例子。盡管如此,你也可以使用其他支持KVM和libvirt的Linux發行版(Ubuntu,Debian,CentOS或其他)。我們假設您已經安裝了Fedora 21或Linux發行版,完成了包括網絡在內的所有設置。

確定適合您環境的系統需求

這是一個非常重要的階段,我們需要把它做好。擁有正確的系統配置是虛擬機獲得近似原生性能的關鍵。讓我們從CPU開始。

1. 物理CPU

Intel或AMD 64-bit CPU,擁有虛擬化擴展(Intel VT-x或者AMD-v)。

為了確定您的CPU是否支持虛擬化擴展,您可以檢查以下標誌:

# grep --color -Ew svm|vmx|lm /proc/cpuinfo
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm ida dtherm tpr_shadow vnmi flexpriority ept vpid

svm標誌意味著CPU支持AMD-v,vmx標誌意味著CPU支持VT-x,lm意味著CPU支持64位。

如果您的CPU支持虛擬化擴展,那麽您的系統可能已經準備好承載KVM虛擬機了。您還會註意到,無需額外的配置,對應的KVM模塊就自動加載。為了驗證模塊是否已加載,可以使用以下命令:

# lsmod | grep kvm
kvm_intel           148081  9
kvm                 461126  1 kvm_intel

如果系統是AMD,你會看到kvm_amd而不是kvm_intel。

如果您沒有看到前面的CPU標誌,或者所有KVM模塊都沒有加載,但是您確定系統支持虛擬化擴展,可以嘗試以下排障步驟:

  1. 重新系統並進入BIOS。
  2. 進入CPU高級選項。啟用Intel Virtualization Technology或Virtualization Extensions。對於AMD來說,應該是默認啟用的。確切的描述可能會根據您的BIOS不同而有所不同。
  3. 重啟主機。
  4. 您現在應該看到加載的KVM模塊。如果您仍然沒有看到它們的加載,那麽嘗試手動加載它們。# modprobe kvm kvm_intel or modprobe kvm kvm_amd
  5. 如果您能夠手動加載它們,但它們仍然不能正常工作,那麽應該聯系您的硬件供應商,或者仔細檢查Intel或AMD各自產品頁面的處理器細節。

除了虛擬化擴展之外,您可能還需要在BIOS中啟用Intel VT-d或AMD IOMMU(AMD-Vi)。這是將PCI設備直接分配給虛擬機所需要的,例如,將物理網絡接口卡(NIC)從hypervisor分配給虛擬機;我們將在接下來的章節中詳細介紹這些內容。

2. CPU CORES

如果你計劃運行服務器級別的虛擬機,那麽推薦一個core對應一個vCPU。在計算core數時,不要在Intel CPU上計算 超線程core,而是只計算實際core。當然,你可以超過實際core數超量分配vCPU,但這會導致性能損失。

如果您計劃運行桌面級的虛擬機或非CPU密集型的虛擬機,那麽您可以放心地超量分配使用CPU,因為性能要求退居二線,每hypervisor虛擬機運行密度這一指標的優先級高於性能。

NOTE:超量分配的意思是,分配超過實際物理資源的虛擬資源。

單個hypervisor可以運行多少個VM並沒有明確的定義。這完全取決於VM的工作負載類型以及您能夠承受多少程度性能下降。如果所有的VM都運行CPU密集型任務,那麽vCPU的超分配就不是個好主意。

TIP:使用lcpu命令查看CPU拓撲。

3. 物理內存

您可以使用一個簡單的經驗法則來決定物理節點需要多少內存:將計劃分配給虛擬機的所有內存加相加,並為hypervisor本身添加額外2GB RAM。

如果您計劃運行內存密集型工作負載,那麽這就是預期的配置。

與CPU相似,KVM也支持內存的超分配。這意味著您可以冒著內存耗盡的風險,分配更多的內存給VM,而非hypervisor實際擁有的內存。通常這種類型的分配方式適合桌面級別虛擬機或測試虛擬機。

您可以使用以下公式來計算可供VM使用的RAM總量(單位GB):

  • 對於擁有64 GB內存的系統:RAM - 2 GB = 可供VM使用的內存總量
  • 對於超過64 GB內存的系統:RAM - (2 GiB + 0.5 *(RAM/64))= 可供VM使用的內存總量

在強制2GB的基礎上,每64GB我們多分配500 MiB內存給hypervisor。使用這個公式可以粗略地了解有多少內存可供虛擬機使用。在某些工作負載中,您可能不需要超過5 GB的RAM用於hypervisor,即使我們的公式表明,在擁有1TB內存的系統上您可能需要保留10 GB內存給hypervisor。

4. 存儲

在考慮hypervisor的存儲空間時,您需要考慮OS安裝、SWAP空間和虛擬機磁盤使用所需的空間。

推薦的SWAP空間大小是多少?

確定交換空間大小的理想數值有點復雜。如果您不打算執行任何內存超分策略,那麽您可以使用下面oVirt Node的配置建議,它是一個專門用於運行VM的KVM hypervisor:

  • 4GB或者更少,分配2GB SWAP空間
  • 4GB到16GB內存,分配4GB SWAP空間
  • 16GB到64GB內存,分配8GB SWAP空間
  • 64GB到256GB內存,分配16GB SWAP空間

如果您計劃執行內存超分策略,則需要添加額外的交換空間。如果超分比率0.5(即比可用物理RAM多50%),那麽您需要使用以下公式來確定交換空間大小:

(RAM x 0.5) + SWAP for OS = SWAP space required for overcommitting

舉例,如果你的系統有32 GB內存,你打算實行0.5的超分比例,則需要的交換空間是(32 * 0.5)+ 8 = 24 GB。

虛擬磁盤可以以文件的方式存儲在本地文件系統(ext3,ext4,xfs等)或者共享文件系統(NFS,GlusterFS等)中。虛擬磁盤也可以通過塊設備創建,例如LVM、本地磁盤分區、iSCSI磁盤、FC、FCoE等等。簡而言之,您可以將hypervisor看到的任何塊設備附加到VM上。正如您所猜測的,(虛擬磁盤)空間是由VM需要多少磁盤空間,或者是安裝在上面的應用程序決定的。在存儲中,你也可以像CPU和內存一樣進行超量分配,但是對I/O負載較重的VM並不推薦。超分的虛擬磁盤稱為瘦置備磁盤。

關於CPU、內存和存儲超分的進一步說明,將在後面的章節中給出,這些章節涵蓋了虛擬機性能調優的相關內容。

5. 網絡

建議使用至少1 GBps帶寬的網卡來保證平滑的網絡操作,但這完全取決於你如何配置虛擬網絡基礎設施,和網絡需求根據不同的場景如何變化。

建議使用Linux bonding技術將多個網絡接口匯聚成一個通道,並基於它來構建VM網絡基礎設施。它將有助於增加帶寬和提供冗余。

NOTE:bonding mode有好多種,但是並不都是支持用來構建虛擬網絡基礎設施。支持的bonding模式有Mode 1 (active-backup),Mode 2 (balance-xor),Mode 4 (802.3ad/LACP)和Mode 5 (balance-tlb);其余的bonding模式都不被支持。Mode 1和Mode 4最推薦和穩定的。

環境搭建

本節將指導你完成安裝虛擬化軟件包的整個過程,從啟動libvirt服務開始,並驗證系統已經準備好使用KVM虛擬化技術來運行虛擬機。

NOTE:我們假設您有一個Fedora 21系統,它具備圖形用戶界面和Internet連接可以訪問默認的Fedora yum源,並通過它可以下載所需的KVM虛擬化軟件包。我們還假設在你服務器的BIOS中已經啟用了虛擬化技術(VT)功能。

要驗證您的系統是否啟用了默認的yum源,可以使用yum repolist命令。該命令列出了系統中已定義的yum源:

技術分享

在輸出中尋找一個名為Fedora/21/x86-64的repo源。通過這個源你可以訪問所有KVM虛擬化的軟件包。

1. 安裝虛擬化軟件包

這是將Fedora 21服務器或工作站系統轉換為虛擬化主機的第一步。你只需以root權限執行 yum install <packages> 命令,<packages> 是空格分割的軟件包包名的列表。

在Fedora 21系統上搭建虛擬化環境所需的最基本的包是libvirt、qemu-kvm和virt-manager。所以你需要執行以下命令:

# yum install qemu-kvm libvirt virt-install virt-manager virt-install -y

有很多依賴包會隨著上述三個包一起安裝,但是你不需要知道或者記住它們,yum 命令會自動檢查依賴並為你安裝這些軟件包。

yum groupinstall命令 也可以用於安裝必須和可選的軟件包,用以搭建KVM虛擬化環境:

# yum groupinstall "virtualization" -y

它除了安裝核心的libvirt和qemu-kvm軟件包以外,還會安裝guestfs-browser, libguestfs-tools, python-libguestfs, virt-top,以下是yum groupinfo "virtualization" 的輸出,供您參考:

#yum groupinfo "virtualization"
Group: Virtualization
 Group-Id: virtualization
 Description: These packages provide a virtualization environment.
 Mandatory Packages:
   +virt-install
 Default Packages:
  libvirt-daemon-config-network
  libvirt-daemon-kvm
  qemu-kvm
   +virt-manager
   +virt-viewer
 Optional Packages:
   guestfs-browser
   libguestfs-tools
   python-libguestfs
   virt-top

目前,我們建議你使用yum安裝命令安裝核心軟件包,以避免任何混淆。後面的章節中,會通過示例和安裝步驟完整地解釋KVM虛擬化的可選實用程序。

2. 啟動libvirt服務

安裝KVM虛擬化軟件包之後,首先要做的是啟動libvirt服務。當你啟動libvirt服務時,它會對外發布一個應用程序接口(API)與qemu-kvm應用程序進行交互。virsh和virt-manager等客戶端使用這個API與qemu-kvm進行通信,完成虛擬機生命周期的管理。要啟用和啟動服務,請運行以下命令:

# systemctl enable libvirtd && systemctl start libvirtd

TIP:使用 libvirtd --version 命令查詢libvirt版本。

3. 驗證和了解你系統的virt功能

在創建虛擬機之前,了解什麽是virt功能,驗證系統並確保它滿足KVM虛擬化主機的所有先決條件是非常重要的。

了解這些信息將幫助您規劃虛擬機的數量和系統上可以承載的配置。有兩個重要的命令可以幫助驗證KVM的系統配置。讓我們從virt-host-validate開始:

  • virt-host-validate:以root用戶執行此命令,將執行對KVM功能的完整性檢查,以驗證虛擬化主機是否配置恰當。例如:TestSys1主機安裝有KVM虛擬化所有必需的軟件包,但缺乏硬件虛擬化支持。在這種情況下,它將輸出以下內容:
root@TestSys1 ~]#virt-host-validate
QEMU: Checking for hardware virtualization                : WARN (Only emulated CPUs are available, performance will be significantly limited)
QEMU: Checking for device /dev/vhost-net                  : PASS
QEMU: Checking for device /dev/net/tun                    : PASS
LXC: Checking for Linux >= 2.6.26                         : PASS
  • 這個輸出清楚地顯示,系統沒有啟用硬件虛擬化,只支持“qemu”模式,它與qemu-kvm相比運行非常慢。

硬件虛擬化支持(hardware virtualization support)幫助KVM(qemu-kvm)虛擬機直接訪問物理CPU,幫助它達到近似原生的性能。硬件支持不存在於單獨的qemu中。

現在讓我們看看,驗證KVM虛擬化系統時,virt-host-validate命令還檢查了其他哪些參數:

  • /dev/kvm:KVM驅動在主機上創建了一個/dev/kvm字符設備,幫助虛擬機直接訪問硬件。沒有這個設備意味著VM無法訪問物理硬件,哪怕它在BIOS中已經啟用,這將大大降低VM的性能。
  • /dev/vhost-net:vhost-net驅動在主機上創建了一個/dev/vhost-net字符設備。這個字符設備是配置vhost-net實例的接口。沒有這個設備會大大降低虛擬機的網絡性能。
  • /dev/net/tun:這是另一個用來創建tun/tap設備,促進虛擬機網絡聯通性的字符設備。tun/tap設備的詳細內容將在後面的章節說明。就目前而言,你只需理解,擁有一個字符設備對於KVM虛擬化的正常工作非常重要。

在系統上創建虛擬機之前,應始終確保已經通過所有virt-host-validate的完整性檢查。驗證完畢所有參數後,您將在系統上看到以下輸出:

[[email protected] ~]# virt-host-validate
  QEMU: Checking for hardware virtualization                   : PASS
  QEMU: Checking for device /dev/kvm                           : PASS
  QEMU: Checking for device /dev/vhost-net                     : PASS
  QEMU: Checking for device /dev/net/tun                       : PASS
   LXC: Checking for Linux >= 2.6.26                           : PASS
[[email protected] ~]#

第二個命令是virsh。virsh(virtualization shell)是一個命令行接口,用於管理Linux系統上的VM和hypervisor。它使用libvirt管理API,可以作為圖形化工具virt-manager和Web化工具kimchi-project的替代選擇。virsh命令是分類隔離的,以下是一些重要的virsh命令分類:

  • Guest管理命令(start,stop)
  • Guest監控命令(memstat,cpustat)
  • Host和hypervisor命令(capabilities,nodeinfo
  • 虛擬網絡命令(net-list,net-define)
  • 存儲管理命令(pool-list,pool-define)
  • 快照命令(create-snapshot-as)

TIP:我們建議你通過man手冊學習virsh命令,virsh是一個文檔非常完善的命令,可以通過 # man virsh 查看virsh命令的man手冊。

之所以要在本章中介紹virsh命令,是因為virsh可以顯示很多關於主機功能的信息,比如主機CPU拓撲、虛擬機可用內存等等。讓我們看一下virsh nodeinfo命令的輸出,它將提供物理節點的系統資源信息:

#virsh nodeinfo

CPU model:         x86_64
CPU(s):            4
CPU frequency:     2534 MHz
CPU socket(s):     1
Core(s) per socket:  2
Thread(s) per core:  2
NUMA cell(s):      1
Memory size:       7967796 KiB

NOTE:你必須以root權限運行virsh命令。

在virsh nodeinfo輸出中,您可以看到系統硬件架構、CPU拓撲、內存大小等。顯然,同樣的信息也可以使用標準的Linux命令來收集,但是您必須運行多個命令。你可以使用這些信息,在硬件資源方面判斷這是不是一臺合適的主機,可供你創建合適的虛擬機。

另一個重要的命令是 #virsh domcapabilities。該命令顯示了一個XML文檔,描述了主機qemu-kvm的能力和libvirt的版本。了解emulator的功能非常有用。它可以幫助你確定虛擬機可使用的虛擬磁盤的類型、可分配的vCPU的最大數量等等。

硬件配置舉例

讓我們來看看一些常見的硬件配置;virsh命令的domcapabilities選項會顯示主機的功能。您可以通過解析輸出,找到特定硬件配置的確切支持值,用於虛擬機的設置。以下是你可以在VM上設置的最大vCPU的值:

[[email protected] ~]# virsh domcapabilities  | grep -i max
  <vcpu max=255/>
[[email protected] ~]#

根據輸出,在這個主機上,可以為虛擬機配置最多255個vCPU:

[[email protected] ~]# virsh domcapabilities  | grep diskDevice -A 5
    <enum name=diskDevice>
      <value>disk</value>
      <value>cdrom</value>
      <value>floppy</value>
      <value>lun</value>
    </enum>
[[email protected] ~]#

根據輸出,這個主機上,可以為虛擬機配置disk,cdrom,floppy和lun類型的設備。

許多物理節點hypervisor的功能通過該命令輸出。檢視所有的功能選項超出本書的目標,因此,您可能想嘗試在你自己的環境中運行這個命令來查看它所輸出的報告。Alternatively, it might be good to link it to a definitive online resource。因此我們建議你在系統上運行該命令並學習其功能選項。

除了安裝libvirt和qemu-kvm軟件包,我們還在系統上安裝了virt-manager軟件包。如前所述,virt-manager是一個GUI工具,可以管理本地或者遠程的hypervisor。現在,在完成本章之前,我們將向您展示如何啟動virt-manager並將其連接到本地KVM hypervisor:

  1. 首先,確保libvirtd服務處於運行狀態,而且已經通過virt-host-validate命令的所有檢查項。
  2. 然後,導航到Menu -- System tools,點擊Virtual Machine Manager
  3. 點擊virt-manager以後,與本地hypervisor(qemu-kvm)連接的Virtual Machine Manager圖形工具將被打開,類似下圖:技術分享
  4. 假如不能查找並連接到本地hypervisor,點擊File菜單,打開Add Connection對話框,填寫連接信息:技術分享

前面的hypervisor一欄必須從下拉菜單中選擇QEMU/KVM,然後點擊Connect。就是這樣,它將通過libvirt將virt-manager連接到本地qemu-kvm hypervisor。如果你需要連接到遠程hypervisor,選中Connect to remote host並填寫詳細信息。

如果你的virt-manager成功地連接到本地KVM hypervisor,那麽你現在就可以創建虛擬機了。如果連接失敗,請檢查/user-home/.cache/virt-manager/virt-manager.log日誌文件。

概述

在本章中,我們連帶libvirt管理工具一起,學習了KVM虛擬化。我們還學習了與KVM和libvirt相關的各種工具,以及使您的系統平穩運行的硬件樣例配置。

在下一章中,你將通過示例了解更多關於virsh命令及其語法的知識。您還將學習如何使用virt-manager創建虛擬機。我們還將詳細解釋virt-manager和virsh命令,並舉例說明如何創建虛擬機。

<Mastering KVM Virtualization>:第三章 搭建獨立的KVM虛擬化