RHEL6 已經推出很久了,沒想到在 RedHat 自家的 RHEL6 上安裝 KVM 還有這么多問題,難道不應該是像 Apache/MySQL 那樣安裝完就可以用的么?(注:除去商標,CentOS 就是 RHEL,CentOS6 和 RHEL6 是一回事)。以下操作在 CentOS 6.2 最小化安裝版本 CentOS-6.2-x86_64-minimal.iso 上完成,其他版本可能不會遇到本文提到的部分問題。

檢查 CPU

和 Xen 不同,KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安裝 KVM 之前檢查一下 CPU 是否提供了虛擬技術的支持:

# egrep '(vmx|svm)' --color=always /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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
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 syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm

安裝KVM

安裝 KVM 很容易,要正常運行的話還需要折騰一下:

#yum -y install qemu-kvm libvirt python-virtinst bridge-utils

安裝完后關閉 selinux 并重啟系統,然后確認一下是否 kvm 安裝成功:

#vi /etc/sysconfig/selinux
SELINUX=disabled

#reboot

#lsmod | grep kvm
kvm_intel 50412 3
kvm 305988 1 kvm_intel

#stat /dev/kvm
File: `/dev/kvm'
Size: 0 Blocks: 0 IO Block: 4096 character special fileDevice: 5h/5d Inode: 10584 Links: 1 Device type: a,e8Access: (0666/crw-rw-rw-) Uid: ( 0/ root) Gid: ( 36/ kvm)
Access: 2012-04-18 16:00:46.276341129 +0200
Modify: 2012-04-18 16:00:46.276341129 +0200
Change: 2012-04-18 16:00:46.276341129 +0200

再來確認一下 libvirt 是否能正常啟動和關閉。重啟 libvirtd 服務的話會報錯,查看日志發現 internal error Failed to create mDNS client 錯誤,這個問題容易改正,安裝 avahi 即可,也可以去 /etc/libvirt/libvirtd.conf 設置 mdns_adv = 0, 這里采用安裝 avahi 的方法:

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon: [FAILED]
Starting libvirtd daemon: [ OK ]
#tail /var/log/libvirt/libvirtd.log
2012-04-18 13:51:03.032+0000: 18149: info : libvirt version: 0.9.4, package: 23.el6_2.7 CentOSBuildSystem , 2012-04-16-14:12:59, c6b5.bsys.dev.centos.org)
2012-04-18 13:51:03.032+0000: 18149: error : virNetServerMDNSStart:460 : internal error Failed to create mDNS client: Daemon not running
# yum -y install avahi
# /etc/init.d/messagebus restart
# /etc/init.d/avahi-daemon restart
重啟 libvirtd 服務繼續報錯,發現缺少 dmidecode 包,安裝 dmidecode 后終于重啟 libvirtd 成功 :

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon: [FAILED]
Starting libvirtd daemon: [ OK ]

# tail /var/log/libvirt/libvirtd.log
2012-04-18 13:54:54.654+0000: 18320: info : libvirt version: 0.9.4, package: 23.el6_2.7 (CentOS BuildSystem , 2012-04-16-14:12:59, c6b5.bsys.dev.centos.org)
2012-04-18 13:54:54.654+0000: 18320: error : virSysinfoRead:465 : internal error Failed to find path for dmidecode binary

# yum -y install dmidecode

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon: [ OK ]
Starting libvirtd daemon: [ OK ]
現在 kvm 和 libvirt 都安裝成功和運行了,但并不表示可用了,問題接著來。

配置網絡橋接

橋接網絡配置文件,從ifcfg-eth0復制現有網卡的配置文件,改名為ifcfg-br0:

cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-br0

修改ifcfg-br0,注意紅色的兩行,其他部分基本上不用改。

vi /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0

TYPE=Bridge

BOOTPROTO=static

BROADCAST=192.168.200.255

IPADDR=192.168.200.180

NETMASK=255.255.255.0

NETWORK=192.168.200.0

ONBOOT=yes

修改ifcfg-br0,注意紅色的行,其他部分基本上不用改。

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

HWADDR=

ONBOOT=yes

BRIDGE=br0

#BOOTPROTO=static

#BROADCAST=192.168.200.255

#IPADDR=192.168.200.180

#NETMASK=255.255.255.0

#NETWORK=192.168.200.0

重啟network服務

service network restart

這里需要注意,如果啟用了NetworkManager,最好關閉該服務,因為該服務與network有沖突。

配置轉發
執行以下命令:

echo 1 > /proc/sys/net/ipv4/ip_forward

這一步雖然只有簡單的一條命令,但卻很關鍵。如果不執行這一步,所有的虛擬機將無法上網。另外,上一步配置完橋接之后重啟network,會自動將ip_forward改為0,所以重新配置網絡后,不要忘了執行該命令。發現虛擬機無法上網的時候,也可以檢查一下ip_forward值。


安裝虛擬機
從 6 系列開始 RedHat 推薦使用 virt-install/virsh 系列工具操作 kvm,而不是直接使用 qemu-kvm,所以 qemu-kvm 被移到一個不起眼的地方 /usr/libexec/:

# qemu-kvm-bash: qemu-kvm: command not found# ls /usr/libexec/qemu-kvm/usr/libexec/qemu-kvm
VPSee
采用 RedHat 推薦的方式(virt-install)安裝虛擬機,這里以安裝 ubuntu-11.10-server-amd64.iso 為例:

# virt-install \
--name ubuntu \
--ram 512 \
--vcpus=1 \
--disk path=/root/ubuntu.img,size=10 \
--accelerate \
--cdrom /root/ubuntu-11.10-server-amd64.iso \
--graphics vnc
開始安裝,創建硬盤 ubuntu.img 后就報錯,用的是 root 帳號居然還 Permission denied?!

Starting install...Creating storage file ubuntu.img | 10.0 GB 00:00ERROR internal error Process exited while reading console log output: char device redirected to /dev/pts/1qemu-kvm: -drive file=/root/ubuntu.img,if=none,id=drive-ide0-0-0,format=raw,cache=none: could not open disk image /root/ubuntu.img: Permission denied
Domain installation does not appear to have been successful.If it was, you can restart your domain by running: virsh --connect qemu:///system start ubuntuotherwise, please restart your installation.
修改 qemu.conf 配置,把下面幾個地方的注釋去掉,然后把 dynamic_ownership 的值改成0,禁止 libvirtd 動態修改文件的歸屬:

# vi /etc/libvirt/qemu.conf

...

user = "root"

group = "root"

dynamic_ownership = 0

...
重啟 libvirtd 服務再用上面的 virt-install 命令安裝就應該可以了。這個時候 vnc 默認綁定的是本機 127.0.0.1,如果其他機器想用 vnc 客戶端訪問這臺 kvm 服務器正在安裝的 ubuntu 的話需要把 vnc 綁定到服務器的 IP 地址或者綁定到全局 0.0.0.0. 修改 qemu.conf 文件取消 vnc_listen 一行前面的注釋,記得重啟 libvirtd:

# vi /etc/libvirt/qemu.conf

...

vnc_listen = "0.0.0.0"

...
在 CentOS 5.x 安裝 KVM 可以看:在 CentOS 5上安裝和配置 KVM