如何使用 SLES11 自带的 KVM 虚拟软件在 IBM Ssystem x 上创建虚拟机
简介: 虚拟化技术已经成功的被用于基于 POWER 构架的 IBM Power 服务器。如何在基于 x86 处理器 IBM System x 系列服务器应用虚拟化技术呢?最新的 Intel VT(Virtualization Technology)和 AMD SVM(安全虚拟机 , Secure Virtual Machine,也叫 AMD-V)从硬件上支持了虚拟技术。 KVM 正是利用了 x86 硬件虚拟化特性,实现了虚拟机性能的最优化。本文详细介绍了在 IBM System x3500 上使用 SLES11 和 KVM 虚拟化技术,如何安装配置了多台虚拟机,并对虚拟机的性能做了初步的优化。
IBM System x 系列服务器基于 Intel 和 AMD 的 x86 构架,支持 Windows 和 Linux 平台。
SLES(SUSE Linux Enterprise Linux)是 Novell 公司开发的针对企业级应用的操作系统。可以运行在 IBM x, p ,z 系列服务器上。 Novell 于 2009 年 4 月发布了 SUSE Linux Enterprise 11,基于 Linux kernel 2.6.27,已经支持了 KVM,并且还收录了 KVM 的用户管理程序 kvm-qemu 。
什么是 KVM ?
KVM 是指基于 Linux 内核的虚拟机(Kernel-based Virtual Machine)。 2006 年 10 月,由以色列的 Qumranet 组织开发的一种新的“虚拟机”实现方案。 2007 年 2 月发布的 Linux 2.6.20 内核第一次包含了 KVM 。增加 KVM 到 Linux 内核是 Linux 发展的一个重要里程碑,这也是第一个整合到 Linux 主线内核的虚拟化技术。
KVM 在标准的 Linux 内核中增加了虚拟技术,从而我们可以通过优化的内核来使用虚拟技术。在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可以在用户空间启动客户机操作系统。一个普通的 Linux 进程有两种运行模式:内核和用户。 KVM 增加了第三种模式:客户模式(有自己的内核和用户模式)。图 1 展示了 KVM 虚拟化的原理图。
图 1. KVM 原理图
一个典型的 KVM 安装包括以下部件:
- 一个管理虚拟硬件的设备驱动,这个驱动通过一个字符设备 /dev/kvm 导出它的功能。通过 /dev/kvm 每一个客户机拥有其自身的地址空间,这个地址空间与内核的地址空间相分离或与任何一个正运行着的客户机相分离。
- 一个模拟硬件的用户空间部件,它是一个稍微改动过的 QEMU 进程。从客户机操作系统执行 I/O 会拥有 QEMU 。 QEMU 是一个平台虚拟化方案,它允许整个 PC 环境(包括磁盘、显示卡(图形卡)、网络设备)的虚拟化。任何客户机操作系统所发出的 I/O 请求都被拦截,并被路由到用户模式用以被 QEMU 过程模拟仿真。
KVM 在 IBM System x 上的安装
如何确认处理器含有 Intel VT 或 AMD-V 技术
基于 Intel 处理器的系统,运行 grep vmx /proc/cpuinfo 查找 CPU flags 是否包括 vmx 关键词
linux-gwsa:~ # grep vmx /proc/cpuinfo |
基于 AMD 处理器的系统,运行 grep svm /proc/cpuinfo 查找 CPU flags 是否包括 svm 关键词
linux-gwsa:~ # grep svm /proc/cpuinfo
注 : 一些厂商禁止了机器 BIOS 中的 VT 选项 , 这种方式下 VT 不能被重新打开。/proc/cpuinfo 仅从 Linux 2.6.15(Intel) 和 Linux 2.6.16(AMD) 开始显示虚拟化方面的信息 . 请使用 uname -r 命令查询您的内核版本。
如有疑问 , 请联系硬件厂商。
运行 KVM,你需要一台运行 2.6.20 以上 Linux 内核的 Intel 处理器(含 VT 虚拟化技术)或 AMD 处理器(含 SVM 安全虚拟机技术的 AMD 处理器)。下面将详细介绍如何在装有 SLES11(kernel-2.6.27.19)的 IBM System x3550 上安装和配置基于 KVM 的虚拟机。
硬件环境
本文的实例中,硬件选用了 IBM System x3500,处理器是 Intel 至强 4 核 X5160,最高主频 3.00GHz,内存 16GB,存储为 8 块 73GB 高速硬盘,集成双千兆以太网卡。虚拟化可以使这些资源得到充分的利用。
清单 1. 硬件配置
|
软件环境
Novell 于 2009 年 4 月发布了 SUSE Linux Enterprise 11,它可运行于各种领先的硬件平台,包括 x86-32、x86-64、IBM POWER 和 IBM System z 。 SUSE Linux Enterprise 11 基于 Linux kernel 2.6.27,已经支持了 KVM,并且还收录了 KVM 的用户管理程序 kvm-qemu 。
清单 2. 软件配置
|
配置客户机的参数设置
使用 qemu-kvm 安装客户机之前,需要配置客户机的虚拟硬件参数:
表 1. qemu-kvm 的参数说明
qemu-kvm 参数 | 参数说明 | 参数实例 |
-mmegs | 分配给客户机的内存 (MB 为单位 ) | 0 |
-smpn | 模拟包含 n 个处理器的 SMP system(对称多处理器系统) | 4 |
-hdafile | 指定 file 文件作为客户机的存储镜像 hard disk 0 这里 file 可以是一个文件名,也可以是硬盘分区。区别见 Tips:调整客户机的镜像文件 | /home/kvm.img |
-net nic[,vlan=n][,macaddr=addr][,model=type] | 为客户机创建虚拟的 NIC(Netowrk Interface Card 网络接口设备), 设置 MAC 地址,虚拟网卡类型等 | model=e1000, macaddr=00:16:3e:51:fb:ce |
-net tap[,vlan=n][,fd=h][,ifname=name][,script=file] | 为客户机设置 TAP 网络连接,具体见 客户机网络设置 | -net tap |
-cdrom | 挂载 ISO 镜像到客户机,光盘启动客户机时必须加载 | /mnt/SLES10SP2.iso |
-boot [a|c|d|n] | 设置客户机的启动选项(软盘 a,硬盘 c,光盘 d,网络 n),默认从硬盘镜像启动 | d |
-vncdisplay | 通过 VNC 的方式远程安装 | 9.123.99.34:3 |
把上面的参数串在一起就是安装 KVM 虚拟机的命令,见清单 2 。
清单 3. 安装客户机的命令
|
安装第一台客户机
在 xWindow 中输入清单 3 中的命令,或者通过 VNC 远程连接,显示图 2 中的客户机安装界面:
图 2. 客户机启动界面
选择 3 从光盘启动,进入大家熟悉的 Linux 安装步骤。本例中添加了网络安装的参数,这样将从网络安装客户机。
图 3. 引导安装 Linux 系统
图 4. 网络下载安装文件
从网络下载了安装程序后进入 YAST 安装界面,余下的步骤和在物理机上安装 SLES 一样。
第二台客户机的安装以第一台稍有不同,主要是网络上的设置和资源的分配。下节中将详细介绍客户机的网络设置。
启动 KVM 虚拟机
客户机安装完成后,需要为其设置网络接口,以便和主机网络,客户机之间的网络通信。事实上,如果要在安装时使用网络通信,需要提前设置客户机的网络连接。
KVM 客户机网络连接有两种方式:
- 用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。
- 虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。
本文选用了虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。
本例中的客户机网络设置
本例中 IBM System x3500 有两块千兆以太网卡,一块网卡连接外网的 9.123.99.x 网段,一块网卡连接内网 192.168.0.x 网段。本例采用虚拟网桥的连接方式使客户机能够同时自由访问两个网段。
图 5. IBM System x3500 的网络结构
清单 4. 配置 eth0 设备
|
清单 5. 配置网桥 br0
|
网桥 br0 应该获得 IP 地址(静态或 DHCP),同时物理的 eth0 必须不配置 IP 地址。重新启动网络后,主机的网络设备列表如清单 6 所示:
清单 6. 主机的网络设备列表
|
此外,需要一个包含如下内容的 qemu-ifup 脚本,作为客户机的网络配置脚本。/etc/qemu-ifup
是默认的客户机网络配置文件,如果使用其他名字或拷贝到其他位置,请用script=file
参数指定。
清单 7. 客户机网络配置脚本
|
主机上如果有多台客户机使用网络,每个客户机必须有不同的 MAC 地址,所以需要在网络参数中为每个客户机指定不同的 MAC 地址。以下脚本可以自动生成 MAC 地址(执行 Python 脚本需要系统安装了 python 解释器)。
清单 8. 生成 MAC 地址的代码
|
清单 9. 启动客户机的命令
|
在 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
|
第二台客户机的安装和使用
有了第一台客户机的安装经验,我们很容易安装更多的客户机在同一主机上,当然要在硬件资源足够的情况下。安装多台客户机时,需要注意以下几点:
- 使用不同的存储镜像。就是为 -hda 的设定不同的文件或分区。
- 使用不同的 MAC 地址。为了避免网络冲突,客户机的 MAC 地址要唯一。
实例:在第二台客户机上安装 SLES11
由于我们在安装第一台客户机时,使用了虚拟网桥,而且在客户机的网络配置脚本/etc/qemu-ifup
具有可扩展性,所以安装第二台客户机时不用改动任何脚本,只需要配置不同的存储镜像和 MAC 地址。
清单 11. 安装 SLES11
|
安装完成并启动第二台客户机,我们可以查看它的网络状况,如图 8 。
图 8. 安装了 virto 网络模块客户机
可以看出,客户机获得了 IP 地址 192.168.0.181,识别并加载了 qemu-kvm 虚拟的网卡模块 virtio 。为了测试网络速度,从外网的一台机器上用 scp 下载文件,下载速度平均为 11.1 MB/s 。速度几乎与物理网卡一样。细心的读者可能发现了两台客户机的网络性能有着巨大的差异,请参见下一节:调整客户机的网络性能。
这时主机上同时运行着两台虚拟机,他们的网络结构正如图 5 所示。在主机上的网络设备列表如清单 12 。
清单 12. 主机的网络设备列表 2
|
后面的 tapX 是不同的虚拟机的接口,这里可以看出,所有的虚拟接口和 eth0 加入到了网桥。这样客户机就能够通过桥接访问主机上的网络。
调整 qemu-kvm 参数提高客户机性能
KVM 作为内核虚拟机,利用了处理器的硬件虚拟功能,性能上已经比其他的虚拟机高很多。但是 qemu-kvm 有复杂的参数,仔细调整这些参数可以使客户机的性能更上一层楼。
调整客户机的镜像文件
安装客户机时,存储镜像默认基于文件。在主机上看来就是一个很大的镜像文件。文件的方式容易设置而且比较灵活,可以存放在主机文件系统之上。但是如果客户机上进行高负荷的磁盘操作,映射到主机上这个单独的镜像文件时,性能必然受到很大影响。存储镜像的另外一个选择就是直接分配硬盘分区给客户机。如果资源允许,单独分配一块物理硬盘给每个客户机。一是客户机的磁盘操作不需要经过主机的文件系统,减少了主机文件系统的性能损耗;二是单独的硬盘分区 I/O 性能必定比单独的文件高。
本文的示例中,两台客户机都选者了使用单独的硬盘作为存储。
调整客户机的网络性能
从 manpage 可知,qemu-kvm 支持多种虚拟的网络设备模块。
清单 13. 虚拟网络设备的 manpage
|
本文实例中,如果不指定虚拟网络设备模块时,默认的客户机网络模块是 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 客户机的网络性能也可以大大提高了。
小结
本文介绍了在装有 SLES11 的 IBM System x 服务器上安装 KVM 虚拟机的方法。并且初步尝试了如何提高虚拟机的性能。 KVM 虚拟机同其他虚拟技术相比,如 Xen,VMware,VirtualBox 相比,结构更加精简、代码量更小,占用内存很少,与内核集成,性能更胜一筹。
KVM 是一个全虚拟化的解决方案。可以在 x86 架构的计算机上实现虚拟化功能。但 KVM 需要 CPU 中虚拟化功能的支持,只可在具有虚拟化支持的 CPU 上运行,即具有 VT 功能的 Intel CPU 和具有 AMD-V 功能的 AMD CPU 。