搜索

第 1 章 镜像服务

download PDF

本章介绍了在 RHEL OpenStack Platform 中管理镜像和存储所需的步骤。

虚拟机镜像(image)就是一个包括安装了可引导操作系统的虚拟磁盘的文件。虚拟机镜像可以有不同的格式,以下是 RHEL OpenStack Platform 支持的格式:

  • RAW - 没有进行结构化的磁盘镜像格式。
  • QCOW2 - QEMU 仿真程序支持的磁盘格式。
  • ISO - 保存在一个二进制文件中的、包括磁盘每个扇区中的数据的数据备份。
  • AKI - Amazon Kernel Image。
  • AMI - Amazon Machine Image。
  • ARI - Amazon RAMDisk Image。
  • VDI - VirtualBox 虚拟机监控程序和 QEMU 仿真程序支持的磁盘格式。
  • VHD - VMWare、VirtualBox 以及其它系统的虚拟机监控程序支持的通用磁盘格式。
  • VMDK - 一些通用虚拟机监控程序支持的磁盘格式。

因为 ISO 包括了已安装了操作系统的可引导文件系统,所以我们通常不认为 ISO 是一个虚拟机镜像格式。但是,您可以向处理其它虚拟机镜像文件一样处理 ISO。

为了下载红帽官方的 Red Hat Enterprise Linux 云镜像,您需要一个有效的 Red Hat Enterprise Linux 订阅:

1.1. 镜像服务:新功能

RHEL OpenStack Platform 7 发行版本中的镜像服务包括以下新功能:

  • 镜像转换 - 在导入镜像时调用任务 API 对镜像进行转换(在 Kilo 中只支持 qcow/raw 格式的转换)。

    作为镜像导入流程的一部分,一个插件提供了对镜像进行转换的功能。这个插件可以根据用户的配置被启用或被禁用。因此,用户需要指定用于进行部署的首选镜像格式。

    镜像服务(Image service)在接收到特定格式镜像的数据后会把这些数据保存在一个临时的存储中。然后,会触发转换插件来把这些数据转换为目标格式,并把转换后的数据保存在最终的存储位置中。当整个过程完成后,临时存储的镜像数据会被删除。因此,上传的原始镜像数据不会被镜像服务保留。

    注意

    镜像转换的过程只会在导入(import)一个镜像时才会被触发。在上传(upload)一个镜像时不会触发镜像的转换。例如:

    $ glance --os-image-api-version 2 task-create --type import --input '{"import_from_format": "qcow2", "import_from": "http://127.0.0.1:8000/test.qcow2", "image_properties": {"disk_format": "qcow2", "container_format": "bare"}}'
  • 镜像內省(Image Introspection) - 每种格式的镜像本身都会包括一组元数据。

    例如,一个 vmdk 包括以下参数:

    $ head -20 so-disk.vmdk
    
    # Disk DescriptorFile
    version=1
    CID=d5a0bce5
    parentCID=ffffffff
    createType="streamOptimized"
    
    # Extent description
    RDONLY 209714 SPARSE "generated-stream.vmdk"
    
    # The Disk Data Base
    #DDB
    
    ddb.adapterType = "buslogic"
    ddb.geometry.cylinders = "102"
    ddb.geometry.heads = "64"
    ddb.geometry.sectors = "32"
    ddb.virtualHWVersion = "4"

    通过对 vmdk 进行內省,您可以方便地知道 disk_typestreamOptimizedadapter_typebuslogic。通过在镜像服务中对这些元数据进行提取,管理员不再需要了解所有元数据(除非需要覆盖其中的一些数据)。这些元数据参数对镜像的使用者非常有用。例如,在 Compute 节点中,对一个 streamOptimized 磁盘进行实例化的过程和对 flat 磁盘进行实例化的过程完全不同。现在,您可以在导入镜像的过程中,通过调用任务 API 进行镜像內省。

    注意

    在 Kilo 中,您只能內省 virtual_size 元数据参数。

1.2. 管理镜像

OpenStack Image 服务 (glance) 提供了磁盘和服务器镜像的发现(discovery)、注册(registration)和分发(delivery)功能。您可以对服务器镜像进行复制或进行快照,然后进行保存。存储的镜像可以作为模板来快速设置并运行一个新服务器。

1.2.1. 创建镜像

本节介绍了使用 Red Hat Enterprise Linux 6 和 Red Hat Enterprise Linux 7 ISO 文件手工创建 OpenStack 兼容的 .qcow2 格式镜像。

1.2.1.1. 在 RHEL OpenStack Platform 中使用 KVM Guest 镜像

您可以使用一个已经准备就绪的 RHEL KVM guest qcow2 镜像(可以从 RHEL 7 KVM Guest ImageRHEL 6.6 KVM Guest Image 获得)。这些镜像被配置为使用 cloud-init,并需要使用 ec2 兼容的元数据服务来提供 SSH 密钥。

注意

对于 KVM guest 镜像:

  • 这个镜像中的 root 帐号被禁用,但是,可以通过 sudo 来使用一个名为 cloud-user 的特殊用户。
  • 这个镜像服务没有 root 密码设置。

root 密码在 /etc/shadow 中被锁定(在第 2 项中加了 !!)。

对于一个 OpenStack 实例,我们推荐用户通过 OpenStack dashboard 或命令行产生一个 ssh 密钥对,并使用它们进行 SSH 公共验证来作为实例的 root 用户。

在启动实例时,公共密钥会被植入。您可以使用在创建密钥对时下载的私人密钥进行验证。

如果您不想使用密钥对,您可以使用在为一个实例添加一个 admin 密码一节中介绍的过程创建 admin 密码。

如果您需要创建一个自定义的 Red Hat Enterprise Linux 镜像,请参阅创建一个 Red Hat Enterprise Linux 7 镜像创建一个 Red Hat Enterprise Linux 6 镜像

1.2.1.2. 创建自定义的 Red Hat Enterprise Linux 镜像

先决条件:

  • 使用一个运行 Linux 的主机创建镜像。它可以是任何可以安装并运行 Linux 软件包的机器。
  • libvirt 和 virt-manager(运行 yum groupinstall -y @virtualization)。这会安装创建一个 guest 操作系统所需的所有软件包。
  • Libguestfs 工具程序(运行 yum install -y libguestfs-tools-c)。这会安装一组用来访问和修改虚拟机镜像的工具程序。
  • 一个 Red Hat Enterprise Linux 7 ISO 文件(RHEL 7.0 Binary DVDRHEL 6.6 Binary DVD)。
  • 一个用来修改 kickstart 文件的文本编辑程序。
注意

在以下的过程中,所有带有 [user@host]# 提示符的命令都需要在您的主机系统上运行。

1.2.1.2.1. 创建一个 Red Hat Enterprise Linux 7 镜像

本节介绍了使用 Red Hat Enterprise Linux 7 ISO 文件手工创建 OpenStack 兼容的 .qcow2 格式镜像的步骤。

  1. 使用 virt-install 开始进行安装:

    [user@host]# qemu-img create -f qcow2 rhel7.qcow2 8G
    [user@host]# virt-install --virt-type kvm --name rhel7 --ram 2048 \
    --cdrom /tmp/rhel-server-7.0-x86_64-dvd.iso \
    --disk rhel7.qcow2,format=qcow2 \
    --network=bridge:virbr0 --graphics vnc,listen=0.0.0.0 \
    --noautoconsole --os-type=linux --os-variant=rhel7

    启动一个实例并开始安装过程。

    注意

    如果实例没有自动启动,运行以下命令:

    [user@host]# virt-viewer rhel7
  2. 按以下内容设置虚拟机:

    1. At the initial Installer boot menu, choose the Install Red Hat Enterprise Linux 7.0 option. RHEL7 Install1
    2. 选择适当的 LanguageKeyboard 选项。
    3. When prompted about which type of devices your installation uses, choose Auto-detected installation media. RHEL7 Install5
    4. When prompted about which type of installation destination, choose Local Standard Disks. RHEL7 Install6 For other storage options, choose Automatically configure partitioning.
    5. 对于软件,选择 Minimal Install
    6. 对于网络和主机名,为您的设备选择 eth0 作为网络,并输入设备的 hostname。默认的主机名是 localhost.localdomain
    7. Choose the root password. RHEL7 Install9 The installation process completes and the Complete! screen appears.
  3. 安装完成后,重启实例并以 root 用户身份登录。
  4. 更新 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,使它只包括以下内容:

    TYPE=Ethernet
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    NM_CONTROLLED=no
  5. 重启机器。
  6. 在 Content Delivery Network 中注册机器:

    # subscription-manager register
    1. 在提示时输入您的用户门户网站(Customer Portal)的用户名和密码:

      Username: admin@example.com
      Password:
    2. 找到包括所需频道的权利池:

      # subscription-manager list --available | grep -A8 "Red Hat Enterprise Linux Server"
    3. 使用在上一步所获得的权利池 ID 来把 Red Hat Enterprise Linux Server 的权利附加到系统上:

      # subscription-manager attach --pool=pool_id
    4. 启用所需的频道:

      # subscription-manager repos --enable=rhel-7-server-rpms

      对于 RHEL OpenStack Platform 7,所需的频道是 rhel-7-server-openstack-7.0-rpmsrhel-7-server-rh-common-rpms

      注意

      如需更多相关信息,请参阅 Installation Reference 中的 "Subscribe to the Required Channels"。

  7. 更新系统。

    # yum -y update
  8. 安装 cloud-init 软件包。

    # yum install -y cloud-utils-growpart cloud-init
  9. 编辑 /etc/cloud/cloud.cfg 配置文件,在 cloud_init_modules 下添加以下内容:

    - resolv-conf

    当实例第一次引导时,resolv-conf 选项会自动配置 resolv.conf。这个文件包括了与实例相关的信息,如 nameserversdomain 和其它选项。

  10. 把以下行添加到 /etc/sysconfig/network 以避免访问 EC2 元数据服务时出现问题。

    NOZEROCONF=yes
  11. 为了确保控制台的信息出现在 dashboard 的日志标签页中,以及 nova console-log 输出中,把以下的引导选项添加到 /etc/default/grub 文件中:

    GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"

    运行以下命令:

    # grub2-mkconfig -o /boot/grub2/grub.cfg

    这会输出以下结果:

    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-3.10.0-229.7.2.el7.x86_64
    Found initrd image: /boot/initramfs-3.10.0-229.7.2.el7.x86_64.img
    Found linux image: /boot/vmlinuz-3.10.0-121.el7.x86_64
    Found initrd image: /boot/initramfs-3.10.0-121.el7.x86_64.img
    Found linux image: /boot/vmlinuz-0-rescue-b82a3044fb384a3f9aeacf883474428b
    Found initrd image: /boot/initramfs-0-rescue-b82a3044fb384a3f9aeacf883474428b.img
    done
  12. 取消注册虚拟机。这样可以避免通过对创建的镜像进行克隆所产生的镜像都有相同的订阅请求。

    # subscription-manager repos --disable=*
    # subscription-manager unregister
    # yum clean all
  13. 关闭实例:

    # poweroff
  14. 使用 virt-sysprep 命令重置并清理镜像,从而可以避免在创建实例时出现问题:

    [user@host]# virt-sysprep -d rhel7
  15. 使用 virt-sparsify 命令减少镜像的大小。这个命令会把磁盘镜像中的所有空闲空间转换为主机的空闲空间:

    [user@host]# virt-sparsify --compress /tmp/rhel7.qcow2 rhel7-cloud.qcow2

    这会在运行此命令的地方创建一个新的 rhel7-cloud.qcow2 文件。

rhel7-cloud.qcow2 镜像文件可以被上传到 Image 服务。如需了解使用 dashboard 把镜像文件上传到 OpenStack 部署中的信息,请参阅上传镜像

1.2.1.2.2. 创建 Red Hat Enterprise Linux 6 镜像

本节介绍了使用 Red Hat Enterprise Linux 6 ISO 文件手工创建 OpenStack 兼容的 .qcow2 格式镜像的步骤。

  1. 使用 virt-install 开始进行安装:

    [user@host]# qemu-img create -f qcow2 rhel6.qcow2 4G
    [user@host]# virt-install --connect=qemu:///system --network=bridge:virbr0 \
    --name=rhel6.6 --os-type linux --os-variant rhel6 \
    --disk path=rhel6.qcow2,format=qcow2,size=10,cache=none \
    --ram 4096 --vcpus=2 --check-cpu --accelerate \
    --hvm --cdrom=rhel-server-6.6-x86_64-dvd.iso

    启动一个实例并开始安装过程。

    注意

    如果实例没有自动启动,运行以下命令:

    [user@host]# virt-viewer rhel6
  2. 按以下内容设置虚拟机:

    1. At the initial Installer boot menu, choose the Install or upgrade an existing system option. RHEL6 Install1 Step through the installation prompts. Accept the defaults.

      安装的过程会检查磁盘并进行一个介质检查操作。当检查成功完成后,会弹出磁盘。

    2. 选择适当的 LanguageKeyboard 选项。
    3. When prompted about which type of devices your installation uses, choose Basic Storage Devices. RHEL6 Install3
    4. 为主机选择一个 hostname。默认的主机名是 localhost.localdomain
    5. 设置 timezoneroot 密码。
    6. Based on the space on the disk, choose the type of installation. RHEL6 Install4
    7. Choose the Basic Server install, which installs an SSH server. RHEL6 Install5
    8. 安装过程完成,Congratulations, your Red Hat Enterprise Linux installation is complete 界面会出现。
  3. 重启实例,并以 root 用户登录。
  4. 更新 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,使它只包括以下内容:

    TYPE=Ethernet
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    NM_CONTROLLED=no
  5. 重启机器。
  6. 在 Content Delivery Network 中注册机器:

    # subscription-manager register
    1. 在提示时输入您的用户门户网站(Customer Portal)的用户名和密码:

      Username: admin@example.com
      Password:
    2. 找到包括所需频道的权利池:

      # subscription-manager list --available | grep -A8 "Red Hat Enterprise Linux Server"
    3. 使用在上一步所获得的权利池 ID 来把 Red Hat Enterprise Linux Server 的权利附加到系统上:

      # subscription-manager attach --pool=pool_id
    4. 启用所需的频道:

      # subscription-manager repos --enable=rhel-6-server-rpms

      对于 RHEL OpenStack Platform 7,所需的频道是 rhel-7-server-openstack-7.0-rpmsrhel-6-server-rh-common-rpms

      注意

      如需更多相关信息,请参阅 Installation Reference 中的 "Subscribe to the Required Channels"。

  7. 更新系统。

    # yum -y update
  8. 安装 cloud-init 软件包。

    # yum install -y cloud-utils-growpart cloud-init
  9. 编辑 /etc/cloud/cloud.cfg 配置文件,在 cloud_init_modules 下添加以下内容:

    - resolv-conf

    当实例第一次引导时,resolv-conf 选项会自动配置 resolv.conf。这个文件包括了与实例相关的信息,如 nameserversdomain 和其它选项。

  10. 为了防止网络出现问题,创建 /etc/udev/rules.d/75-persistent-net-generator.rules 文件。

    # echo "#" > /etc/udev/rules.d/75-persistent-net-generator.rules

    这会避免创建 /etc/udev/rules.d/70-persistent-net.rules 文件。如果创建了 /etc/udev/rules.d/70-persistent-net.rules 文件,当从快照引导时,网络可能无法正常工作(网络接口被创建为 "eth1",而不是 "eth0"。IP 地址也没有被分配)。

  11. 把以下行添加到 /etc/sysconfig/network 以避免访问 EC2 元数据服务时出现问题。

    NOZEROCONF=yes
  12. 为了确保控制台的信息出现在 dashboard 的日志标签页中,以及 nova console-log 输出中,把以下的引导选项添加到 /etc/grub.conf 中:

    console=tty0 console=ttyS0,115200n8
  13. 取消注册虚拟机。这样可以避免通过对创建的镜像进行克隆所产生的镜像都有相同的订阅请求。

    # subscription-manager repos --disable=*
    # subscription-manager unregister
    # yum clean all
  14. 关闭实例:

    # poweroff
  15. 使用 virt-sysprep 命令重置并清理镜像,从而可以避免在创建实例时出现问题:

    [user@host]# virt-sysprep -d rhel6.6
  16. 使用 virt-sparsify 命令减少镜像的大小。这个命令会把磁盘镜像中的所有空闲空间转换为主机的空闲空间:

    [user@host]# virt-sparsify - -compress rhel6.qcow2 rhel6-cloud.qcow2

    这会在运行此命令的地方创建一个新的 rhel6-cloud.qcow2 文件。

    注意

    根据应用到这个实例的 flavor 中的磁盘空间设置,您需要手工调整实例分区的大小。

rhel6-cloud.qcow2 镜像文件可以被上传到 Image 服务。如需了解使用 dashboard 把镜像文件上传到 OpenStack 部署中的信息,请参阅上传镜像

1.2.2. 上传镜像

  1. 在 dashboard 中,选择项目 > Compute > 镜像
  2. 创建镜像
  3. 输入相关的值后点创建镜像
备注

名称

镜像的名称。在一个项目中,不同镜像的名称需要是唯一的。

描述

对镜像的简单描述。

镜像源

镜像源:镜像地址镜像文件。根据您的选择,以下项会被显示。

镜像地址或镜像文件

  • 选择镜像地址选项来指定镜像的 URL。
  • 选择镜像文件选项来从本地磁盘上传一个镜像。

格式

镜像格式(例如 qcow2)。

构架

镜像架构。例如,使用 i686 作为 32 位架构;或使用 x86_64 作为 64 位架构。

最小磁盘 (GB)

引导镜像所需的最小磁盘大小。如果没有指定,默认值是 0(没有最小磁盘大小的限制)。

最低内存 (MB)

引导镜像所需的最低内存大小。如果没有指定,默认值是 0(没有最低内存大小的限制)。

公有

如果选择这个选项,这个镜像对所有可以访问这个项目的用户有效。

受保护的

如果选择了这个选项,只有具有特定权限的用户可以删除这个镜像。

注意

另外,您也可以使用带有 property 选项的 glance image-create 命令创建镜像。在这个命令的命令行中可以使用多个值(请参阅镜像配置参数)。

1.2.3. 更新镜像

  1. 在 dashboard 中,选择项目 > Compute > 镜像
  2. 从下拉菜单中选编辑镜像

    注意

    编辑镜像选项只在以 admin 用户登录时才有效。当以 demo 用户登录时,有效的选项是启动云主机创建云硬盘

  3. 更新相关的值后点更新镜像。您可以编辑以下值:名称、描述、内核 ID、ramdisk ID、架构、格式、最小磁盘、最低内存、公共、受保护的。
  4. 点下拉菜单并选更新元数据选项。
  5. 通过把左面栏中的项添加到右面栏来指定元数据。左面的栏中包括了在 Image Service Metadata Catalog 中定义的元数据。如果需要添加您自己选择的关键字的元数据,选其它,然后点保存
注意

另外,您也可以使用带有 property 选项的 glance image-update 命令创建镜像。在这个命令的命令行中可以使用多个值(请参阅镜像配置参数)。

1.2.4. 删除镜像

  1. 在 dashboard 中,选择项目 > Compute > 镜像
  2. 选择需要删除的镜像后点删除镜像
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.