[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

請考慮參閱收錄於 https://developers.redhat.com/products/rhel/hello-world/#fndtn-kvm 的上游文檔

KVM 與 CentOS-6

CentOS 6 的基本發行版本已提供原生的 KVM 虛擬化支援和工具。Dell 提供了兩本關於在 CentOS 6 上運用 KVM 的白皮書:第一冊第二冊

請參閱以下中繼套件的內容:

# yum grouplist | grep -i virt 

1. 設置主機

安裝你可能需用的套件。

yum -y install @virt* dejavu-lgc-* xorg-x11-xauth tigervnc \
libguestfs-tools policycoreutils-python bridge-utils 

假若你利用 /var/lib/libvirt 以外的目錄存放 kvm 檔案,請設定 selinux 脈絡。在此範例中,我採用 /vm 存放碟盤映像檔。

semanage fcontext -a -t virt_image_t "/vm(/.*)?"; restorecon -R /vm 

容許在介面之間轉送封包。 Allow packet forwarding between interfaces.

sed -i 's/^\(net.ipv4.ip_forward =\).*/\1 1/' /etc/sysctl.conf; sysctl -p 

設定 libvirtd 服務自動啟動,然後重新開機。

chkconfig libvirtd on; shutdown -r now

你可選擇設置橋接,讓客端與主機在同一個實體網絡上擁有網絡卡。 在這個範例中,eth0 是支援橋接的裝置,而 br0 將會是新的裝置。

chkconfig network on
service network restart
yum -y erase NetworkManager
cp -p /etc/sysconfig/network-scripts/ifcfg-{eth0,br0}
sed -i -e'/HWADDR/d' -e'/UUID/d' -e's/eth0/br0/' -e's/Ethernet/Bridge/' \
/etc/sysconfig/network-scripts/ifcfg-br0
echo DELAY=0 >> /etc/sysconfig/network-scripts/ifcfg-br0
echo 'BOOTPROTO="none"' >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo BRIDGE=br0 >> /etc/sysconfig/network-scripts/ifcfg-eth0
service network restart
brctl show

主機現在已準備好建立 kvm 客端。

2. 設置客端

由於設置客端的選項眾多,較簡單的方法是將所需的資料收集在變數中,繼而透過一個指令建立客端。以下列出了數個選項,它們多數可按需要調整。

首先檢視可選用的操作系統。

virt-install --os-variant=list | more

選擇一個操作系統:

OS="--os-variant=freebsd8"
OS="--os-variant=win7"
OS="--os-variant=win7 --disk path=/var/lib/libvirt/iso/virtio-win.iso,device=cdrom"
OS="--os-variant=win2k8"
OS="--os-variant=win2k8 --disk path=/var/lib/libvirt/iso/virtio-win.iso,device=cdrom"
OS="--os-variant=rhel6"

選擇一個網絡選項,按需要更改 MAC 位置:

Net="--network bridge=br0"
Net="--network model=virtio,bridge=br0"
Net="--network model=virtio,mac=52:54:00:00:00:00"
Net="--network model=virtio,bridge=br0,mac=52:54:00:00:00:00"

選擇一個碟盤選項,更改檔案名稱及大小至所需值:

Disk="--disk /vm/Name.img,size=8"
Disk="--disk /var/lib/libvirt/images/Name.img,size=8"
Disk="--disk /var/lib/libvirt/images/Name.img,sparse=false,size=8"
Disk="--disk /var/lib/libvirt/images/Name.qcow2,sparse=false,bus=virtio,size=8"
Disk="--disk vol=pool/volume"
Disk="--livecd --nodisks"
Disk="--disk /dev/mapper/vg_..."

選擇一個來源地(live cd iso、pxe 或 url):

Src="--cdrom=/var/lib/libvirt/iso/iso/..."
Src="--pxe"
Src="-l http://alt.fedoraproject.org/pub/fedora/linux/releases/20/Fedora/x86_64/os/"
Src="-l http://download.fedoraproject.org/pub/fedora/linux/releases/20/Fedora/x86_64/os/"
Src="-l http://ftp.us.debian.org/debian/dists/stable/main/installer-amd64/
Src="-l http://ftp.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/"
Src="-l http://download.opensuse.org/distribution/openSUSE-stable/repo/oss/"
Src="--location=http://mirror.centos.org/centos/6/os/x86_64"

按需要為 kickstart 檔加入 URL:

KS=""
KS="-x ks=http://ks.example.com/kickstart/c6-64.ks"

按需選擇一個圖像介面:

Gr=""
Gr="--graphics none"
Gr="--graphics vnc"
Gr="--graphics vnc,password=foo"
Gr="--graphics spice"

選擇處理器的數量:

Cpu="--vcpus=1"
Cpu="--vcpus=2"
Cpu="--vcpus=4"

選擇記憶體大小:

Ram="--ram=768"
Ram="--ram=1024"
Ram="--ram=2048"

為客端命名:

Name="myguest"

建立客端:

virt-install $OS $Net $KS $Disk $Src $Gr $Cpu $Ram --name=$Name

請留意此程序可能需要很長時間才能完成,尤其是當你選用慢硬碟上的巨大、非稀疏檔案。如果你選用互動式的安裝,你必須連接到終端機才能完成安裝。

以 myhost 作為範例主機,連接到終端機:

virt-viewer --connect qemu_ssh://myhost/$Name

要是你較喜歡圖像應用程式:

virt-manager &

最後,你可以設置這個客端在主機開機時自動啟動:

virsh autostart $Name

在 CentOS-5 上使用 KVM 的快速指南

<<TableOfContents: execution failed [Argument "maxdepth" must be an integer value, not "[1]"] (see also the log)>>

ArtWork/WikiDesign/icon-admonition-error.png

請考慮閱讀放置在 https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/5/pdf/Virtualization/Red_Hat_Enterprise_Linux-5-Virtualization-en-US.pdf 的上游文檔,因為這篇文章在某程度上已被開發進度所超前。

我們歡迎有興趣的人仕重寫這篇文章。

/!\ CentOS 5 系列除了繼續提供 xen 的支援外,由 5.4 起更新增了 KVM 的支援,但只適用於 64 位元架構的處理器。

1. 確定處理器兼容虛擬化

/!\ 這部份適用於任何發行版本。

你需要擁有較新、支援虛擬化的處理器,才能讓 KVM 正常運作。你可以透過檢視 /proc/cpuinfo 這個檔案來確定:

egrep '(vmx|svm)' --color=always /proc/cpuinfo 

如果輸出的結果含有 vmx,你擁有一顆 Intel 處理器。如果輸出的結果含有 svm,你擁有一顆 AMD 處理器。如果你得到空白的結果,那麼你的處理器無法以硬件進行全虛擬化。CentOS 5 系列裡的 xen 方案可支援半虛擬化

2. 安裝 KVM

KVM 在 2008/9 年間出現了開發的活動,但新版本仍未在預設的軟件庫中曝光。直至它們出現,你可以透過數個途徑安裝 KVM,而每個方法安裝一個不同的版本。要確定你需要哪個版本,請檢查 KVM 針對你的客端操作系統的 客端支援狀況

2.1. 從 extras 軟件庫安裝 KVM

針對 CentOS 5.4 以前的版本,KVM 套件已收錄在 extras 軟件庫內。你可以這樣安裝 KVM:

yum install kvm kmod-kvm

截至本文(2008 年 4 月),最新的穩定版本是 kvm-36。kmod-kvm 這個內核模塊套件只支援特定的內核版本/類型。所提供的包括最新內核 2.6.18-53.1.14 的 standard-PAE 類型。此外,如果你運用的是 centosplus 內核而 yum 內置有插件的支援,供 centosplus 內核用的 kmod-kvm 亦會自動成為依賴性套件。

2.2. 從 testing 軟件庫安裝 KVM

CentOS-Testing 軟件庫內收錄了較新版的 KVM(現時是 kvm-66),它正在接受……唔……測試。如果你想試用它,你須要參考zh-tw/Repositories:「軟件庫」頁來設置 testing 軟件庫,然後這樣安裝 KVM:

yum install --disablerepo=\* --enablerepo=c5-testing kvm kmod-kvm

extras 軟件庫內的 KVM 不同之處,就是 testing 軟件庫內所收錄的 kmod-kvm 只針對現有(2.6.18-53.1.14)的標準內核。它沒有 -PAE 內核的版本。如果你擁有一個 centosplus 內核,你或許需要手動式地安裝 kmod-kvm(詳情見下文)。

2.3. 安裝最新版本的 KVM

一位 CentOS 社區的成員在他的個人網站內提供了最新版本的 KVM RPM。請查閱該網站看看現時供應哪些版本。作為一個範例,以下的指令會安裝第 84 版;很明顯地,當新版本推出時,你或許需要更改版本號碼。

# 假如已經安裝了舊版的 kvm,先移除它來避免衝突
yum remove kvm
# 核意地安裝依賴性套件,因為 KVM RPM 不是透過 yum 來安裝
yum install zlib-devel alsa-lib-devel SDL-devel gnutls-devel dev86 texi2html glibc-devel.i386
# 直接安裝 RPM,因為它們不在軟件庫內
rpm -i -v http://www.lfarkas.org/linux/packages/centos/5/x86_64/etherboot-roms-kvm-5.4.4-8.x86_64.rpm
rpm -i -v http://www.lfarkas.org/linux/packages/centos/5/x86_64/kmod-kvm-84-1.x86_64.rpm
rpm -i -v http://www.lfarkas.org/linux/packages/centos/5/x86_64/kvm-84-1.x86_64.rpm
# 重新開機,好讓 kvm 模塊被載入
reboot

請注意這個版本已載入模塊,因此你可以略過下面的「安裝模塊」部份。

3. 安裝 qemu

你大概也會想安裝 QEMU,它已收錄在 CentOS 的 base 軟件庫,因為它提供了不少可用來管理擬虛機器的指令。

yum install qemu

然而這並非必需的。

4. 載入模塊

下一步是用 modprobe 將對應你的架構的 kvm 模塊載入。如果是 Intel 處理器:

modprobe kvm-intel

如果是 AMD 處理器:

modprobe kvm-amd

假如一切須利的話,你的系統現在應該已經載入了 kvm 模塊。你可以執行這個指令來檢查:

/sbin/lsmod | grep kvm

將那些會執行 kvm 的用戶加進 kvm 群組內。假如用戶的名稱是 john,那麼:

usermod -G kvm -a john

如果你是以 john 的身分,透過 su -sudo 來轉用 root 的權限並執行以上指令,你也許須要完全登出,然後再登入才會看見新的群組在指令殼內生效。

執行 modprobe 後,你可以重新開機來確定這個模塊能被載入,而 /dev/kvm 裝置亦被 udev 賦予正確權限。現在你應該接有 /etc/sysconfig/modules/kvm.modules 這個腳本。當開機完成後,請如上使用 /sbin/lsmod 這個指令來檢查模塊有否被載入。你應該同時看見一個 kvm 及一個 kvm-intel(或 kvm-amd)的模塊。

假如你想避免重新開機,你可以用下列兩個指令為 /dev/kvm 這個裝置設定所需的權限:

chown root:kvm /dev/kvm
chmod 0660 /dev/kvm

在下設開機時,udev 會將正確權限賦予這個裝置。

5. 建立一台虛擬機器

如果你安裝了 qemu,你現在可以用它的 create 指令來建立你的磁碟映像:

qemu-img create -f qcow2 disk.img 5G

在這個範例中,你正在建立一個可以增長至 5 GB 的映像。它只會佔用實際所需的空間。而 -f qcow2 是近期 qemu 採用的標準映像格式。(-f 就是格式之意。)

如果你沒有安裝 qemu,你仍然可以這樣來建立一個磁碟映像

dd if=/dev/zero of=disk.img bs=1G count=5

count 就是 GB 的數值。在這個範例中,不論你的客端操作系統需要多少空間,.img 這個檔案仍會在你的硬碟上佔用 5 GB。

假如滑鼠無法在 qemu 內運作(例如透過 KVM 連線的 PS/2 滑鼠),請遵照以下指引。使用手冊提供了 USB 滑鼠的選項,而 PS/2 是預設的。在搜尋器上你可以快速地找到 Cape Linux User Group wiki 所提供的解決方法。在啟動 kvm 前,請先執行:

export SDL_VIDEO_X11_DGAMOUSE=0

這樣應該能夠解決滑鼠的問題。

如果你想安裝一台 Windows 2000 的虛擬機器,你所用的指令,不論你有否安裝 qemu,是 qemu-kvm。對於那些熟識 qemu 的人來說,它接納同一組選項。請將 iso 映像複製到硬碟上,然後執行:

qemu-kvm -hda win2k.img -cdrom win2k.iso -m 512 -boot d

這個指令在 qemu-kvm 的使用手冊上已經有所解釋。在這個範例中,被建立的映像名叫 win2k.img 而映像名叫,你可能已經估到,win2k.iso。-hda 是你所建立的虛擬硬碟。-cdrom 是用來指定光碟裝置。如果你要利用主機上的光碟機來開機,你應該使用 -cdrom /dev/cdrom-m 指定要提供給這台虛擬機器多少 MB 的記憶體。-boot d 意思就是要從光碟機開機。

/!\ 請注意收藏執行檔的套件,qemu-kvm,在 CentOS 的生涯中曾經有所改動;你可以這様找出現時的擁有者:

yum provides "*/qemu-kvm"

(由 2010 年 8 月起,qemu-kvm 這個指令已放置在 /usr/lib/exec 內)。

假如一切須利的話,它現在應該好像在實際硬碟上安裝一樣。完成後,它應該會開機進入 Windows 2000 的虛擬安裝。之後,你可以用同一個方法去執行它。有需要的話,請匯出 SDL_VIDEO,然後這樣啟動虛擬機器

qemu-kvm -hda win2k.img

(如果你需要使用主機的光碟機,你大概會須要加入 -cdrom 這個選項。至於 -boot d 就只是用光碟來開機時才用得著。)

6. 建立一台微軟 Windows 虛擬機器

針對 Windows 版本至 XP 及 Server 2003,我們建議你呼喚 kvm 時採用 -no-acpi 這個參數,雖然這並非必然。KVM 預設為客端提供 ACPI,而這樣做會產生衝突,減低效率。至於 Windows Vista 及 Server 2008 必須要有 ACPI,而採用 -no-acpi 這個參數會導致客端顯示以下錯誤:

Windows Boot Manager
Windows failed to start...
Status 0xc0000225
Info: Windows failed to load because the firmware (BIOS) is not ACPI compatible

舉個例說,讓我們啟動 KVM,並以預先下載至主機的 Windows Server 2008 免費試用版映像開機。你所用的指令將會是:

# 註:對應 Vista 及 Server 2008,切勿傳送 -no-acpi 參數
/usr/bin/qemu-kvm -m 1024 -cdrom "/media/vm/win2008web-trial.iso" -boot d /media/vm/hda.raw 

假如 Vista 或 Server 2008 是在早於第 72 版的 KVM 上執行,而客端系統在一個藍色畫面上顯示 "stop: 0x000000A5" 這個錯誤信息,意思就是「此系統的 ACPI Bios 未能完全乎合規格。」(http://support.microsoft.com/kb/314830

7. 網絡

7.1. NAT 網絡

kvm(還有 QEMU 及 VirtualBox)預設會使用 NAT 網絡,它取得的 IP 位址將會是 10.0.2.x。不論主機的 LAN 位於甚麼子網絡,它都可以存取它 —— 舉例說主機的主網絡是 192.168.1.x,雖然客端的 IP 是 10.0.2.x,它依然能夠透過 ssh 或 samba 聯絡主機(或網絡上的其它電腦)。它亦可以瀏覽互聯網。某些 VPN 客戶端或許會無法運作。以往,NAT(又稱為 slirp)無法與 Nortel 的 VPN 客戶端兼容。然而,Checkpoint VPN 客戶端卻可以正常運作。

7.2. 橋接網絡

假如你想客端在內聯網上以個別一台主機出現,讓整個網絡看得見,你需要採用橋接網絡。坊間有很多 QEMU 教學文檔,但大部份都過了時,因為它由 2.6.18 版內核開始有所變更。

在這裡我們描述一個簡單而可行的方法。很多教學文檔都提及在 /etc 內建立一個 qemu-ifup 腳本。很不幸地,多數文檔都似乎過時,因為當中所建議的腳本都無法運作。下面將會提供一個利用適當指令來建立橋接器及分接頭介面的腳本。

首先你需要 bridge-utils,它已收錄在 base 軟件庫內:

yum install bridge-utils

你亦會需要 tunctl

這個現已收錄在 RPMForge 軟件庫內。因此,只要啟用這個軟件庫,你便可以這樣簡易地安裝它

yum install tunctl

你亦會想編輯你的 /etc/udev/rules.d/90-kvm-rules。當你安裝 rpm 後,被建立的檔案有以下內容:

KERNEL=="kvm",          NAME="%k", GROUP="kvm", MODE="0660" 

理論上,加以下面這行:

KERNEL=="tun",          NAME="net/%k", GROUP="kvm", MODE="0660" 

應該會將正確的權限賦予 /dev/net/tun,但事實並不是這樣。雖然這是一個臨時方法,但你亦可以在 /etc/rc.local 加入

chown root:kvm /dev/net/tun
chmod 0660 /dev/net/tun

這樣做一定有效。假如你只會偶爾地使用 kvm,你可以建立一個藏有上述數行的腳本,將它儲存為 tunperms.sh(或更好的名稱)。然後當你有需要用橋接網絡時,以 root 身份或 root 權限去執行它。

對於那些急不及待的人,以下是我們的小腳本。我們稍後會提供解釋。這個腳本假設你在一個沒有 DHCP 伺服器的 192.168.1.0/24 網絡上。

PATH=$PATH:/usr/sbin:/sbin
sudo brctl addbr br0
sudo ifconfig eth0 0.0.0.0
sudo brctl addif br0 eth0
sudo ifconfig br0 192.168.1.120 netmask 255.255.255.0 up
sudo route add -net 192.168.1.0 netmask 255.255.255.0 br0
sudo route add default gw 192.168.1.1 br0
sudo tunctl -b -u john
sudo ifconfig tap0 up
sudo brctl addif br0 tap0
export SDL_VIDEO_X11_DGAMOUSE=0
sudo iptables -I RH-Firewall-1-INPUT -i br0 -j ACCEPT
qemu-kvm ~/win2k.img -m 512 -net nic -net tap,ifname=tap0,script=no

我們其實個了這些事情。我們採用 sudo,但你亦可以沿用 su 直至啟動 qemu 那一行。在 CentOS,只有 root 用戶的 $PATH 包含 /sbin/usr/sbin,但由於大部份指令都位於這兩個目錄內,因此我們開始時先將它們加至用戶的搜尋路徑內。

我們利用 brctl addbr 這個指令建立一個橋接器,br0。由於我們將會把 eth0 加進橋接器內,我們需要清除它的位址,做法就是透過 ifconfig eth0 0.0.0.0

請留意,當你將 eth0 的位址改為 0.0.0.0 時,你會臨時失去網絡連線。因此請勿嘗試在遠端,或在你不想短暫喪失網絡連線時進行這個步驟。

下一個指令將 eth0 加進橋接器內,並將 eth0 原先的位址給予橋接器。假如你的網絡卡從 DHCP 取得位址,你可以用下面的指令取代 ifconfigroute The next commands add eth0 to the bridge and give the bridge eth0's former address. If your ethernet card gets its address from DHCP, you can replace the ifconfig and route commands with

dhclient br0

tunctl 這個指令新增一個 tap0 介面,並將存取權給予 john 這個用戶。接著它經由 ifconfig 啟用。注意它並沒有一個位址。

現在將 tap0 加進 br0。

假如你擁有微軟 Windows 的客端,你或許會需要加入 DGAMOUSE 那一行。

iptables 的規則會容許流量進入橋接器。如果你不加入這條規則,虛擬機器將會無法使用 DNS 及 DHCP。

最後,我們啟動 qemu-kvm。除了 -net nic -net tap,ifname=tap0,script=no 這部份,我們已經解釋過其它選項。它們都似乎是必須的。正如上面所說,我們無法令 qemu-ifup 運作。然而,kvm-qemu 期待找到這個腳本,而且找不到的話,更可能會產生問題。因此我們採用 script=no 這個選項。當一切完成之後,qemu-kvm 應該會啟動。如果你的網絡上有 DHCP 伺服器,就算你的主機採用固定的位址,客端操作系統依然應該能夠從該伺服器取得位址,否則你便須要一如在任何 Linux,BSD 或微軟 Windows 中手動地設定客端操作系統的 IP 位址。

8. 雜項

[1] 假如你採用 centoplus 的內核,並希望試用 testing 軟件庫內的 kvm,你須要這樣做:首先,安裝(但不用啟動)2.6.18.53.1.14 版的標準內核。這是由於 kmod-kvm 要求標準版內核。kmod-kvm 會將模塊安裝在 /lib/modules/2.6.18.53.1.14.el5/extra/kvm。請複製這些模塊至 /lib/modules/2.6.18.53.1.14.el5.centos.plus/extra/kvm

[2] 假若你的機器上已安裝了 VirtualBox 或 VMWare,它們無法與 qemu-kvm 和諧共處。舉個例說,如果你經當用 VirtualBox 而不想 kvm 模塊在開機時載入,請將 /etc/sysconfig/modules/kvm.modules 重新命名為 kvm.modules.bak

接著當你決定執行 qemu-kvm 時,請停止 VirtualBox 並在執行 modeprobe kvm-intel 前先進行

rmmod vboxdrv

它們不可能同時運用。

---

多謝 ScottRobbins 提供這份指南。這份文檔的較早版本已收錄在 http://srobb.net/centoskvm.html

Translation of revision 54


2023-09-11 07:23