在 xWindow 中运行启动客户机的命令后,选择从硬盘启动。看到如图 6 的 grub 选项。
图 6. 启动已安装的客户机
登陆客户机的 xWindow,测试网络连接状况。从图 7 看出,客户机获得了 IP 地址 192.168.0.158,识别了 qemu-kvm 虚拟的千兆网卡 Intel e1000 网络模块。为了测试网络速度,从外网的一台机器上用 scp 下载文件,下载速度平均为 5.1 MB/s 。
图 7. 客户机的网络状态
启动一台客户机后,主机上多出了一个 tap0 虚拟网络设备,这就是 qemu-kvm 为客户机虚拟的 TAP 网络设备。查看网桥可以看出 tap0 加入了网桥 br0 。客户机就是通过网桥访问的外网。
清单 10. 主机的网络设备列表 1
linux-gwsa:~ # ifconfig tap0 tap0 Link encap:Ethernet HWaddr EA:FC:99:17:F3:A5 inet6 addr: fe80::e8fc:99ff:fe17:f3a5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:220322 errors:0 dropped:0 overruns:0 frame:0 TX packets:342093 errors:0 dropped:0 overruns:11 carrier:0 collisions:0 txqueuelen:500 RX bytes:21559069 (20.5 Mb) TX bytes:479156726 (456.9 Mb) linux-gwsa:~ # brctl show bridge name bridge id STP enabled interfaces br0 8000.001a644887b6 no eth0 tap0 |
第二台客户机的安装和使用
有了第一台客户机的安装经验,我们很容易安装更多的客户机在同一主机上,当然要在硬件资源足够的情况下。安装多台客户机时,需要注意以下几点:
- 使用不同的存储镜像。就是为 -hda 的设定不同的文件或分区。
- 使用不同的 MAC 地址。为了避免网络冲突,客户机的 MAC 地址要唯一。
实例:在第二台客户机上安装 SLES11
由于我们在安装第一台客户机时,使用了虚拟网桥,而且在客户机的网络配置脚本/etc/qemu-ifup具有可扩展性,所以安装第二台客户机时不用改动任何脚本,只需要配置不同的存储镜像和 MAC 地址。
清单 11. 安装 SLES11
使用硬盘分区作为客户机存储,从光盘启动,设置 TAP 网络,通过 VNC 远程安装: linux-gwsa:~ # qemu-kvm -m 4096 -smp 4 -hda /dev/sdc1 -net nic,model=virtio, \n macaddr=00:16:3e:55:83:c3 -net tap -cdrom /mnt/SLES11.iso -boot d -vnc 9.123.99.34:5 启动第二台客户机 linux-gwsa:~ # qemu-kvm -m 8192 -smp 4 -hda /dev/sdc1 -net nic,model=virtio, \n macaddr=00:16:3e:55:83:c3 -net tap -vnc 9.123.99.34:5 |
安装完成并启动第二台客户机,我们可以查看它的网络状况,如图 8 。
图 8. 安装了 virto 网络模块客户机
可以看出,客户机获得了 IP 地址 192.168.0.181,识别并加载了 qemu-kvm 虚拟的网卡模块 virtio 。为了测试网络速度,从外网的一台机器上用 scp 下载文件,下载速度平均为 11.1 MB/s 。速度几乎与物理网卡一样。细心的读者可能发现了两台客户机的网络性能有着巨大的差异,请参见下一节:调整客户机的网络性能。
这时主机上同时运行着两台虚拟机,他们的网络结构正如图 5 所示。在主机上的网络设备列表如清单 12 。
清单 12. 主机的网络设备列表 2
l inux-gwsa:~ # ifconfig -s Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg br0 1500 0 703127 0 0 0 346383 0 0 0 BMRU eth0 1500 012819806 0 0 0 7691669 0 0 0 BMPRU eth1 1500 0 5532987 0 0 0 5500852 0 0 0 BMRU lo 16436 0 187413 0 0 0 187413 0 0 0 LRU tap0 1500 0 2288413 0 0 0 1235382 0 0 11 BMRU tap1 1500 0 56615 0 0 0 125450 0 0 0 BMRU linux-gwsa:~ # brctl show bridge name bridge id STP enabled interfaces br0 8000.001a644887b6 no eth0 tap0 tap1 |
后面的 tapX 是不同的虚拟机的接口,这里可以看出,所有的虚拟接口和 eth0 加入到了网桥。这样客户机就能够通过桥接访问主机上的网络。
调整 qemu-kvm 参数提高客户机性能
KVM 作为内核虚拟机,利用了处理器的硬件虚拟功能,性能上已经比其他的虚拟机高很多。但是 qemu-kvm 有复杂的参数,仔细调整这些参数可以使客户机的性能更上一层楼。
调整客户机的镜像文件
安装客户机时,存储镜像默认基于文件。在主机上看来就是一个很大的镜像文件。文件的方式容易设置而且比较灵活,可以存放在主机文件系统之上。但是如果客户机上进行高负荷的磁盘操作,映射到主机上这个单独的镜像文件时,性能必然受到很大影响。存储镜像的另外一个选择就是直接分配硬盘分区给客户机。如果资源允许,单独分配一块物理硬盘给每个客户机。一是客户机的磁盘操作不需要经过主机的文件系统,减少了主机文件系统的性能损耗;二是单独的硬盘分区 I/O 性能必定比单独的文件高。
本文的示例中,两台客户机都选者了使用单独的硬盘作为存储。
调整客户机的网络性能
从 manpage 可知,qemu-kvm 支持多种虚拟的网络设备模块。
清单 13. 虚拟网络设备的 manpage
Network options: -net nic[,vlan=n][,macaddr=addr][,model=type] Create a new Network Interface Card and connect it to VLAN n (n = 0 is the default). The NIC is an rtl8139 by default on the PC target. Optionally, the MAC address can be changed. If no -net option is specified, a single NIC is created. Qemu can emulate several different models of network card. Valid values for type are "i82551", "i82557b", "i82559er", "ne2k_pci", "ne2k_isa", "pcnet", "rtl8139", "e1000", "smc91c111", "lance" and "mcf_fec". Not all devices are supported on all targets. Use -net nic,model=? for a list of available devices for your target. |
本文实例中,如果不指定虚拟网络设备模块时,默认的客户机网络模块是 rtl8029 。这是一块老式的 10M 全双工网卡。客户机上网络连接不稳定,从千兆网络通过 scp 下载速度最高才 300KB/s 。
第一台客户机上,我为其配置了常见的 intel e1000 千兆网络模块作为虚拟网络设备。客户机的网络非常稳定,从千兆网络通过 scp 下载速度最高达到 5.4MB/s(见图 7)。但是距离实际千兆网卡的性能还有一定差距。
第二台客户机上,我为其配置了 VirtIO Paravirtual 虚拟设备。客户机的网络非常稳定,从千兆网络通过 scp 下载速度最高达到 11MB/s(见图 8),几乎与千兆物理网卡的性能一样。
表 2. 虚拟网络模块的性能差异
虚拟网络模块 | 网络传输速度(ssh) | 客户机操作系统 | 网络状态 |
rtl8029 | 200-300KB/s | SLES10SP2 (kernel 2.6.16-60) | 不稳定 |
e1000 | 4.8-5.4MB/s | SLES10SP2 (kernel 2.6.16-60) | 稳定 |
virtio | 10.6-11.1MB/s | SLES11 (kernel 2.6.27-19) | 稳定 |
VirtIO paravirtual 是 Linux 虚拟机平台上统一的虚拟 IO 接口驱动。通常主机为了让客户机像在真实环境中一样运行,需要为客户机创建各式各样的虚拟设备,如磁盘,网卡,显卡,时钟,USB 等。这些虚拟设备大大降低了客户机的性能。如果客户机不关注这些硬件设备,就可以用统一的虚拟设备代替他们,这样可以大大提高虚拟机的性能。这个统一的标准化接口在 Linux 上就是 VirtIO 。需要注意的是 VirtIO 运行在 kernel 2.6.24 以上的版本中才能发挥它的性能优势。另外 KVM 项目组也发布了 Windows 平台上的 VirtIO 驱动,这样 windows 客户机的网络性能也可以大大提高了。