RHEL6 已經(jīng)推出很久了,沒(méi)想到在 RedHat 自家的 RHEL6 上安裝 KVM 還有這么多問(wèn)題,難道不應(yīng)該是像 Apache/MySQL 那樣安裝完就可以用的么?(注:除去商標(biāo),CentOS 就是 RHEL,CentOS6 和 RHEL6 是一回事)。以下操作在 CentOS 6.2 最小化安裝版本 CentOS-6.2-x86_64-minimal.iso 上完成,其他版本可能不會(huì)遇到本文提到的部分問(wèn)題。
檢查 CPU
和 Xen 不同,KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安裝 KVM 之前檢查一下 CPU 是否提供了虛擬技術(shù)的支持:
# 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 很容易,要正常運(yùn)行的話還需要折騰一下:
#yum -y install qemu-kvm libvirt python-virtinst bridge-utils
安裝完后關(guān)閉 selinux 并重啟系統(tǒng),然后確認(rèn)一下是否 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
再來(lái)確認(rèn)一下 libvirt 是否能正常啟動(dòng)和關(guān)閉。重啟 libvirtd 服務(wù)的話會(huì)報(bào)錯(cuò),查看日志發(fā)現(xiàn) internal error Failed to create mDNS client 錯(cuò)誤,這個(gè)問(wèn)題容易改正,安裝 avahi 即可,也可以去 /etc/libvirt/libvirtd.conf 設(shè)置 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 服務(wù)繼續(xù)報(bào)錯(cuò),發(fā)現(xiàn)缺少 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 ]
現(xiàn)在 kvm 和 libvirt 都安裝成功和運(yùn)行了,但并不表示可用了,問(wèn)題接著來(lái)。
配置網(wǎng)絡(luò)橋接
橋接網(wǎng)絡(luò)配置文件,從ifcfg-eth0復(fù)制現(xiàn)有網(wǎng)卡的配置文件,改名為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服務(wù)
service network restart
這里需要注意,如果啟用了NetworkManager,最好關(guān)閉該服務(wù),因?yàn)樵摲?wù)與network有沖突。
配置轉(zhuǎn)發(fā)
執(zhí)行以下命令:
echo 1 > /proc/sys/net/ipv4/ip_forward
這一步雖然只有簡(jiǎn)單的一條命令,但卻很關(guān)鍵。如果不執(zhí)行這一步,所有的虛擬機(jī)將無(wú)法上網(wǎng)。另外,上一步配置完橋接之后重啟network,會(huì)自動(dòng)將ip_forward改為0,所以重新配置網(wǎng)絡(luò)后,不要忘了執(zhí)行該命令。發(fā)現(xiàn)虛擬機(jī)無(wú)法上網(wǎng)的時(shí)候,也可以檢查一下ip_forward值。
安裝虛擬機(jī)
從 6 系列開(kāi)始 RedHat 推薦使用 virt-install/virsh 系列工具操作 kvm,而不是直接使用 qemu-kvm,所以 qemu-kvm 被移到一個(gè)不起眼的地方 /usr/libexec/:
# qemu-kvm-bash: qemu-kvm: command not found# ls /usr/libexec/qemu-kvm/usr/libexec/qemu-kvm
VPSee 采用 RedHat 推薦的方式(virt-install)安裝虛擬機(jī),這里以安裝 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
開(kāi)始安裝,創(chuàng)建硬盤 ubuntu.img 后就報(bào)錯(cuò),用的是 root 帳號(hào)居然還 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 配置,把下面幾個(gè)地方的注釋去掉,然后把 dynamic_ownership 的值改成0,禁止 libvirtd 動(dòng)態(tài)修改文件的歸屬:
# vi /etc/libvirt/qemu.conf
...
user = "root"
group = "root"
dynamic_ownership = 0
...
重啟 libvirtd 服務(wù)再用上面的 virt-install 命令安裝就應(yīng)該可以了。這個(gè)時(shí)候 vnc 默認(rèn)綁定的是本機(jī) 127.0.0.1,如果其他機(jī)器想用 vnc 客戶端訪問(wèn)這臺(tái) kvm 服務(wù)器正在安裝的 ubuntu 的話需要把 vnc 綁定到服務(wù)器的 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