kvm是一个完整的全虚拟化解决方案. 当前主机操作系统支持linux系统和x86架构. 它包括了一个可加载的内核模块(kvm.ko)和一个用户空间组件. 通过使用kvm虚拟化技术, 你可以运行多个未修改的linux或windows虚拟机. 每一个虚拟机有自己的虚拟硬件: 一个网卡, 磁盘, 图形适配器, 等.
KVM支持全虚拟化和半虚拟化. 你可以通过给当前内核打kvm-paravirt-patches补丁来支持半虚拟化.
a device driver for managing the virtualization hardware; this driver exposes its capabilities via a character device /dev/kvm a user-space component for emulating PC hardware; this is a lightly modified QEMU processQEMU is a well known processor emulator written by French computer wizard Fabrice Bellard.
kvm具有以下优点
速度 kvm的cpu效率和磁盘效率绝对是最优秀的。 稳定 目前的感受是最稳定的,不比 vmware 差。 扩展性 kvm是一个新的项目,以后逐步在图形效率,3d和硬件上面得到linux的支持。
当然也有缺点
使用不太方便。很多人惧怕命令行的东西,但是会发现命令行是那么的清晰和简单。 目前有些功能不太完善,比如图形性能,usb等。 cpu需要支持VM技术,否则不能体现 kvm 的优势。但这种基于硬件的技术也正是性能的保证。
Ubuntu 9.04 kvm-84
kvm基本是一个独立的系统,只不过借用了qemu的代码和操作界面。也就是说,你在命令行中如果使用 qemu 的地方,只需要题换成 kvm,其他的参数基本都不用修改就可以运行,这样的效率是 qemu 的很多倍。 如果要用kvm,你的cpu必须支持 vm 技术,否则和 qemu 的效率基本相同。如果你对KVM指令很困惑的话,可以先安装qemu GUI界面进行配置,然后导出qemu命令行就可以了解KVM的用法
首先使用
egrep '(vmx|svm)' /proc/cpuinfo
如果有输出,说明你的cpu支持VM
CPU支持硬件VM虚拟技术(BIOS里设置),就能够加载kvm-intel or kvm-amd模块
sudo apt-get install kqemu-common kqemu-source kvm
geminis@geminis-ubuntu:~$ lsmod |less Module Size Used by kqemu 137892 0 bridge 56340 0 kvm_intel 50624 0 kvm 152640 1 kvm_intel
kvm-img create -f 参数
-f 参数表示创建文件格式,后边所带的子参数qcow/qcow2 表示KVM默认镜像格式, vmdk表示VMWARE的磁盘格式。
# sudo kvm-img create -f vmdk arch.img 2G Formatting 'arch.img', fmt=vmdk, size=2097152 kB # chmod 777 arch.img #允许虚拟机能够读写镜像文件
KVM支持三种网络模式,跟VMware所支持的一样:NAT, Host-Only, Bridge
使用tap/tun虚拟出一个网卡,需要内核支持tap/tun模块(一般都支持),还需要配置iptables转发,因为tap网卡上的ip不能和主机上ip在同一个网段。客户使用该网卡可以跟主机通讯也可以上网,但局域网内的其他机器不能直接访问客户机,需要主机通过端口转发或者其他方式来访问。
我的简单配置(内核需要支持tap/tun):
(1)修改/etc/sysctrl.conf, 将net.ipv4.ip_forward=1打开,也就是ip转发功能打开,修改完后需要reboot机器。
(2)建立一个脚本/etc/kvm-ifup.sh,内容很简单:
#!/bin/bash sudo ifconfig $1 172.0.100.1 netmask 255.255.255.0 up
该脚本就是配置tap虚拟网卡设备的ip。$1通常会是tap0,根据你在kvm启动参数中给定的名字而定。
(3)在qemu启动参数中给定相关的虚拟网卡设备名,和相关的设备初始化脚本,也就是上面的这个脚本:
kvm -hda /virtualOS/winxp.img -m 512 -no-frame -localtime -no-acpi \ -net nic,model=virtio -net tap,ifname=tap0,script=/etc/kvm-ifup.sh \ -usb -usbdevice tablet
(4)在客户机中,手动的配置ip,网关和DNS,跟tap虚拟网卡的ip同一网段,而网关就是虚拟网卡的ip,比如我的xp配置:
IP: 172.0.100.101 MASK: 255.255.255.0 GATEWAY:172.0.100.1
(5)配置iptables的NAT:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
我是放在一个启动脚本里,每次启动kvm会执行一下,也可以在主机系统启动的时候就添加这条规则。
这种应该是功能最全的一种,虚拟客户机的ip和主机处在同一个网段,客户机就如局域网中的一台主机一样,既可以和主机通讯也可以上网,同时网路中的其他主机也可以访问客户机而不需要主机转发。
KVM仅支持 tap 或 tun 网卡设备,因此,我们需要安装创建TAP界面的工具
sudo apt-get install bridge-utils sudo apt-get install uml-utilities
kvm -net nic -net tap,ifname=tap0,script=/etc/kvm/kvm-ifup downscript=/etc/kvm/kvm-ifdown ,hostname=kvm-host
#!/bin/sh BRIDGE=br0 OLD_IF=eth0 ## 获取原来主系统 eth0 的 IP 和网关 IP=`ifconfig $OLD_IF|grep "inet addr"|awk '{print $2}'|sed 's/addr://'` GATEWAY=`route -n|grep ^0.0.0.0|awk '{print $2}'` ## 删除 eth0 的 IP ip addr del $IP dev $OLD_IF ## 激活 tap0 ($1 是qemu传递过来的网卡名称,即tap0) ip link set $1 up ## 停止并删除存在的网桥 ip link set $BRIDGE down &>/dev/null brctl delbr $BRIDGE &>/dev/null ## 添加网桥接口 br0 brctl addbr $BRIDGE ## 将 eth0 加入网桥 brctl addif $BRIDGE $OLD_IF ## 将 tap0 加入网桥 brctl addif $BRIDGE $1 ## 启动网桥 ifconfig $BRIDGE $IP up ## 添加默认路由 route add default gw $GATEWAY
#!/bin/sh BRIDGE=br0 OLD_IF=eth0 IP=`ifconfig $BRIDGE|grep "inet addr"|awk '{print $2}'|sed 's/addr://'` GATEWAY=`route -n|grep ^0.0.0.0|awk '{print $2}'` ## 停止并删除存在的网桥 ip addr del $IP dev $BRIDGE ip link set $BRIDGE down brctl delbr $BRIDGE ## 恢复原来的网络配置 ifconfig $OLD_IF $IP up route add default gw $GATEWAY
kvm [options] [disk_image]
-hda/-hdb file 使用 'file' 作为 IDE 硬盘 0/1 的虚拟磁盘。
-hdc/-hdd file 使用 'file' 作为 IDE 硬盘 2/3 的虚拟磁盘。
-cdrom file 使用 'file' 作为 IDE CD-ROM光盘镜像(文件应该是ISO类型)(不可以跟 -hdc 参数同时使用)。
-cdrom /dev/hdX 使用实体光驱机作为IDE CD-ROM,X为实际上光驱机从系统取得的代号(a,b,c or d)
-boot [a|d|c] 使用软盘a,光盘d,或者硬盘c启动.
-m memorysize 设定虚拟机器使用多少内存(预设为 128MB)。
-soundhw c1,... 开启音效支援,使用 -soundhw ? 列出可用的声卡,若要开启全部,请使用 -soundhw all。
-usb 允许使用usb设备.
-usbdevice 名字 添加一个usb设备“名字”.
-net nic 创建一块新的网卡.
-kernel-kqemu 开启 KQEMU 完全加速模式,预设则为 User Mode。
(AMD64 用户如果是自行编译 QEMU,必须使用 qemu-system-x86_64 才能带此参数)
预设会有网路(User Mode),并由 DHCP 自动发配 IP。其余参数及详细说明请自行参阅 KVM 的 Manual Page。
#-kernel-kqemu kvm -hda /var/cache/apt/arch.img \ -cdrom /home/geminis/sda10/soft/archlinux-2009.02-core-i686.iso \ -M pc -smp 2 -m 256 \ -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=/etc/kvm/kvm-ifup,downscript=/etc/kvm/kvm-ifdown,hostname=kvm-winxp \ -soundhw ac97 \ -localtime \ -clock rtc \ -usb \ -smb \ -usbdevice tablet -vnc 127.0.0.1:0 -redir tcp:3389::3389 \ -boot d \ -daemonize
此行命令表示:
hda 设定为 'arch.img' CD-ROM 设定为 'archlinux-2009.02-core-i686.iso' 机器类型为x86标准PC,2个CPU,内存为 256MB 网络为用户预设模式 开启 Sound Card 'ac97' 使用本地时间( 一定要加这个参数,不然虚拟机时间会有问题 ) 使用rtc时钟( 开启此项,有可能会导致window无法启动,酌情关闭 ) 开启USB支持 使用SMB文件共享 打开远程桌面支持,并把虚拟机的远程桌面服务器端口映射到宿主机的端口,等同于windows的远程桌面 从光驱开机 开启 KQEMU 完全加速模式 ( 如果是KVM直接运行,则不需要再加速 ) 后台运行(可以使用远程桌面控制,详见下面)
下一步是整合虚拟机到你的桌面,就和我的贴图一样,使用以下命令
rdesktop localhost:3389 -u danny -p xxxxxx -g 1024x720 -D -r sound:local
-u 后面的是用户名 -p 后面的是密码 -r sound:local 是启用声音 -D 是消除远程终端窗口的边框 -g 设置远程桌面的分辨率为1024x720
#suspend newvm #virt-clone --connect=qemu:///system -o vm1 -n vm2 --file=/home/xxx/vms/vm2.img --force --print-xml -d #resume newvm
编辑grub启动配置文件,添加
noapic nolapic nomce acpi=off echo on > /sys/devices/system/cpu/smt/control
开机进入BIOS配置,关闭APIC高级选项。不过,这种做法有可能会影响多系统中的其它系统。
去除 -clock rtc 或者 检查运行用户是否为 root
#Converting VMDK to Qemu image qemu-img convert -f vmdk myimage.vmdk -O qcow2 myimage.qcow2 #Converting VDI to Qemu image wget http://dhiru.kholia.googlepages.com/vditool.tar (for AMD64 systems) sudo tar xf vditool.tar -C /usr/lib/virtualbox LD_LIBRARY_PATH=/usr/lib/virtualbox /usr/lib/virtualbox/vditool COPYDD ~/.VirtualBox/VDI/myimage.vdi myimage.raw qemu-img convert -f raw myimage.raw -O qcow2 myimage.qcow2
qemu-img convert -f qcow2 myimage.qcow2 -O raw myimage.raw mount -o loop,offset=32256 myimage.raw /mnt
virbr0是用来做NAT转换的虚拟网卡,在有些环境下是不需要NAT的。因此,可以关闭virbr0
显示已经激活的网卡
# virsh net-list Name State Autostart ----------------------------------------- default active yes
禁用默认的网卡
# virsh net-destroy default # virsh net-undefine default # service libvirtd restart # ifconfig
| 硬件名称 | 型号 | 数量 | 单价 |
|---|---|---|---|
| CPU | XEON 2620+1U 散热器 | 2 | 2700 |
| 硬盘 | ST 300G SAS 15K.7 | 4 | 1150 |
| 内存 | 创见 8G DDR3 ECC 1333MHZ | 8 | 440 |
| 主机板 | INTEL S2600CP4/RKSASR5 | 1 | 4380 |
SAS控制器 -> MegaSAS控制器 MegaSAS配置为 Raid 5 Intel Virtualation Technique(如果不支持升级固件)
| 分区挂载点 | 文件系统 | 大小 |
|---|---|---|
| /boot | ext4 | 200M |
| swap | ext4 | 2000M |
| / | ext4 | 5G |
| /var/lib/libvirt/images | xfs | 100G |
Desktop Envirnoments -> Gnome Desktop Envirnoment Virtualization -> KVM (KVM里面的所有包全选)
#vi /etc/libvirt/qemu.conf #vnc_listen = "0.0.0.0" #/etc/rc.d/init.d/libvirtd start virt-install \ --connect qemu:///system --virt-type=kvm --accelerate --noapic --noacpi \ --name ubuntu12 --vcpus=1 --ram 512 --os-type=linux --os-variant=virtio26 \ --network bridge=br0 --cdrom=/root/ubuntu-12.10-server-amd64.iso --force \ --graphics type=vnc,listen=192.168.0.123,port=5901 \ --disk path=/var/lib/libvirt/images/ubuntu12.img,bus=virtio,size=10,io=native,format=qcow2,cache=writethrough
安装之后需要修改/boot/grub/menu.lst文件,因为默认为:
Red Hat Enterprise Linux Server (2.6.18-164.el5xen)
将开机默认加载改为:
Red Hat Enterprise Linux Server-base (2.6.18-164.el5)
/etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0 BOOTPROTO=static TYPE=Bridge IPADDR=192.168.1.238 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 ONBOOT=yes DELAY=0
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=none ONBOOT=yes BRIDGE=br0 MTU=9000
关闭不必要的服务 关闭防火墙 关闭SElinux 开启 vncserver(因为服务器运行在终端模式下,远程创建虚拟机)
[root@V1-Geminis-DEV test1]# rm -rf 1G;time dd < /dev/zero > 1G bs=1024 count=1000000 1000000+0 records in 1000000+0 records out real 0m17.366s user 0m0.154s sys 0m3.062s
[root@V1-Geminis-DEV test]# rm -rf 1G;time dd < /dev/zero > 1G bs=1024 count=1000000 1000000+0 records in 1000000+0 records out real 0m28.559s user 0m0.194s sys 0m2.974s
[root@Geminis-DEV ~]# iperf -c 192.168.1.244 -p 12345 -w 65535 -t 10 ------------------------------------------------------------ Client connecting to 192.168.1.244, TCP port 12345 TCP window size: 128 KByte (WARNING: requested 64.0 KByte) ------------------------------------------------------------ [ 3] local 192.168.1.137 port 54216 connected with 192.168.1.244 port 12345 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 112 MBytes 93.6 Mbits/sec
[root@V1-Geminis-DEV ~]# iperf -s -w 65536 -p 12345 ------------------------------------------------------------ Server listening on TCP port 12345 TCP window size: 128 KByte (WARNING: requested 64.0 KByte) ------------------------------------------------------------ [ 4] local 192.168.1.244 port 12345 connected with 192.168.1.137 port 54216 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.0 sec 112 MBytes 93.6 Mbits/sec
-bash-3.00# iperf -c 192.168.10.244 -p12345 -w65535 -t 10 ------------------------------------------------------------ Client connecting to 192.168.10.244, TCP port 12345 TCP window size: 128 KByte (WARNING: requested 64.0 KByte) ------------------------------------------------------------ [ 3] local 192.168.10.1 port 9953 connected with 192.168.10.244 port 12345 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 110 MBytes 91.9 Mbits/sec
[root@V1-Geminis-DEV test1]# iperf -s -w 65536 -p 12345 ------------------------------------------------------------ Server listening on TCP port 12345 TCP window size: 128 KByte (WARNING: requested 64.0 KByte) ------------------------------------------------------------ [ 4] local 192.168.10.244 port 12345 connected with 192.168.10.1 port 9953 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.0 sec 110 MBytes 91.8 Mbits/sec
网络传输中非常稳定,速率也很理想,有图为证
参考资料
Enable KSM - Kernel SamePage Merging
echo "1" > /sys/kernel/mm/ksm/run
If the purpose is to run as many VMs as possible, and performance is not an issue, KSM should be kept running. Which means maximum hardware usage efficiency. But, if a server is running with a relatively small amount of VMs and performance is an issue, KSM should be turned off.
一个原则,虚拟机CPU默认使用与宿主机相同的CPU类型(qemu -cpu host),但是你也可以虚拟CPU只支持几种特性,如(qemu -cpu qemu64,+ssse3,+sse4.1,+sse4.2,+x2apic)
cat /proc/cpuinfo | grep flags | uniq
KVM默认使用网络配置只考虑了兼容性,所以性能绝对不是最佳的。
强烈推荐利用宿主机的桥接设备 使用KVM virtio网络模型来匹配网络qemu -net nic,model=virtio,mac=… -net tap,ifname=…
宿主机使用elevator=deadline 虚拟机使用elevator=noopfor f in /sys/block/sd*/queue/scheduler; do echo "deadline" > $f; done
KVM提供cache=wirtethrough要比cache=writeback(aio=native)安全,但性能稍差 裸设备(RAW)性能要高于qcow2等文件类型 如果是RAW,关闭cache=none(aio=threads),减少数据拷贝和总线流量,) 不要使用默认的IDE模型,建议使用virtio模型qemu -drive file=/dev/mapper/Guest1,cache=none,if=virtio目前不支持BTRFS,会导致严重的IO堵塞!
EXT4/XFS 性能好于 EXT3 无论宿主机,虚拟机,设置 noatime,nodiratime要使用 mkfs.xfs 将您的新 XFS 文件系统配置成最佳性能,有两个选项。
第一个这样的选项是 -l size=32m ,它告诉 mkfs.xfs 配置您的文件系统使之拥有一个高达 32 MB 的元数据日志。这通过降低在文件系统处于繁忙使用期间元数据日志将“填满”的可能性而改善了性能。
第二个选项通过告诉 mkfs.xfs 将创建的分配组的数目最小化文件系统的性能。
通常,mkfs.xfs 自动选择分配组的数目,但是,根据我的经验,它通常会选择一个比大多数用于一般用途的 Linux 工作站和服务器过高一点的数目。分配组让 XFS 并行执行多个元数据操作。这为高端服务器带来了便利,但是太多的分配组确实会增加一些开销。因此,不要让 mkfs.xfs 为您的文件系统选择分配组的数目,而是通过使用 -d agcount=x 选项指定一个数目。将 x 设置成一个小数目,如 4、6 或 8。您需要使得您的目标块设备中每 4 GB 容量至少有一个分配组。同时进行这两项调整,使用下面的命令创建“优化的”XFS 文件系统:
# mkfs.xfs -d agcount=4 -l size=32m /dev/sdb既然已经创建了文件系统,您就可以挂装它了。挂装时,您将使用一些性能增强 mount 选项来最大程度地发掘出(或发挥出)您的新文件系统的性能。
# mount /dev/sdb /mnt -o noatime,nodiratime,osyncisdsync前面的两个 mount 选项关闭 atime 更新,几乎不需要 atime 更新,并且它除了降低文件系统性能之外几乎不起任何作用。 osyncisdsync 选项调整 XFS 的同步/异步行为,以便它同 ext3 更一致。多亏了我们的 mkfs.xfs 和 mount 调整,您的新 XFS 文件系统比没这么调整时的性能要好得多。
Best practice: Optimize block I/O performance by using the Deadline I/O scheduler
grep Huge /proc/meminfo HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
APIC 是装置的扩充组合用来驱动 Interrupt 控制器。在目前的建置中,系统的每一个部份都是经由 APIC Bus 连接的。
“本机 APIC” 为系统的一部份,负责传递 Interrupt 至指定的处理器;举例来说,当一台机器上有三个处理器则它必须相对的要有三个本机 APIC。自 1994 年的 Pentium P54c 开始Intel 己经将本机 APIC 建置在它们的处理器中。实际建置了 Intel 处理器的电脑就己经包含了 APIC 系统的部份。
系统中另一个重要的部份为 I/O APIC。系统中最多可拥有 8 个 I/O APIC。它们会收集来自 I/O 装置的 Interrupt 讯号且在当那些装置需要 interrupt 时传送讯息至本机 APIC。每个 I/O APIC 有一个专有的 interrupt 输入 (或 IRQ) 号码。Intel 过去与目前的 I/O APIC 通常有 24 个输入 – 其它的可能有多逹 64 个。而且有些机器拥有数个 I/O APIC,每一个分别有自己的输入号码,加起来一台机器上会有上百个 IRQ 可供装置 Interrupt 使用。
[root@SA-KVM ~]# login as: root root@192.168.0.253's password: Last login: Wed May 11 20:12:48 2011 /usr/bin/xauth: creating new authority file /root/.Xauthorityyum groupinstall “X Window System”
export DISPLAY=0.0
yum install -y libfonts.x86_64 xorg-x11-fonts-Type1.noarchsudo virt-manager 报错的快速解决方法
X11 connection rejected because of wrong authentication. Traceback (most recent call last): File "/usr/share/virt-manager/virt-manager.py", line 383, in <module> main() File "/usr/share/virt-manager/virt-manager.py", line 286, in main raise gtk_error RuntimeError: could not open display使用 mkxauth 命令将ssh登陆的用户的 Xauthority 信息加入到 root 用户的/root/.Xauthority 文件中
$ssh -X bitbi@mybitbihost $sudo mkxauth -m bitbi merging /home/bitbi/.Xauthority into /root/.Xauthority ... done $sudo virt-manager下面运行 sudo virt-manager 命令就正常了。
或者更换display端口, /etc/profile
export DISPLAY=localhost:10.0