Linux/OSS 方式的虚拟化
我只是个命令行爱好者。我不喜欢在服务器上运行 GUI,因为它会占用资源并可能暴露安全问题。秉持着偏爱简洁和经济的理念,我也相当节俭。我不喜欢支付不必要的费用。我听到 IT 领域的同行讨论他们环境的复杂性以及他们在虚拟化解决方案上花费了多少钱,他们摇头表示对彼此的虚假同情,而吹嘘的权利则归于拥有规模最大、最复杂、最昂贵环境的人。与此同时,我礼貌地倾听,直到我最终插话说:“我的虚拟化解决方案是免费的,并且可以通过命令行管理。哦,我有没有提到,我们的初创公司刚刚开始盈利。” 然后就出现了茫然的目光。
作为自由开源软件益处的坚定信徒,我更喜欢纯 FOSS 软件,或者至少有开源版本可用的软件,即使某些高级功能仅在付费版本中提供。我认为随着时间的推移,这会产生更优秀的软件,并且我有一个安全网,这样我的命运就不会完全掌握在一个商业实体手中。由于所有这些原因,我使用 VirtualBox 作为我组织中的主要虚拟化软件。这个选择是在 Sun(收购了 VirtualBox 的创建者 Innotek)被 Oracle 收购之前做出的,而 Oracle 也刚刚收购了另一家虚拟化提供商,并且多年来投入了大量精力开发基于 Xen 的解决方案,这使得 VirtualBox 的未来陷入了不确定性。
关于 Oracle/Sun 将如何处理虚拟化的许多细节仍然悬而未决,但情况看起来很有希望。Xen 虽然优雅并且提供了其他虚拟化方法无法比拟的性能,但在支持打包解决方案和跟上其他解决方案的功能方面,已被证明有点令人失望。自从收购 Sun 以来,VirtualBox 已经发布了许多 3.0.x 维护版本,beta 版本 (3.1) 正式化为 3.2.0,并且此后发布了两个维护版本,在我们撰写本文时达到了 3.2.4。我从一位参与该项目的开发人员那里得知,VirtualBox 每天的下载量为 40,000 次,仍然是 Oracle/Sun 产品组合中最受欢迎的软件之一。请参阅“资源”部分,其中包含指向 Oracle VirtualBox 博客的链接,Oracle 在该博客中正式宣布 VirtualBox 为 Oracle VM 产品。事实上,将这种有价值的商品扔进垃圾桶是没有意义的,因为 VirtualBox 还很年轻,但在许多方面都与虚拟化领域的巨头 VMware 相媲美。VirtualBox 性能良好、可靠且易于管理。要获得最新版本 VirtualBox 中的所有功能,您必须为 VMware 的顶级产品花费一大笔钱。
我们的两个主要 VirtualBox 主机每个主机都有两个四核 CPU,48GB 内存,以及十个 SATA2 10K RPM 硬盘驱动器,采用 RAID 0+1 配置,运行 x86_64 内核。根据初步测试,我预计我们可以在此硬件上运行大约 10-15 个虚拟机,但令我惊讶的是,我们目前每个主机上运行了 20 个虚拟机,并且还在增加,还有剩余空间。我为每个虚拟机分配一个 CPU,这使其一次只占用一个 CPU 核心,并尽可能少地分配内存,如果性能需要,则增加内存。使用这种方法,我们实现了一个环境,如果您不知道这些机器是虚拟的,您就无法分辨这些机器不是在专用硬件上运行。一个主机的平均负载很少超过 1.0(15 分钟平均值),另一个主机的平均负载很少超过 2.0,因此我们仍然有一些剩余空间。我现在认为,如果有足够的内存,我们每个主机可能可以运行 30 个或更多虚拟机,甚至可能更多。
我在 Ubuntu Server 上运行 VirtualBox,这是我们出于历史原因标准化的。我们目前使用的是 VirtualBox 的 3.0.x 分支,并且正在测试升级到 3.2。不幸的是,Ubuntu 上仍然没有 VirtualBox 的“非 GUI”软件包,因此在不安装 Xorg 和 Qt 软件包的情况下安装它需要使用--force-depends选项来运行 dpkg(或您系统上的等效选项)。OSE(开源版)版本可以通过标准存储库中的 apt-get 获得,但我建议直接下载最新版本。我向您展示了我上次升级生产系统时安装的最新稳定版本,但要获得所有最新功能,例如将虚拟机传送到其他主机,您需要使用最新的 3.2.x 版本
loc=http://download.virtualbox.org/virtualbox/3.0.14/ wget $loc/virtualbox-3.0_3.0.14-58977_Ubuntu_karmic_amd64.deb # or appropriate package for your distro/architecture dpkg -i --force-depends \ virtualbox-3.0_3.0.14-58977_Ubuntu_karmic_amd64.deb
dpkg 会抱怨缺少依赖项。您可以忽略大多数依赖项,但您需要满足非 GUI 依赖项才能获得完整功能。在此之后,您会发现当您需要通过 apt 实用程序安装或升级软件包时,它会抱怨依赖项损坏,并且在您解决问题之前拒绝执行任何操作。我通过关闭主机上的所有虚拟机,在另一台主机上启动必要的虚拟机,卸载 virtualbox 软件包,执行升级或安装,然后重新安装来解决这个问题。这是一个额外的步骤,需要几分钟时间,但在您的生产虚拟化主机上,您可能不会经常这样做,因为它应该具有最少的启动所需软件包
dpgk -r VirtualBox-3.0.14 apt-get update apt-get upgrade dpkg -i --force-depends \ virtualbox-3.0_3.0.14-58977_Ubuntu_karmic_amd64.deb
一旦安装完成,所有内容都通过命令行公开。事实上,GUI 只是 CLI 可用功能的一个子集。目前,端口转发配置和内置 iSCSI 启动器的使用只能通过 CLI 完成(不能通过 GUI 完成)。尝试输入以下内容并按 Enter 键,即可获得一些未公开的好处,这些好处为我节省了许多时间和麻烦
VBoxManage internalcommands
通过键入部分命令获得的用法信息非常详尽,并且可用功能的全面性允许进行许多自定义和节省时间的脚本编写。我已经编写了所有重复性工作的脚本,从创建新虚拟机到重启那些在一个月左右的运行时间后变得麻烦的虚拟机。您不仅可以编写 shell 脚本,而且 VirtualBox 还有一个 Python 接口,并且示例脚本 vboxshell.py 随标准发行版一起提供。
关于效率和性能的一些注意事项 - 您最好设置一个“模板”虚拟机安装,其中包含您的各种操作系统的环境配置,用于身份验证、日志记录、网络以及任何其他必要的共性。您还需要添加性能增强功能,例如,添加divider=10到 GRUB 内核配置,生成如下所示的行
kernel /vmlinuz-2.6.18-164.el5 ro \ root=/dev/VolGroup01/LogVol00 rhgb quiet divider=10
这需要在您的环境中进行一些实验,但大多数系统都设置为 1,000Hz 时钟周期。即使在具有空闲客户机系统的主机上,仅为了检查中断而发生的上下文切换次数也可能导致主机负载过高。此启动时参数会将时钟频率除以 10,从而将上下文切换次数也减少十分之一,并大大降低主机负载。这可能不适用于所有工作负载类型,但在不产生不可接受的性能的客户机上运行它将整体加速系统并加速您的大部分客户机。
请考虑清单 1 中的示例脚本。与我编写的大多数脚本一样,它既快速又简陋,但如果您遵循此示例,您将拥有一个基本的基础架构,您可以使用该基础架构快速配置和操作几乎无限数量的虚拟服务器。它不接受命令行上的变量或输入,而是在内部提供信息,但可以轻松修改以允许通过命令行开关传递参数。假设您需要基于基本磁盘映像启动许多虚拟机。您将为虚拟机提供顺序 IP 和主机名。示例脚本有一些您必须满足的先决条件。首先,您要使用的磁盘映像必须是固定大小,而不是动态分配的。如果您有要使用的动态 .vdi,请首先使用 clonehd 转换它
VBoxManage clonehd dynfile.vdi statfile.vdi --variant Fixed
接下来,您需要 mount_vdi 脚本(请参阅“资源”部分),该脚本本身非常方便,因为它将 .vdi 文件挂载为 .iso 或原始磁盘映像。并且,您需要能够通过 sudo 执行它才能创建和挂载环回设备。我编辑了 mount_vdi.sh 脚本,注释掉了告诉您键入 end 以卸载并退出脚本的行,以及脚本中实际执行此操作的最后几行,将这些功能移动到顶层脚本中。您也需要对清单 1 中的脚本执行相同的操作才能使其工作。在您测试了 mount_vdi.sh 脚本后,将清单 1 中的脚本中它的路径更改为主机系统上的相应路径。
为本特定脚本的目的所做的假设包括以下内容:您正在运行相当新的 Ubuntu 作为主机和客户机,并使用 VirtualBox 3.0.x(我在生产环境中运行的版本);.vdi 文件位于脚本所在的当前工作目录中;系统上没有环回设备 (/dev/loopx);根分区是虚拟磁盘上的第一个分区;基本 vdi 映像上的主机名是 basicsys.example.com;它有一个以太网接口,IP 地址为 1.1.1.1,默认网关为 1.1.1.2。如果您将 virtualbox 用户设置为具有无密码 sudo 权限(至少暂时),脚本将不那么痛苦,尤其是在测试期间。我现在已经在多个系统上测试了该脚本,并且 .vdi 年龄和格式略有不同,因此我有理由相信它适用于各种环境。请注意;我发现我现在正在测试的 VirtualBox 3.2.x 需要进行一些更改。如果您遇到问题并解决了它,请给我发送电子邮件到我的个人简介中的地址,并告诉我,以便我可以改进脚本以供后代使用。
清单 1. 创建多个虚拟机的脚本
#! /bin/bash # A quick and dirty script to create multiple virtual machines, # give them unique hostnames and IP addresses, and culminate in # bringing them on-line. # name of the directory where we'll mount our vdi's dir=temp rootdir=`pwd`/$dir # the basename for the vms basename=vbox-vm- # the file that contains the basic disk image basevdi=base.vdi # how many images are we making number=2 # what subnet will these guests be going on IPnetwork='10.7.7.' gateway='10.7.7.1' # the start of the address range we will use baseIP=10 # amount of memory these guests will get in Mbytes memory=512 # base VRDP port baseRDP=16001 counter=1 while [ $counter -le $number ] do echo $basename$counter $basename$counter.vdi \ $IPnetwork$baseIP $memory VBoxManage clonehd `pwd`/base.vdi \ `pwd`/$basename$counter.vdi --variant Fixed sudo mount_vdi/mount_vdi.sh $basename$counter.vdi $rootdir 1 sudo sed -i "s/basicsys/$basename$counter/g" $rootdir/etc/hosts sudo sed -i "s/basicsys/$basename$counter/g" $rootdir/etc/hostname sudo sed -i "s/1.1.1.2/$gateway/g" $rootdir/etc/network/interfaces sudo sed -i "s/1.1.1.1/$IPnetwork$baseIP/g" \ $rootdir/etc/network/interfaces sudo rm $rootdir/etc/udev/rules.d/70-persistent-net.rules sudo touch $rootdir/etc/udev/rules.d/70-persistent-net.rules sudo umount $rootdir sudo losetup -d /dev/loop1 sudo losetup -d /dev/loop0 VBoxManage createvm --name $basename$counter --register VBoxManage modifyvm $basename$counter --pae on --hwvirtex on VBoxManage modifyvm $basename$counter --memory $memory --acpi on VBoxManage modifyvm $basename$counter \ --hda `pwd`/$basename$counter.vdi VBoxManage modifyvm $basename$counter \ --nic1 bridged --nictype1 82540EM --bridgeadapter1 eth0 VBoxHeadless --startvm $basename$counter -p $baseRDP & sleep 5 baseRDP=$((baseRDP + 1)) baseIP=$((baseIP + 1)) counter=$((counter + 1)) done
如果您使此脚本正常工作,那么您将很快拥有支持可管理、灵活、经济高效、强大的虚拟化环境的基础架构。就我个人而言,我期待着部署 3.2.x 版本,并且能够从命令行实时地在主机之间传送正在运行的机器以管理工作负载。请继续关注,我的下一篇文章将讨论后端共享存储(基于开放协议和免费开源软件,同时具有冗余性和高性能)。我打算连接我的虚拟化主机以支持能够
VBoxManage controlvm vbox-vm-3 \ teleport --host vbox-host-2 --port 17001
资源
Oracle 虚拟化博客:blogs.oracle.com/virtualization
mount_vdi:www.mat.uniroma1.it/~caminati/mount_vdi.html
Bill Childers 的“虚拟化对决:VMware Server vs. VirtualBox vs. KVM”,LJ,2009 年 11 月:www.linuxjournal.com/article/10528
Greg Bledsoe 是杰出的 VoIP 初创公司 Aptela (www.aptela.com) 的技术运营经理,同时也是一位作家、丈夫、六个孩子的父亲、葡萄酒爱好者、业余哲学家和万事通,欢迎您在 lj@bledsoehome.net 发表评论和批评。