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 的快速指南

请考虑阅读放置在 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/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 网络上。

#!/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

我们其实个了这些事情。我们采用 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 53

zh/HowTos/KVM (last edited 2015-05-09 15:00:41 by TimothyLee)