在 CentOS 上安装和配置 KVM

RedHat 的下一代旗舰产品 RedHat Enterprise Linux 6 将只包含 KVM,这一点 RedHat 官方已经在很久以前、在不同场合都确认过,也可以从 RHEL 6 的 Beta 版本中得到证实。KVM 发展很快,稳定性有了很大提高,随着 RHEL 6 的正式到来,KVM 应用到生产环境的日子应该不远了。VPSee 曾经测试过 KVM,也看过一些 KVM 的学术论文,在网络性能、扩展、稳定性方面 KVM 不如 Xen,这些因素是做 VPS 的关键,所以现在很少看到 KVM VPS,不知道 RHEL 6 以后会不会多起来,目前 KVM 应用比较少的还有一个原因就是对硬件要求高(CPU 需要 Intel VT 或 AMD SVM 的支持),硬件发展速度很快,以后应该不会有这个问题。由于 KVM 支持全虚拟,所以可以在上面安装各类操作系统,和 Xen HVM 一样。在 VPSee 看来,KVM 更适合做桌面一些,Xen 更适合做数据中心解决方案。以下操作在 SUN Fire X2100 服务器和 CentOS 5.5 上完成。对 OpenVZ 和 Xen 感兴趣的童鞋可以看:在 CentOS 上安装和配置 OpenVZ在 CentOS 上安装和配置 Xen.

检查 CPU

和 Xen 不同,KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安装 KVM 之前检查一下 CPU 是否提供了虚拟技术的支持:

# egrep 'vmx|svm' /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca 
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt 
rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm 
extapic cr8_legacy
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca 
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt 
rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm 
extapic cr8_legacy

安装 KVM

安装 KVM 所需要的软件包:

# yum install kvm kmod-kvm qemu kvm-qemu-img virt-viewer virt-manager \
libvirt libvirt-python python-virtinst

或者

# yum groupinstall KVM

安装完后重启系统,然后确认一下是否安装成功:

# reboot

# lsmod | grep kvm
kvm_amd                69416  0 
kvm                   226208  1 kvm_amd

# ls -l /dev/kvm 
crw-rw---- 1 root kvm 10, 232 Jun 25 15:56 /dev/kvm

安装虚拟机

用 virt-install 安装,这里以安装 FreeBSD 8.0 为例,os-variant 可以选择 freebsd7:

# virt-install \
--name freebsd \
--ram 512 \
--vcpus=1 \
--disk path=/home/vpsee/freebsd.img,size=4 \
--network network:default \
--os-variant=freebsd7 \
--accelerate \
--cdrom /home/vpsee/8.0-RELEASE-i386-disc1.iso \
--vnc

如果需要获得 virt-install 命令的更多选项和参数,可以查看在线帮助:

# man virt-install

用 virt-viewer 打开控制台连上 FreeBSD 的安装界面:

# virt-viewer freebsd

也可以直接用 virt-manager 图形化安装,安装过程很简单,KVM 中没有 Xen dom0, domU 的概念,更容易理解和使用,任何用过 VMware 和 VirtualBox 的人都会很容易上手,启动 virt-manager 图形界面创建一个虚拟机,创建硬盘、配置内存网络、指定安装光盘 iso 等,一步一步傻瓜操作:

# virt-manager

Tips

安装完 KVM 和上面的 FreeBSD 以后,以后就可以通过 virsh 命令行工具来启动、关闭、重启、进入控制台的工具来操作虚拟机了,就和在 Xen 里使用 xm 一样:

# virsh --connect qemu:///system
start freebsd
console freebsd
quit

如果你在客户端使用 Mac 或者 Linux 的话,而且没有 vnc viewer 之类的工具的话,可以直接用 ssh 和 X 连接到正在安装 FreeBSD 的那个控制台上:

# ssh -X -C root@172.16.20.1
# virt-viewer freebsd

freebsd kvm console

评论 (56 Comments)

  1. 我还是主要觉得kvm依赖于VT,而很多地方用VT就太慢了。
    陷入内核等待IRQ实际上对于OS来说已经是一个很大的开销了。

    所也这也是xen在一些效率敏感的地方应用。尤其是VPS这种安全和效率兼顾的地方。

  2. 嗯,理论上,因为 Xen 在 IO 的时候需要频繁中断,所以 interrupts 要比 KVM 多很多,因为 Xen 在底层和操作系统中间加了一层 hypervisor,多了一层就多了一个中间人,消耗就多些,KVM 直接在 kernel 里、无中间人,自然 interrupts 要比 Xen 少,理论上 KVM 在 IO 方面强一点。但是在实际生产环境中,环境相当复杂,更需要的是稳定和整体性能,在这方面 Xen 比 KVM 成熟的多,资源分配和扩展都强很多。

  3. @vpsee
    呃,IO研究的不多,但是xen的motivation就应该是减少interrupts。所以才去改内核的。我是就特权指令来说的。-_-|||

  4. Xen 的初衷和想法是提供一个 hypervisor 以便虚拟机获取接近物理硬件的高性能,Xen 没有减少 interrupts,和 KVM 相比 interrupts 反而增多了,这是因为中间有一层 hypervisor,比如一次进程调度切换的时候,domU 上的 kernel 进程调度完后还需要看 hypervisor 的脸色,因为 hypervisor 负责虚拟 CPU 的调度,所以这里面有两层,而 KVM 上的虚拟机就是一个进程在运行,直接用 Linux kernel 里的进程调度,所以这里面所发生的上下文切换要少得多,这也是 KVM 的优点之一,也是一些人抨击 Xen 的地方。Xen 需要 guest 系统修改内核是因为 guest 系统的特权(指令)被剥夺了,他们被迫移到了 ring1(hypervisor 占据 ring0),这样一来 guest 的 kernel 就必须修改自己以适应这种情况,并通过修改 kernel 使特权指令产生自陷。这其实源于 x86 体系的缺陷,x86 起初并不是为虚拟化打造的,一些 x86 特权指令在低特权级执行时不能产生自陷,导致上一级无法直接捕获,半虚拟技术是解决这个问题的一种办法,另外两种办法分别是:Dynamic Instruction Translation(动态指令转换)和硬件辅助(所以有了 Intel VT 和 AMD SVM)。

  5. 我晕掉了 .. 我为什么在.Fedora 下能回复呢? 难道只有火狐能回复吗??
    真实不容易阿..

  6. 百度搜索过来的..凑凑热闹。。。

  7. 嗯,我在本机做过测试,也没有发现说KVM有那个地方能说明他不稳定啊?博主可否有测试结果证明KVM没有xen稳定,我正在这两种技术之间纠结,考虑用哪种虚拟化技术比较好!

  8. 测试很简单,如果在 32GB 机器上跑50-100个虚拟机,每个虚拟机再跑一两个应用就知道了,部分 KVM 虚拟机会 crash,不过 KVM 是未来啊:)

  9. 呵呵,这个只有真正测试过才知道.不过我还真的测试过了,测试方法很变态.
    如下: 我的服务器3G内存,速龙5000+,支持vt,主板开启vt.
    先用virt-install 创建一个标准的debian虚拟机,然后在这个里面配置好测试环境.就是安装GCC等标准的库,安装 Unixbench-wht 的测试软件.在我写了一个脚本,开机自动运行 Unixbench 循环100次.
    然后我写了一个脚本,用这个磁盘镜像为模板,创建50个虚拟机,配置为网卡桥接,内存64M.等脚本创建50个虚拟机完成以后.我又用脚本,全部启动这50个虚拟机.等这50个虚拟机全部启动完成以后,每个虚拟机都会自动运行 unixbench 测试程序100次. 测试总共运行 50*100=5000次 unixbench.这下够变态了吧.
    用top命令查看,cpu looad average 3个指标都在 49-50之间,够厉害吧,哈哈.经过我残酷的测试,free -m 发现系统内存全部用完.但是却没有一个 虚拟机挂掉.而且每个虚拟机测试的分数在 60分左右. 如果50个虚拟机同时运行,测试分数在 200分左右.
    而且物理服务器并没有出现死机等异常情况,反应还比较快.

    所以,我的结论是,说kvm不稳定是不正确的.我稍后会将我的测试工具,测试方法,测试报告等截图,数据等发表到我博客.有图有真相.

  10. 经过我的测试,50个64M内存的虚拟机同时进行大批量运算,磁盘读写,cpu计算等,物理机的内存会逐步的分给每个虚拟机,和xen不同,xen是完全独享.kvm内存不够用的时候,会使用系统交换分区,而xen会不能启动虚拟机.
    因为我的实验环境有效,周末我会用公司的一个4核速龙cpu,8G内存的服务器做100个以上的kvm虚拟机同时运行的测试.
    我认为,说kvm不稳定,还是有些武断的

  11. 更新上面的一个笔误 如果50个虚拟机同时运行,但只有一个虚拟机在运行unixbench的时候,测试分数在 200分左右.

  12. 嗯,我们以前是这样测的,把常用的应用分成8组,每组有1个虚拟机,在另外若干机器上通过相应的应用和脚本模仿生产环境对这8个虚拟机进行测试;然后逐步增加虚拟机数量,每组分出2、4、8个配置不等的虚拟机后再用脚本测试,当然这样的脚本和测试持续时间一般两周以上,并且用 snmp 和 cacti 监测记录性能数据,测试过程中多次出现 KVM 虚拟机 crash、呆滞、网络停止等现象。如果你有测试数据和图形的话赶快贴出来看看啊!

  13. 应该学学这个 哈哈 下一步计划就是学习下KVM的管理

  14. 哇,好专业的网站,谢谢!

  15. 哥们,不知道你用过qemu管理kvm过没,我看qemu创建kvm的时候可以支持多种网卡,”i82551″,”i82557b”, “i82559er”, “ne2k_pci”, “ne2k_isa”, “pcnet”, “rtl8139”, “e1000”, “smc91c111”, “lance” and “mcf_fec”,默认创建的是”rtl8139″,而使用libvirt管理kvm时,创建的虚拟机只能是”rtl8139″这种网卡,我看ibm的文章,”rtl8139″这种网卡的性能并不是很好,不知道你们是用哪个管理kvm的?盼回复

  16. 使用 libvirt 可以配置网卡。用 libvirt 的虚拟机的配置文件是 xml 格式的,保存在 /etc/libvirt/qemu 中,可以通过导出、编辑、再导入这个文件来编辑 kvm 虚拟机的配置文件:
    # virsh dumpxml test > /tmp/test.xml
    # vi /tmp/test.xml
    # virsh define /tmp/test.xml
    其中有关网卡的配置需要编辑:
    interface type=’network’>

    model type=’e1000’/>
    /interface>

  17. 多谢指点,这部分内容,我能参考哪里呢?貌似http://libvirt.org上没有这部分内容,还是我看的还不够细致?
    另外你的实际使用经验,哪种网卡的性能最好?

  18. e1000 和 virtio 都很稳定,virtio 性能好一些。

  19. 久闻站长大名:-)
    请问您关于KVM的测试有详细一点儿的数据么?
    使用的qemu-kvm哪个版本?另外您说的卡死是kvm进程直接结束了,还是可恢复的。

  20. 你好,我想问你一个关于管理KVM虚拟机方面的问题。
    我们知道,在 Xen 里,提供了一个管理工具: xm ,可以使用它得到 Xen 里虚拟机的信息,但是在 KVM 中好像没有类似的工具,这样的话,我创建了一个虚拟机(我使用的是 qemu-kvm 工具包)后,就无法得到它的信息了。不知道你可否给点建议?谢谢。
    我的邮箱是:wangzheng@cn.fujitsu.com

  21. 可以用 virsh, virsh 是 libvirtd 的前端,支持 Xen 和 KVM:
    # virsh list
    Id Name State
    ———————————-
    0 Domain-0 running
    1 ubuntu01 idle

    # virsh dominfo ubuntu01
    Id: 1
    Name: ubuntu01
    UUID: cd4e2877-94f5-1c43-1923-dcac09e521ad
    OS Type: linux
    State: idle
    CPU(s): 2
    CPU time: 51120.6s
    Max memory: 1048576 kB
    Used memory: 1048348 kB
    Autostart: enable

  22. 好的,我去装一下,谢谢你的建议。

  23. 您好,请问您的 CentOS 5.5 是 64 位的么?
    我的 32 位的测试下来有冲突.

  24. 恩,是64位的,不过32位也应该没有问题。

  25. 我这边 32 位的不好安装,显示跟 libvirt* 冲突 .
    您如果有时间可以看下这个 :
    1) http://www.centos.org/modules/newbb/viewtopic.php?topic_id=26395&forum=37
    2) http://wiki.centos.org/HowTos/KVM

  26. 我觉得性能是一方面,可管理性也是一方面。
    我在单位目前采用的是CentOS 5.3 64bit+XEN+Xen-shell.
    有了xen-shell,就可以让每位用户自己管理自己的vps了。至少像开机、关机不用我再弄了。
    不知道如果采用kvm的话,有没有类似工具?
    我在www.linux-kvm.org的管理工具页面,看到的都是方便管理员管理的,没有为了多用户的管理工具。
    vpsee这方面有什么经验吗?

  27. @babo
    我以前用过一个简单的脚本 kvm-shell(http://www.michael-kress.de/2009/12/kvm-shell/),不知道现在怎么样了,你可以试试,好用的话记得分享哦:D

  28. @vpsee
    kvm-shell(http://www.michael-kress.de/2009/12/kvm-shell/
    这个地址已经失效了.不过还是感谢,我找到了km-shell(http://kvm-hosting.org/support/km-shell/).
    本来打算在一台sunfire X4450上安装CentOS 5.5+KVM测试下的,结果这台服务器接显示器不亮…只能Console连接上,然后SP start /SYS/Console又没反应了…不知道啥情况,联系Sun工程师了,等解决了问题继续测试.

  29. 您好,请问一下:
    我已经成功安装了KVM,并且也安装了虚拟操作系统,配置了网桥,但是宿主机和虚拟机无法ping通,也无法上网,那是什么问题呢?
    我的网桥是这样配置的:
    创建文件:vi /etc/sysconfig/network-scripts/ifcfg-br0 ,内容如下:
    DEVICE=br0
    TYPE=Bridge
    BOOTPROTO=static
    BROADCAST=172.28.140.255
    IPADDR=172.28.140.150
    NETMASK=255.255.255.224
    NETWORK=172.28.140.129
    ONBOOT=yes

    并修改:/etc/sysconfig/network-scripts/ifcfg-eth0 如下:

    # Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+
    DEVICE=eth0
    #BOOTPROTO=static
    #BROADCAST=172.28.140.255
    HWADDR=00:10:A7:05:AF:EB
    #IPADDR=172.28.140.150
    #NETMASK=255.255.255.224
    #NETWORK=172.28.140.129
    ONBOOT=yes
    BRIDGE=br0

    如能指教,不胜感激!

  30. @janson
    虚拟机内部(guest)和服务器(host)上都不需要这样配置网桥就可以用,你用 virt-manager 创建虚拟机的时候会有3种网络模式(bridge, route, nat)选择,选择 bridge 模式就可以了。

  31. 想问个问题,kvm的vnc默认只监听在127.0.0.1:5900吗?
    我服务器没有安装X server和图形管理界面。
    用命令行创建虚拟系统,结果vnc总监听在127的ip上,外面也不能通过vnc连接。。。这个怎么弄?
    通过–vnc 10.10.15.150:3也没有用。。。。

  32. @babo
    你可以通过 -vnc 0.0.0.0:1 参数启动 kvm 虚拟机,然后 vnc 客户端用 kvm host ip:1 连接这个虚拟机。

  33. @vpsee 我测试了。如果在virt-install的参数里加入-vnc 0.0.0.0:1 貌似不起作用。
    我是直接修改的/etc/libvirt/qemu/下的xml文件
    找到和guest系统对应的。

    这个肯定没有问题了。而且win2k8已经成功安装并启动。

    我也尝试了安装那个km-shell.
    但是好像这个km-shell都是调用kvm这个命令,但是centos系统安装的kvm没有这个命令呀。不知道vpsee知道这个kvm这个命令吗?

  34. @vpsee 在km-shell里面,有一段是现实版本信息的。
    sub do_version
    724 {
    725 my $kernel = `uname -r`;
    726 chomp($kernel);
    727
    728 my $kvm = `kvm –version`;
    729 chomp($kvm);
    730
    731 print <<EOF;
    732 km-shell: v$VERSION
    733 kernel : $kernel
    734 KVM : $kvm
    735 EOF
    736 }

    明显是调用kvm这个命令,但是我find了下centos里面,只有qemu-kvm,而且这个qemu-kvm也不支持–version
    不知道是不是还需要安装什么软件包?

  35. @babo
    很早以前是可以用 kvm -version 查看 KVM 版本号的,估计 kvm-shell 很久没更新了吧。自从 KVM 加入 Linux kernel 以后版本号就没有意义了,现在 KVM 是 kernel 的一部分,KVM 的版本号就是 kernel 的版本号。

  36. @vpsee 哦,原来如此。那我争取先把start\stop跑起来就ok了。呵呵

  37. 你好:
    您知道怎么用文本方式进入kvm虚拟机吗?就像xen一样:xm console 1

  38. @janson
    可以用 virsh 工具。

  39. 麻烦问下vpsee, 我在virt-manager全虚方式安装guest系统时,提示没有找到hvm。还请指点下,是不是少了什么模块?多谢

    详细信息发到linuxstone了。
    http://bbs.linuxtone.org/thread-9207-1-1.html

  40. @vpsee
    想问一下relh6.0+kvm创建的虚拟机分配的磁盘会完全占用硬盘的大小,是否有办法解决这个问题,还有对开设好的虚拟机磁盘是否可以扩展或者缩减其容量。使用LVM是否可以解决这个问题。

  41. @sk
    扩展磁盘大小可以参考这篇文章:调整 Xen 虚拟机硬盘大小(也适用于 kvm),最好的解决办法还是用 LVM.

  42. 我查找了所有的KVM网上的教程。但都没有成功,我的环境是远程操作,只能这样,机器在异地机房,全部公网IP。但做网桥后,宿主机和虚拟客户系统都PING不通。和上面那个仁兄janson 情况一样,希望VPSEE写一个详细的配置教程,google上的,都不行。。。

  43. 您好,请问一下:
    我已经成功安装了KVM,并且也安装了虚拟操作系统,配置了网桥,但是宿主机和虚拟机无法ping通,也无法上网,那是什么问题呢?
    我的网桥是这样配置的:
    创建文件:vi /etc/sysconfig/network-scripts/ifcfg-br0 ,内容如下:
    DEVICE=br0
    TYPE=Bridge
    BOOTPROTO=static
    BROADCAST=172.28.140.255
    IPADDR=172.28.140.150
    NETMASK=255.255.255.224
    NETWORK=172.28.140.129
    ONBOOT=yes

    并修改:/etc/sysconfig/network-scripts/ifcfg-eth0 如下:

    # Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+
    DEVICE=eth0
    #BOOTPROTO=static
    #BROADCAST=172.28.140.255
    HWADDR=00:10:A7:05:AF:EB
    #IPADDR=172.28.140.150
    #NETMASK=255.255.255.224
    #NETWORK=172.28.140.129
    ONBOOT=yes
    BRIDGE=br0

    如能指教,不胜感激!

    我的也是这样,全是公网IP,远程连接,字符下安装,不知如何处理了。。

  44. 我是vpsee的小弟。。这样理解:(

  45. 安装了bridge-utils包后,最好重启一下系统。

  46. 转载了你3篇关于 虚拟机的文章,已经著名了出去。谢谢

  47. vpsee您好.. 现在的情况是 Centos 6.1 基本就按照你这个装的.. 然后guest的IO性能非常差.. dd测试才370kb/s的速度.. 有个情况是我装了6.0的第二天就6.1了 就没忍住升级了..但我在升级之前没有测试过。。  估计是host的问题.. 您判断能是哪里问题呢?

  48. 好吧.. 发现母鸡本身也不快…用的virtio了… 主机用dd dsync 也就1.2MB/s guest 370kb/s conv=fsysn 母鸡有50MB/S guest 15MB/S 如果要改进应该从哪入手呢? 主机是三块SAS raid5 hp的smart array阵列卡好像… 算是正常范围吗? thx~

  49. 请问怎么增加外网IP呢 在宿主机怎么改配置呀?

  50. 你好
    # ssh -X -C root@172.16.20.1
    # virt-viewer freebsd
    以上的172.16.20.1指的是哪里的IP地址?
    在命令行系统安装了KVM,通过virsh-install配置了虚拟机,请问如何用SSH连接进去安装系统?ssh -X -C root@172.16.20.1是这样吗?谢谢!

  51. @hai
    172.16.20.1 是 KVM 服务器的地址,不是 FreeBSD 虚拟机的地址。

  52. @vpsee
    # ssh -X -C root@172.16.20.1
    # virt-viewer freebsd
    以上的命令的是意思是在另外一台linux服务器(客户端)上通过SSH连接到KVM服务器?那么另外一台linux服务器(客户端)需要桌面环境吗?KVM服务器需要桌面环境吗?谢谢!

  53. @hai
    是的,先(从另外一台机器)ssh 到 KVM 服务器,然后在 KVM 服务器上执行 virt-viewer,就会把 KVM 服务器上运行的 virt-viewer 通过 ssh 传到客户端,当然这是远程的情况,如果你就在本地 KVM 服务器上玩 KVM 的话就不需要 ssh,就在本地执行 virt-viewer 就可以了。

    KVM 服务器不需要桌面环境,如果你初学的话用桌面环境和工具 virt-manager 会让你安装 FreeBSD/Linux 虚拟机更容易。

  54. @vpsee
    最近用kvm 有个很诡异的问题。发现ping宿主的某一个虚机的时候,有延时的情况,其他几台虚拟机没有类似的问题。不知道这样的情况是个什么问题?不知道您是否有类似的问题。

  55. @spring
    看一下这个 “某个虚拟机” 是否正在使用和占用大量带宽。

  56. 上面什么都没有开,之前跑了代码,可能导致网卡很慢,后来把代码都移走了。这个虚拟机上面什么东西都没有,就一个ssh服务。还是会报:Write failed: Broken pipe。报错的时候,网络就开始卡了。Ping的时候,时间需要1W多ms。很郁闷。

发表评论