CentOS 5 系列除了继续提供 xen 的支持外,由 5.4 起更新增了 KVM 的支持,但只适用于 64 位元结构的处理器。
Contents
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/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-amd
kvm 模块。你可以执行这个指令来检查:
/sbin/lsmod | grep kvm
usermod -G kvm -a john
如果你是以 john 的身分,通过 su - 或 sudo 来转用 root 的权限并执行以上指令,你也许须要完全注销,然后再登录才会看见新的群组在指令壳内生效。
/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. 创建一台虚拟机器
create 指令来创建你的磁盘映像:
qemu-img create -f qcow2 disk.img 5G
-f qcow2 是近期 qemu 采用的标准映像格式。(-f 就是格式之意。)
dd if=/dev/zero of=disk.img bs=1G count=5
假如鼠标不能在 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
-hda 是你所创建的虚拟硬盘。-cdrom 是用来指定光盘设备。如果你要利用主机上的光盘机来开机,你应该使用 -cdrom /dev/cdrom。-m 指定要提供给这台虚拟机器多少 MB 的内存。-boot d 意思就是要从光盘机开机。
请注意收藏执行档的组件,qemu-kvm,在 CentOS 的生涯中曾经有所改动;你可以这様找出现时的拥有者:
yum provides "*/qemu-kvm"
qemu-kvm -hda win2k.img
-cdrom 这个选项。至于 -boot d 就只是用光盘来开机时才用得着。)
6. 创建一台微软 Windows 虚拟机器
Windows Boot Manager
Windows failed to start...
Status 0xc0000225
Info: Windows failed to load because the firmware (BIOS) is not ACPI compatible
# 注:对应 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 网络
7.2. 桥接网络
/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"
chown root:kvm /dev/net/tun
chmod 0660 /dev/net/tun
#!/bin/sh
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
/sbin 及 /usr/sbin,但由于大部份指令都位于这两个目录内,因此我们开始时先将它们加至用户的寻找路径内。
brctl addbr 这个指令创建一个网桥,br0。由于我们将会把 eth0 加进网桥内,我们需要清除它的地址,做法就是通过 ifconfig eth0 0.0.0.0。
请留意,当你将 eth0 的地址改为 0.0.0.0 时,你会临时失去网络连接。因此请勿尝试在远程,或在你不想短暂丧失网络连接时进行这个步骤。
ifconfig 及 route 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 启用。注意它并没有一个地址。
-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
/etc/sysconfig/modules/kvm.modules 重新命名为 kvm.modules.bak。
qemu-kvm 时,请停止 VirtualBox 并在执行 modeprobe kvm-intel 前先进行
rmmod vboxdrv
多谢 ScottRobbins 提供这份指南。这份文档的较早版本已收录在 http://home.roadrunner.com/~computertaijutsu/centoskvm.html
Translation of revision 43
















