开源 OpenStack 云操作系统是一个功能丰富且可以大规模扩展的平台,适用于所有类型的云计算。一些公共云服务基于 OpenStack,许多组织内的私有云实现也是如此。但 OpenStack 仍缺乏一些针对私有云的特性,尤其是针对开发和测试环境的特性。例如,映像构建就不是一个简单的过程。本文为 OpenStack 私有云提供一种全新且改进的映像创建方法。我们在 QEMU/KVM 平台上验证了这种新方法,但在理论上该方法也适用于其他虚拟机管理程序平台。
介绍这个新方法之前,我们将概述目前在 OpenStack 中如何创建映像。
目前在 OpenStack 中创建映像的方式
在 OpenStack 中创建 Linux 或 Windows 映像的过程由多个耗时的步骤组成。
基于 Linux 的映像
官方 OpenStack 虚拟机映像指南 详细介绍了 7 种 要求,必须满足这些要求,基于 Linux 的映像才能在 OpenStack 云中完全正常工作(可通过安装 cloud-init 包来满足一些要求)。该映像指南建议用户在创建自己的映像之前阅读指南中很长一节的内容,确保映像支持他们计划使用的 OpenStack 特性。
对于一些特定的发行版,可手动或使用工具创建 Linux 映像 — 比如 VMBuilder、Oz 或 imagefactory。无论使用哪种方法,在创建自己的 Linux 映像之前都需要以下材料:
OS 安装 CD/DVD 或 ISO 映像文件。 一个启用了 KVM/QEMU 虚拟机管理程序的 Linux 机器。一些发行版可能需要 virt-manager/virt-viewer GUI 实用程序。 cloud-init 或针对操作系统自行编写的等效脚本。 guestfish、guestmount 或 virt-* 工具,用于修改映像。
满足所有必须的条件后,即可开始根据下面总结的步骤创建自己的 Linux 映像:
使用 virt-manager 或 virt-install 创建一个虚拟机 (VM) 并安装操作系统。 配置操作系统,以满足您自己的需求(例如通过安装所需的中间件),或者安装 cloud-init 或等效的脚本来满足 OpenStack 的要求。 使用 guestfish、guestmount 或 virt-* 修改映像,以满足 OpenStack 的要求。 将新映像上传到 OpenStack 映像服务并验证该映像。
基于 Windows 的映像
OpenStack 网站上没有详细的示例介绍如何创建基于 Windows 的映像。但要让您创建的基于 Windows 的映像能正常运行,您必须至少:
安装一个 VirtIO 驱动程序。 启用远程桌面协议 (Remote Desktop Protocol, RDP) 并配置它以通过防火墙。 配置 Internet 控制消息协议 (Internet Control Message Protocol, ICMP) 以通过防火墙。 将磁盘分区并(使用 cloudbase-init)调整引导磁盘上的根分区大小。 处理用户数据和其他元数据(使用 cloudbase-init)。 启用 Windows System Preparation (Sysprep) 工具,以自定义来宾操作系统。
对于大多数私有云用例,本列表中的最后两个要求是可选的。而且您可以手动或使用脚本将磁盘分区,并调整引导磁盘上的根分区大小。但必须安装一个 VirtIO 驱动程序,Windows 映像才能在 OpenStack 云中工作。此外,您需要拥有 VirtIO-Win 驱动程序包。
满足最低要求后,构建 Windows 映像的过程是:
使用一个 Internet Drive Electronics (IDE) 磁盘和一个 AMD PCnet32 或 Realtek rt8139 网络接口卡 (NIC) 创建一个虚拟机。 安装操作系统。 配置操作系统以满足您自己的要求(例如通过安装所需的中间件),或者安装 cloudbase-init 或等效的脚本来满足 OpenStack 要求。 关闭虚拟机。 添加一个小 VirtIO 磁盘和一个 VirtIO NIC。 启动虚拟机并安装 VirtIO 磁盘和 NIC 的 VirtIO 驱动程序。 重新启动虚拟机,检查操作系统,然后关闭虚拟机。 将映像上传到 OpenStack 映像服务并验证该映像。
也可执行以下步骤:
创建一个包含以下部分的虚拟机: 一个 VirtIO 磁盘 一个 PCnet32 或 rt8139 NIC 一个额外的 CD-ROM,包含用于比 Windows Vista 或 Windows Server 2008 更高版本的 Windows 的 VirtIO 磁盘驱动程序,或者一个额外的软盘,包含用于比 Windows server 2003 R2 更低版本的 Windows 的 VirtIO 磁盘驱动程序 在操作系统中安装所需的 VirtIO 磁盘驱动程序。 配置操作系统,以满足您自己的要求(例如通过安装所需的中间件),或者安装 cloudbase-init 或运行等效的脚本来满足 OpenStack 的要求。 关闭虚拟机。 添加一个 VirtIO NIC。 启动虚拟机并安装 VirtIO NIC 的 VirtIO 驱动程序。 重新启动虚拟机,检查操作系统,然后关闭虚拟机。 将映像上传到 OpenStack 映像服务并验证该映像。
不足
尽管目前为 OpenStack 创建映像的方法有一些好处(如创建基于 Linux 的映像的开源工具的广泛可用性),但该方法并不容易。创建基于 Windows 的映像看起来可能比创建 Linux 映像简单一些,因为不需要使用 guestfish 等工具修改映像。但目前还没有自动化工具来为 OpenStack 创建全功能的 Windows 映像,所以最终用户或操作人员还必须手动创建它们。如果一个全球化团队的测试人员或开发人员需要 Windows 映像,这些映像必须有不同的语言版本 — 而且团队可能使用数十种语言。云操作人员准备所有请求的语言版本的 Windows 映像,这是不可能完成的任务。
为私有云创建 Linux 和 Windows 映像对最终用户而言是一个耗时的工作 — 甚至对经验丰富的云操作人员也是如此。而且,组织可能缺乏资源让最终用户创建映像 — 例如,创建 Linux 映像所需的额外 KVM/QEMU 虚拟机管理程序。在这种情况下,创建最终用户请求的所有映像,对云操作人员而言是一项艰巨的任务。
最后,需要将新映像上传到 OpenStack 映像服务,根据映像来源与 OpenStack 映像服务之间的网络性能,这个过程可能要花很长的时间。出于相同的原因,反复验证新映像也可能会花很长的时间。
新的 OpenStack 映像创建方法
如果启用了 OpenStack 的用户要在线创建映像,创建能满足其需求的映像要容易得多。我们提出了一种新的映像创建方法,其中用户通过云服务所提供的 OpenStack 仪表板在线创建新映像。借助此功能,最终用户无需额外的虚拟机管理程序,不需要自行将映像上传到 OpenStack 映像服务。他们所需的只是操作系统安装 CD/DVD ISO 映像文件。
概念设计
在概念上,为 OpenStack 创建一个新映像的理想过程是,最终用户:
将操作系统安装 CD/DVD ISO 映像文件上传到 OpenStack 映像服务。 通过已上传的 ISO 映像启动一个新实例。 通过 OpenStack 仪表板中的 Virtual Networking Computing (VNC)/Simple Protocol for Independent Computing Environments (SPICE) 控制台安装操作系统。 执行特殊需要所要求的必要配置并安装所需的软件包。 手动或运行服务操作人员提供的脚本来执行 OpenStack 所要求的修改 — 例如,安装 cloud-init、
获取公共 SSH 密钥、启用 SSHD 远程登录/RDP 等的脚本。 创建实例的快照。 根据需要在快照上运行 glance image-update 命令,将快照转换为映像并添加其他元数据。
前提条件
必须满足一些条件才能确保新的映像创建方法取得成功:
一个可供所有最终用户使用的有效仪表板或 Web UI。 VNC 代理或 SPICE 代理运行正常且可用于所有最终用户。 一个 cloud-init 或等效的脚本工具存储库可供所有最终用户使用。 OpenStack 映像服务中拥有 VirtIO-win 驱动程序的一个 ISO 映像可供所有最终用户使用。
下面我们演示新方法的可行性。
可行性分析
该新方法最重要的两个方面是:如何支持 ISO 映像以及如何为从 ISO 映像启动的实例组装块设备。
目前对 ISO 映像的支持
OpenStack 支持 ISO 映像。也支持从 ISO 映像启动实例。但是,将来宾操作系统从 ISO 映像安装到从 ISO 映像启动的实例中,对此并未提供良好的支持。要想成功安装,必须满足一些严格的条件:
ISO 映像中的来宾操作系统必须默认已启用 VirtIO 设备驱动程序。 必须设置临时磁盘风格,它的大小必须满足来宾操作系统的要求。 仪表板和 OpenStack novncproxy 服务器必须在正常运行。
如果所有这些条件都已满足,即可从 ISO 映像成功地将来宾操作系统安装到从这个 ISO 映像启动的实例的临时磁盘上。当然,在来宾操作系统上也可像使用其他实例一样工作。但是,由于 OpenStack 中目前的实例快照机制,您无法成功地将实例转换为实例快照或映像。实例快照将仅包含实例的根磁盘。其他块设备(包括临时磁盘和卷)将被忽略。
实例块设备目前的组装工作流
图 1 显示了在从 ISO 映像引导一个 KVM/QEMU 实例时,OpenStack Nova 中块设备的组装工作流。
图 1. 组装块设备的现有工作流
在图 1 中的工作流中:
Nova 从 Glance 获取 ISO 映像并将它设置为一个虚拟机实例的根磁盘,以 CD-ROM 作为设备类型,IDE 作为总线类型。 Nova 创建一个临时磁盘并将它设置为虚拟机实例的第二个磁盘,以 disk 作为设备类型,VirtIO 作为总线类型。但只有在所设置的临时磁盘大小符合实例的风格时,这一步才能完成。 用户将来宾操作系统从根磁盘(实例的 CD-ROM)安装到临时磁盘(实例的第二个磁盘)并通过 VNC 逐步配置它。 用户从这个虚拟机实例创建一个快照,Nova 将快照保存到 glance 服务。
此工作流似乎适合从头创建一个新虚拟机映像。但您获得的是最初的 ISO 映像的副本。原因是快照中仅包含根磁盘(实例的第一个块设备,如果从 ISO 映像启动,实际上是实例的 CD-ROM),临时磁盘已被忽略。所以,在目前的 OpenStack 中,您可从 ISO 映像启动实例,也可将 ISO 映像中的操作系统安装到已配置临时磁盘且已启动的实例中,但不能创建已安装了操作系统的临时磁盘的快照。要解决此问题,需要调整实例的各个块设备的组装工作流。
新的组装工作流
您可以更改块设备组装流程,创建一个临时磁盘,其大小设置适当且一定会设置为从 ISO 映像启动的各个实例的根磁盘。更改之后,实例快照中包含的根磁盘将是已安装了操作系统的临时磁盘 — 完全满足您的要求。
图 2 显示了在对 libvirt 驱动程序进行修改(将在本文的 概念证明 一节中介绍)后,您从一个 ISO 映像启动一个实例时块设备的组装工作流。
图 2. 修改后的块设备组装工作流
下面是在从 ISO 映像启动实例时,修改块设备组装工作流的过程:
Nova 创建一个虚拟机磁盘文件并将它设置为虚拟机实例的根磁盘。设备总线默认设置为 VirtIO。 Nova 从 Glance 获取来宾操作系统的 ISO 映像并将它设置为第二个磁盘设备,这是一个 CD-ROM。 Nova 从 Glance 获取 VirtIO 驱动程序的一个 ISO 映像并将它设置为第三个磁盘设备,这是另一个 CD-ROM。 用户从第二个磁盘设备(第一个 CD-ROM)安装来宾操作系统并根据需要配置它。 如果 VirtIO 驱动程序默认未包含在来宾操作系统中,会使用第三个磁盘设备(第二个 CD-ROM)安装来宾操作系统的 VirtIO 驱动程序。 用户创建该实例的一个快照,Nova 将它保存到 Glance 服务。
目前对 ISO 映像的支持 中已介绍,实例快照仅包含实例的根磁盘,无论根磁盘的类型是什么都是如此。使用修改后的组装工作流,根磁盘是 Nova 创建的一个新磁盘文件,包含从作为操作系统映像的 CD-ROM(实例的第二个磁盘)所安装的来宾操作系统。
正如我们所构想的,结果是一个从操作系统 ISO 映像安装的新实例的实例快照 — 而不是最初的 ISO 映像的副本。
概念证明
要确保新的映像创建方法符合我们的设计目的,我们对 Nova 的代码进行了一些修改 — 主要修改了 libvirt 驱动程序。请参见 下载 获取相关代码。我们修改的 python 模块是 libvirt/driver.py 和 libvirt/blockinfo.py。这些文件中的注释标识了我们所修改的类方法和实例。
我们用于概念证明的环境包含:
硬件:
2U 机架服务器 2 个 4 核
Xeon 处理器 12 个 8GB RAM 4 个 900GB SAS 硬盘且配置了 RAID10 4 个 1Gps 以太网卡
软件:
Red Hat Enterprise Linux 6 update 4 作为虚拟机管理程序 RDO Grizzly 版本
我们在 RDO Grizzly 独立环境、RDO Grizzly 的多节点安装环境和官方 OpenStack Grizzly 版本上测试了修改后的代码。
测试和结果
本节介绍了我们为使用新方法创建虚拟机映像而修改的 Nova 代码,执行的简单测试过程以及一些测试示例。
测试过程
测试过程为:
为 Glance 创建操作系统 ISO 映像。 检查现有的风格,确保根磁盘大小满足您的要求。如果没有适用的风格,可创建一种新风格。 使用适用的风格,从这个操作系统 ISO 映像启动一个实例。 实例启动后,按照屏幕上的安装步骤,通过仪表板所提供的 VNC 控制台完成操作系统的安装工作。 根据需要安装应用程序并根据 OpenStack 的需要配置操作系统,例如安装 cloud-init 或等效的脚本,启用 SSHD 远程登录/RDP 服务等。 创建这个新安装实例的一个实例快照。 运行 glance image-update,或者如果仪表板提供了相关的功能,从仪表板更新快照信息,将映像类型改为 image。
测试结果
修改 libvirt 驱动程序后,从 ISO 映像启动的实例的块设备如清单 1 所示。
清单 1. 从 ISO 映像启动的实例的块设备映射
<disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/nova/instances/290124e3-a267-4223-bd69-661fac2035eb/disk.newos'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/></disk><disk type='file' device='cdrom'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/nova/instances/290124e3-a267-4223-bd69-661fac2035eb/disk'/> <target dev='hda' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/></disk><disk type='file' device='cdrom'> <driver name='qemu' type='qcow2' cache='none'/> <source file='/var/lib/nova/instances/290124e3-a267-4223-bd69-661fac2035eb/disk.virtio'/> <target dev='hdb' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='1'/></disk>
表 1 显示了几种主流操作系统的测试结果。
表 1. 测试结果
来宾操作系统 结果 Windows XP 失败* Windows Server 2003 R2 失败* Windows 7 成功
Windows 8 成功 Windows Server 2012 成功 RHEL5.9 成功 RHEL6.4 成功 SLES10 sp4 成功 SLES11 sp3 成功 *备注:对 Windows XP 和 Windows Server 2003 R2 的测试失败了,因为没有找到包含 VirtIO 驱动程序的软盘。根源是早于 Windows Server 2003 R2 的 Windows 版本仅支持从软盘加载额外的磁盘驱动程序。在本文中,我们仅添加了一个用于 VirtIO 驱动程序的 CD-ROM,如 图 2 中所示,但可以在更早 Windows 版本的块设备组装工作流中添加一个额外的软盘驱动程序。
结束语
我们新的映像创建方法的优点包括:
可
轻松为 OpenStack 创建新映像。 可轻松验证新创建的映像。 为所有最终用户提供了一种自助服务机制。
缺点包括:
映像可能无法支持全部功能 — 具体来讲,分区磁盘和调整引导磁盘上根分区的大小。 不支持早于 Windows Server 2003 R2 的 Windows 版本。(但如果通过支持旧 Windows 版本的软盘驱动程序来创建更复杂的组装工作流,也可支持这些版本。) 不支持缺少 VirtIO 设备驱动程序支持的旧 Linux 版本。
目前为止,大多数基于 OpenStack 的公共 IaaS 云服务都提供在基础映像中具有固定根磁盘大小的实例,以及 — 通过卷服务 — 为实例提供额外的磁盘空间。在私有云中,实例的大部分需求主要与所安装的中间件、来宾操作系统的主要版本/次要版本、实例风格等相关。与公共云服务中一样,可通过提供固定的平均根磁盘大小和足够的卷来满足磁盘大小要求。所以,分区磁盘和调整引导磁盘上根分区大小的功能对大多数私有云而言不是必需的。
OpenStack 已成长为一种适合开源云操作系统的全球流行平台。它使各种各样的云解决方案易于实施、可大规模扩展且包含丰富的功能。我们在本文中介绍的工作证明,可以基于 OpenStack 平台来实现新功能 — 而且 OpenStack 是一个开放且灵活的框架,而不仅仅是一个软件产品。