为 OpenStack 私有云创建 Linux 和 Windows 映像_第1页
为 OpenStack 私有云创建 Linux 和 Windows 映像_第2页
为 OpenStack 私有云创建 Linux 和 Windows 映像_第3页
为 OpenStack 私有云创建 Linux 和 Windows 映像_第4页
为 OpenStack 私有云创建 Linux 和 Windows 映像_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、为 OpenStack 私有云创建 Linux 和 Windows 映像一种新的 OpenStack 映像创建方法本文提出用一种新方式来使用 OpenStack 云操作系统为私有云构建 Linux® 和 Windows® 映像。OpenStack 环境目前的映像创建方法麻烦且耗时。作者提出了一种在线自助服务方法,使映像创建对私有云的操作人员和最终用户而言更快且更轻松。开源 OpenStack 云操作系统是一个功能丰富且可以大规模扩展的平台,适用于所有类型的云计算。一些公共云服务基于 OpenStack,许多组织内的私有云实现也是如此。但 OpenStack 仍缺乏一些针对私

2、有云的特性,尤其是针对开发和测试环境的特性。例如,映像构建就不是一个简单的过程。本文为 OpenStack 私有云提供一种全新且改进的映像创建方法。我们在 QEMU/KVM 平台上验证了这种新方法,但在理论上该方法也适用于其他虚拟机管理程序平台。介绍这个新方法之前,我们将概述目前在 OpenStack 中如何创建映像。目前在 OpenStack 中创建映像的方式在 OpenStack 中创建 Linux 或 Windows 映像的过程由多个耗时的步骤组成。 基于 Linux 的映像官方 OpenStack 虚拟机映像指南 详细介绍了 7 种 要求,必须满足这些要求,基于 Linux 的映像才能

3、在 OpenStack 云中完全正常工作(可通过安装 cloud-init 包来满足一些要求)。该映像指南建议用户在创建自己的映像之前阅读指南中很长一节的内容,确保映像支持他们计划使用的 OpenStack 特性。对于一些特定的发行版,可手动或使用工具创建 Linux 映像 比如 VMBuilder、Oz 或 imagefactory。无论使用哪种方法,在创建自己的 Linux 映像之前都需要以下材料: · OS 安装 CD/DVD 或 ISO 映像文件。· 一个启用了 KVM/QEMU 虚拟机管理程序的 Linux 机器。一些发行版可能需要 virt-manager/vi

4、rt-viewer GUI 实用程序。· cloud-init 或针对操作系统自行编写的等效脚本。· guestfish、guestmount 或 virt-* 工具,用于修改映像。满足所有必须的条件后,即可开始根据下面总结的步骤创建自己的 Linux 映像:1. 使用 virt-manager 或 virt-install 创建一个虚拟机 (VM) 并安装操作系统。2. 配置操作系统,以满足您自己的需求(例如通过安装所需的中间件),或者安装 cloud-init 或等效的脚本来满足 OpenStack 的要求。3. 使用 guestfish、guestmount 或 vi

5、rt-* 修改映像,以满足 OpenStack 的要求。4. 将新映像上传到 OpenStack 映像服务并验证该映像。基于 Windows 的映像OpenStack 网站上没有详细的示例介绍如何创建基于 Windows 的映像。但要让您创建的基于 Windows 的映像能正常运行,您必须至少:· 安装一个 VirtIO 驱动程序。· 启用远程桌面协议 (Remote Desktop Protocol, RDP) 并配置它以通过防火墙。· 配置 Internet 控制消息协议 (Internet Control Message Protocol, ICMP) 以通

6、过防火墙。· 将磁盘分区并(使用 cloudbase-init)调整引导磁盘上的根分区大小。· 处理用户数据和其他元数据(使用 cloudbase-init)。· 启用 Windows System Preparation (Sysprep) 工具,以自定义来宾操作系统。对于大多数私有云用例,本列表中的最后两个要求是可选的。而且您可以手动或使用脚本将磁盘分区,并调整引导磁盘上的根分区大小。但必须安装一个 VirtIO 驱动程序,Windows 映像才能在 OpenStack 云中工作。此外,您需要拥有 VirtIO-Win 驱动程序包。满足最低要求后,构建 Win

7、dows 映像的过程是:1. 使用一个 Internet Drive Electronics (IDE) 磁盘和一个 AMD PCnet32 或 Realtek rt8139 网络接口卡 (NIC) 创建一个虚拟机。2. 安装操作系统。3. 配置操作系统以满足您自己的要求(例如通过安装所需的中间件),或者安装 cloudbase-init 或等效的脚本来满足 OpenStack 要求。4. 关闭虚拟机。5. 添加一个小 VirtIO 磁盘和一个 VirtIO NIC。6. 启动虚拟机并安装 VirtIO 磁盘和 NIC 的 VirtIO 驱动程序。7. 重新启动虚拟机,检查操作系统,然后关闭虚

8、拟机。8. 将映像上传到 OpenStack 映像服务并验证该映像。也可执行以下步骤:1. 创建一个包含以下部分的虚拟机: o 一个 VirtIO 磁盘o 一个 PCnet32 或 rt8139 NICo 一个额外的 CD-ROM,包含用于比 Windows Vista 或 Windows Server 2008 更高版本的 Windows 的 VirtIO 磁盘驱动程序,或者一个额外的软盘,包含用于比 Windows server 2003 R2 更低版本的 Windows 的 VirtIO 磁盘驱动程序2. 在操作系统中安装所需的 VirtIO 磁盘驱动程序。3. 配置操作系统,以满足您自

9、己的要求(例如通过安装所需的中间件),或者安装 cloudbase-init 或运行等效的脚本来满足 OpenStack 的要求。4. 关闭虚拟机。5. 添加一个 VirtIO NIC。6. 启动虚拟机并安装 VirtIO NIC 的 VirtIO 驱动程序。7. 重新启动虚拟机,检查操作系统,然后关闭虚拟机。8. 将映像上传到 OpenStack 映像服务并验证该映像。不足尽管目前为 OpenStack 创建映像的方法有一些好处(如创建基于 Linux 的映像的开源工具的广泛可用性),但该方法并不容易。创建基于 Windows 的映像看起来可能比创建 Linux 映像简单一些,因为不需要使用

10、 guestfish 等工具修改映像。但目前还没有自动化工具来为 OpenStack 创建全功能的 Windows 映像,所以最终用户或操作人员还必须手动创建它们。如果一个全球化团队的测试人员或开发人员需要 Windows 映像,这些映像必须有不同的语言版本 而且团队可能使用数十种语言。云操作人员准备所有请求的语言版本的 Windows 映像,这是不可能完成的任务。为私有云创建 Linux 和 Windows 映像对最终用户而言是一个耗时的工作 甚至对经验丰富的云操作人员也是如此。而且,组织可能缺乏资源让最终用户创建映像 例如,创建 Linux 映像所需的额外 KVM/QEMU 虚拟机管理程序

11、。在这种情况下,创建最终用户请求的所有映像,对云操作人员而言是一项艰巨的任务。最后,需要将新映像上传到 OpenStack 映像服务,根据映像来源与 OpenStack 映像服务之间的网络性能,这个过程可能要花很长的时间。出于相同的原因,反复验证新映像也可能会花很长的时间。新的 OpenStack 映像创建方法如果启用了 OpenStack 的用户要在线创建映像,创建能满足其需求的映像要容易得多。我们提出了一种新的映像创建方法,其中用户通过云服务所提供的 OpenStack 仪表板在线创建新映像。借助此功能,最终用户无需额外的虚拟机管理程序,不需要自行将映像上传到 OpenStack 映像服务

12、。他们所需的只是操作系统安装 CD/DVD ISO 映像文件。概念设计在概念上,为 OpenStack 创建一个新映像的理想过程是,最终用户:1. 将操作系统安装 CD/DVD ISO 映像文件上传到 OpenStack 映像服务。2. 通过已上传的 ISO 映像启动一个新实例。3. 通过 OpenStack 仪表板中的 Virtual Networking Computing (VNC)/Simple Protocol for Independent Computing Environments (SPICE) 控制台安装操作系统。4. 执行特殊需要所要求的必要配置并安装所需的软件包。5.

13、手动或运行服务操作人员提供的脚本来执行 OpenStack 所要求的修改 例如,安装 cloud-init、获取公共 SSH 密钥、启用 SSHD 远程登录/RDP 等的脚本。6. 创建实例的快照。7. 根据需要在快照上运行 glance image-update 命令,将快照转换为映像并添加其他元数据。前提条件必须满足一些条件才能确保新的映像创建方法取得成功:· 一个可供所有最终用户使用的有效仪表板或 Web UI。· VNC 代理或 SPICE 代理运行正常且可用于所有最终用户。· 一个 cloud-init 或等效的脚本工具存储库可供所有最终用户使用。

14、83; OpenStack 映像服务中拥有 VirtIO-win 驱动程序的一个 ISO 映像可供所有最终用户使用。下面我们演示新方法的可行性。可行性分析该新方法最重要的两个方面是:如何支持 ISO 映像以及如何为从 ISO 映像启动的实例组装块设备。目前对 ISO 映像的支持OpenStack 支持 ISO 映像。也支持从 ISO 映像启动实例。但是,将来宾操作系统从 ISO 映像安装到从 ISO 映像启动的实例中,对此并未提供良好的支持。要想成功安装,必须满足一些严格的条件:· ISO 映像中的来宾操作系统必须默认已启用 VirtIO 设备驱动程序。· 必须设置临时磁盘

15、风格,它的大小必须满足来宾操作系统的要求。· 仪表板和 OpenStack novncproxy 服务器必须在正常运行。如果所有这些条件都已满足,即可从 ISO 映像成功地将来宾操作系统安装到从这个 ISO 映像启动的实例的临时磁盘上。当然,在来宾操作系统上也可像使用其他实例一样工作。但是,由于 OpenStack 中目前的实例快照机制,您无法成功地将实例转换为实例快照或映像。实例快照将仅包含实例的根磁盘。其他块设备(包括临时磁盘和卷)将被忽略。实例块设备目前的组装工作流图 1 显示了在从 ISO 映像引导一个 KVM/QEMU 实例时,OpenStack Nova 中块设备的组装工

16、作流。图 1. 组装块设备的现有工作流在图 1 中的工作流中:1. Nova 从 Glance 获取 ISO 映像并将它设置为一个虚拟机实例的根磁盘,以 CD-ROM 作为设备类型,IDE 作为总线类型。2. Nova 创建一个临时磁盘并将它设置为虚拟机实例的第二个磁盘,以 disk 作为设备类型,VirtIO 作为总线类型。但只有在所设置的临时磁盘大小符合实例的风格时,这一步才能完成。3. 用户将来宾操作系统从根磁盘(实例的 CD-ROM)安装到临时磁盘(实例的第二个磁盘)并通过 VNC 逐步配置它。4. 用户从这个虚拟机实例创建一个快照,Nova 将快照保存到 glance 服务。此工作流

17、似乎适合从头创建一个新虚拟机映像。但您获得的是最初的 ISO 映像的副本。原因是快照中仅包含根磁盘(实例的第一个块设备,如果从 ISO 映像启动,实际上是实例的 CD-ROM),临时磁盘已被忽略。所以,在目前的 OpenStack 中,您可从 ISO 映像启动实例,也可将 ISO 映像中的操作系统安装到已配置临时磁盘且已启动的实例中,但不能创建已安装了操作系统的临时磁盘的快照。要解决此问题,需要调整实例的各个块设备的组装工作流。新的组装工作流 您可以更改块设备组装流程,创建一个临时磁盘,其大小设置适当且一定会设置为从 ISO 映像启动的各个实例的根磁盘。更改之后,实例快照中包含的根磁盘将是已安

18、装了操作系统的临时磁盘 完全满足您的要求。图 2 显示了在对 libvirt 驱动程序进行修改(将在本文的 概念证明 一节中介绍)后,您从一个 ISO 映像启动一个实例时块设备的组装工作流。图 2. 修改后的块设备组装工作流下面是在从 ISO 映像启动实例时,修改块设备组装工作流的过程:1. Nova 创建一个虚拟机磁盘文件并将它设置为虚拟机实例的根磁盘。设备总线默认设置为 VirtIO。2. Nova 从 Glance 获取来宾操作系统的 ISO 映像并将它设置为第二个磁盘设备,这是一个 CD-ROM。3. Nova 从 Glance 获取 VirtIO 驱动程序的一个 ISO 映像并将它设

19、置为第三个磁盘设备,这是另一个 CD-ROM。4. 用户从第二个磁盘设备(第一个 CD-ROM)安装来宾操作系统并根据需要配置它。5. 如果 VirtIO 驱动程序默认未包含在来宾操作系统中,会使用第三个磁盘设备(第二个 CD-ROM)安装来宾操作系统的 VirtIO 驱动程序。6. 用户创建该实例的一个快照,Nova 将它保存到 Glance 服务。目前对 ISO 映像的支持 中已介绍,实例快照仅包含实例的根磁盘,无论根磁盘的类型是什么都是如此。使用修改后的组装工作流,根磁盘是 Nova 创建的一个新磁盘文件,包含从作为操作系统映像的 CD-ROM(实例的第二个磁盘)所安装的来宾操作系统。正

20、如我们所构想的,结果是一个从操作系统 ISO 映像安装的新实例的实例快照 而不是最初的 ISO 映像的副本。概念证明要确保新的映像创建方法符合我们的设计目的,我们对 Nova 的代码进行了一些修改 主要修改了 libvirt 驱动程序。请参见 下载 获取相关代码。我们修改的 python 模块是 libvirt/driver.py 和 libvirt/blockinfo.py。这些文件中的注释标识了我们所修改的类方法和实例。我们用于概念证明的环境包含:硬件:· 2U 机架服务器· 2 个 4 核 Xeon 处理器· 12 个 8GB RAM· 4 个 9

21、00GB SAS 硬盘且配置了 RAID10· 4 个 1Gps 以太网卡软件:· Red Hat Enterprise Linux 6 update 4 作为虚拟机管理程序· RDO Grizzly 版本我们在 RDO Grizzly 独立环境、RDO Grizzly 的多节点安装环境和官方 OpenStack Grizzly 版本上测试了修改后的代码。测试和结果本节介绍了我们为使用新方法创建虚拟机映像而修改的 Nova 代码,执行的简单测试过程以及一些测试示例。测试过程测试过程为:1. 为 Glance 创建操作系统 ISO 映像。2. 检查现有的风格,确保根

22、磁盘大小满足您的要求。如果没有适用的风格,可创建一种新风格。3. 使用适用的风格,从这个操作系统 ISO 映像启动一个实例。4. 实例启动后,按照屏幕上的安装步骤,通过仪表板所提供的 VNC 控制台完成操作系统的安装工作。5. 根据需要安装应用程序并根据 OpenStack 的需要配置操作系统,例如安装 cloud-init 或等效的脚本,启用 SSHD 远程登录/RDP 服务等。6. 创建这个新安装实例的一个实例快照。7. 运行 glance image-update,或者如果仪表板提供了相关的功能,从仪表板更新快照信息,将映像类型改为 image。测试结果修改 libvirt 驱动程序后,

23、从 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 de

24、v='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&

25、#39;/> <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&g

26、t;<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'/> <read

27、only/> <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成功*备注:

28、对 Windows XP 和 Windows Server 2003 R2 的测试失败了,因为没有找到包含 VirtIO 驱动程序的软盘。根源是早于 Windows Server 2003 R2 的 Windows 版本仅支持从软盘加载额外的磁盘驱动程序。在本文中,我们仅添加了一个用于 VirtIO 驱动程序的 CD-ROM,如 图 2 中所示,但可以在更早 Windows 版本的块设备组装工作流中添加一个额外的软盘驱动程序。结束语我们新的映像创建方法的优点包括:· 可轻松为 OpenStack 创建新映像。· 可轻松验证新创建的映像。· 为所有最终用户提供了一种

29、自助服务机制。缺点包括:· 映像可能无法支持全部功能 具体来讲,分区磁盘和调整引导磁盘上根分区的大小。· 不支持早于 Windows Server 2003 R2 的 Windows 版本。(但如果通过支持旧 Windows 版本的软盘驱动程序来创建更复杂的组装工作流,也可支持这些版本。)· 不支持缺少 VirtIO 设备驱动程序支持的旧 Linux 版本。目 前为止,大多数基于 OpenStack 的公共 IaaS 云服务都提供在基础映像中具有固定根磁盘大小的实例,以及 通过卷服务 为实例提供额外的磁盘空间。在私有云中,实例的大部分需求主要与所安装的中间件、来宾

30、操作系统的主要版本/次要版本、实例风格等相关。与公共云服务中一 样,可通过提供固定的平均根磁盘大小和足够的卷来满足磁盘大小要求。所以,分区磁盘和调整引导磁盘上根分区大小的功能对大多数私有云而言不是必需的。OpenStack 已成长为一种适合开源云操作系统的全球流行平台。它使各种各样的云解决方案易于实施、可大规模扩展且包含丰富的功能。我们在本文中介绍的工作证明,可以基于 OpenStack 平台来实现新功能 而且 OpenStack 是一个开放且灵活的框架,而不仅仅是一个软件产品。参考资料 学习· “发 现 OpenStack”:(John Rhoton,developerWorks,

31、2013 年 12 月):在这个分多部分的系列文章中全面了解 OpenStack。 · 通过以下开发人员资源了解 OpenStack 系统: o OpenStack Compute (Nova): § OpenStack Compute§ GitHub 上的 Nova 项目开发人员站点§ OpenStack Compute API 参考信息§ OpenStack 云管理员指南o 映像服务 (Glance): § OpenStack 共享服务§ GitHub 上的 Glance 项目开发人员站点§ OpenStack

32、 映像服务 API V2§ OpenStack 映像服务 API V1o OpenStack 存储 (Swift)o OpenStack 手册: § OpenStack Python 开发人员文档§ OpenStack API 文档§ OpenStack 管理员用户指南·blockinfo# vim: tabstop=4 shiftwidth=4 softtabstop=4# Copyright (C) 2012-2013 Red Hat, Inc.# Licensed under the Apache License, Version 2.0

33、 (the "License"); you may# not use this file except in compliance with the License. You may obtain# a copy of the License at# Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT# WARRANTIES

34、 OR CONDITIONS OF ANY KIND, either express or implied. See the# License for the specific language governing permissions and limitations# under the License."""Handling of block device information and mapping.This module contains helper methods for intepreting the blockdevice informatio

35、n and determining the suitable mapping toguest devices and libvirt XML.Throughout these methods there are a number of standardvariables / types used * 'mapping': a dict contains the storage device mapping. For the default disk types it will contain the following keys & values: 'disk&

36、#39; -> disk_info 'disk.rescue' -> disk_info 'disk.local' -> disk_info 'disk.swap' -> disk_info 'disk.config' -> disk_info 'disk.newos' -> disk_info If any of the default disks are overriden by the block device info mappings, the hash value w

37、ill be None For any ephemeral device there will also be a dict entry 'disk.eph$NUM' -> disk_info For any volume device there will also be a dict entry: $path -> disk_info Finally a special key will refer to the root device: 'root' -> disk_info * 'disk_info': a tuple

38、specifying disk configuration It contains the following 3 fields (disk bus, disk dev, device type) * 'disk_bus': the guest bus type ('ide', 'virtio', 'scsi', etc) * 'disk_dev': the device name 'vda', 'hdc', 'sdf', 'xvde' etc * &

39、#39;device_type': type of device eg 'disk', 'cdrom', 'floppy'"""from oslo.config import cfgfrom nova import block_devicefrom pute import instance_typesfrom nova import exceptionfrom nova.virt import configdrivefrom nova.virt import driverimport nova.gettext

40、utilsLOG = logging.getLogger(_name_)CONF = cfg.CONFdef has_disk_dev(mapping, disk_dev): """Determine if a disk device name has already been used. Looks at all the keys in mapping to see if any corresponding disk_info tuple has a device name matching disk_dev Returns True if the disk_d

41、ev is in use.""" for disk in mapping: info = mappingdisk if info'dev' = disk_dev: return True return Falsedef get_dev_prefix_for_disk_bus(disk_bus): """Determine the dev prefix for a disk bus. Determine the dev prefix to be combined with a disk number to fix a d

42、isk_dev. eg 'hd' for 'ide' bus can be used to form a disk dev 'hda' Returns the dev prefix or raises an exception if the disk bus is unknown.""" if CONF.libvirt_disk_prefix: return CONF.libvirt_disk_prefix if disk_bus = "ide": return "hd" el

43、if disk_bus = "virtio": return "vd" elif disk_bus = "xen": # Two possible mappings for Xen, xvda or sda # which are interchangable, so we pick sda return "sd" elif disk_bus = "scsi": return "sd" elif disk_bus = "usb": return "

44、;sd" elif disk_bus = "uml": return "ubd" elif disk_bus = "lxc": return None else: raise exception.NovaException( _("Unable to determine disk prefix for %s") % disk_bus)def get_dev_count_for_disk_bus(disk_bus): """Determine the number disks

45、supported. Determine how many disks can be supported in a single VM for a particular disk bus. Returns the number of disks supported.""" if disk_bus = "ide": return 4 else: return 26def find_disk_dev_for_disk_bus(mapping, bus, last_device=False): """Identify a

46、 free disk dev name for a bus. Determines the possible disk dev names for the bus, and then checks them in order until it identifies one that is not yet used in the disk mapping. If 'last_device' is set, it will only consider the last available disk dev name. Returns the chosen disk_dev name

47、, or raises an exception if none is available. """ dev_prefix = get_dev_prefix_for_disk_bus(bus) if dev_prefix is None: return None max_dev = get_dev_count_for_disk_bus(bus) if last_device: devs = max_dev - 1 else: devs = range(max_dev) for idx in devs: disk_dev = dev_prefix + chr(ord

48、('a') + idx) if not has_disk_dev(mapping, disk_dev): return disk_dev raise exception.NovaException( _("No free disk device names for prefix '%s'"), dev_prefix)def is_disk_bus_valid_for_virt(virt_type, disk_bus): valid_bus = 'qemu': 'virtio', 'scsi',

49、'ide', 'usb', 'kvm': 'virtio', 'scsi', 'ide', 'usb', 'xen': 'xen', 'ide', 'uml': 'uml', 'lxc': 'lxc', if virt_type not in valid_bus: raise exception.UnsupportedVirtType(virt=virt_type) ret

50、urn disk_bus in valid_busvirt_typedef get_disk_bus_for_device_type(virt_type, image_meta=None, device_type="disk"): """Determine the best disk bus to use for a device type. Considering the currently configured virtualization type, return the optimal disk_bus to use for a giv

51、en device type. For example, for a disk on KVM it will return 'virtio', while for a CDROM it will return 'ide' Returns the disk_bus, or returns None if the device type is not supported for this virtualization""" # Prefer a disk bus set against the image first of all if

52、 image_meta: key = "hw_" + device_type + "_bus" disk_bus = image_meta.get('properties', ).get(key) if disk_bus is not None: if not is_disk_bus_valid_for_virt(virt_type, disk_bus): raise exception.UnsupportedHardware(model=disk_bus, virt=virt_type) return disk_bus # Otherw

53、ise pick a hypervisor default disk bus if virt_type = "uml": if device_type = "disk": return "uml" elif virt_type = "lxc": return "lxc" elif virt_type = "xen": if device_type = "cdrom": return "ide" elif device_type = &q

54、uot;disk": return "xen" elif virt_type in ("qemu", "kvm"): if device_type = "cdrom": return "ide" elif device_type = "disk": return "virtio" return Nonedef get_disk_bus_for_disk_dev(virt_type, disk_dev): """Det

55、ermine the disk bus for a disk dev. Given a disk devi like 'hda', 'sdf', 'xvdb', etc guess what the most appropriate disk bus is for the currently configured virtualization technology Returns the disk bus, or raises an Exception if the disk dev prefix is unknown.""&

56、quot; if disk_dev:2 = 'hd': return "ide" elif disk_dev:2 = 'sd': # Reverse mapping 'sd' is not reliable # there are many possible mappings. So # this picks the most likely mappings if virt_type = "xen": return "xen" else: return "scsi"

57、elif disk_dev:2 = 'vd': return "virtio" elif disk_dev:3 = 'xvd': return "xen" elif disk_dev:3 = 'ubd': return "uml" else: raise exception.NovaException( _("Unable to determine disk bus for '%s'") % disk_dev:1)def get_next_disk_info(mapping, disk_bus, device_type='disk', last_device=False): """Determine the disk info for the next device on disk_bus. Considering the disks already listed in the disk mapping, determine the

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论