第 1 章 镜像服务
本章介绍了在 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_type 是 streamOptimized,adapter_type 是 buslogic。通过在镜像服务中对这些元数据进行提取,管理员不再需要了解所有元数据(除非需要覆盖其中的一些数据)。这些元数据参数对镜像的使用者非常有用。例如,在 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 Image 或 RHEL 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 DVD 或 RHEL 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 格式镜像的步骤。
使用
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
按以下内容设置虚拟机:
- At the initial Installer boot menu, choose the Install Red Hat Enterprise Linux 7.0 option.
- 选择适当的 Language 和 Keyboard 选项。
- When prompted about which type of devices your installation uses, choose Auto-detected installation media.
- When prompted about which type of installation destination, choose Local Standard Disks. For other storage options, choose Automatically configure partitioning.
- 对于软件,选择 Minimal Install。
-
对于网络和主机名,为您的设备选择
eth0
作为网络,并输入设备的 hostname。默认的主机名是localhost.localdomain
。 -
Choose the
root
password. The installation process completes and the Complete! screen appears.
- 安装完成后,重启实例并以 root 用户身份登录。
更新
/etc/sysconfig/network-scripts/ifcfg-eth0
文件,使它只包括以下内容:TYPE=Ethernet DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp NM_CONTROLLED=no
- 重启机器。
在 Content Delivery Network 中注册机器:
# subscription-manager register
在提示时输入您的用户门户网站(Customer Portal)的用户名和密码:
Username: admin@example.com Password:
找到包括所需频道的权利池:
# subscription-manager list --available | grep -A8 "Red Hat Enterprise Linux Server"
使用在上一步所获得的权利池 ID 来把
Red Hat Enterprise Linux Server
的权利附加到系统上:# subscription-manager attach --pool=pool_id
启用所需的频道:
# subscription-manager repos --enable=rhel-7-server-rpms
对于 RHEL OpenStack Platform 7,所需的频道是
rhel-7-server-openstack-7.0-rpms
和rhel-7-server-rh-common-rpms
。注意如需更多相关信息,请参阅 Installation Reference 中的 "Subscribe to the Required Channels"。
更新系统。
# yum -y update
安装
cloud-init
软件包。# yum install -y cloud-utils-growpart cloud-init
编辑
/etc/cloud/cloud.cfg
配置文件,在cloud_init_modules
下添加以下内容:- resolv-conf
当实例第一次引导时,
resolv-conf
选项会自动配置resolv.conf
。这个文件包括了与实例相关的信息,如nameservers
、domain
和其它选项。把以下行添加到
/etc/sysconfig/network
以避免访问 EC2 元数据服务时出现问题。NOZEROCONF=yes
为了确保控制台的信息出现在 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
取消注册虚拟机。这样可以避免通过对创建的镜像进行克隆所产生的镜像都有相同的订阅请求。
# subscription-manager repos --disable=* # subscription-manager unregister # yum clean all
关闭实例:
# poweroff
使用
virt-sysprep
命令重置并清理镜像,从而可以避免在创建实例时出现问题:[user@host]# virt-sysprep -d rhel7
使用
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 格式镜像的步骤。
使用
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
按以下内容设置虚拟机:
At the initial Installer boot menu, choose the Install or upgrade an existing system option. Step through the installation prompts. Accept the defaults.
安装的过程会检查磁盘并进行一个介质检查操作。当检查成功完成后,会弹出磁盘。
- 选择适当的 Language 和 Keyboard 选项。
- When prompted about which type of devices your installation uses, choose Basic Storage Devices.
-
为主机选择一个 hostname。默认的主机名是
localhost.localdomain
。 -
设置 timezone 和
root
密码。 - Based on the space on the disk, choose the type of installation.
- Choose the Basic Server install, which installs an SSH server.
- 安装过程完成,Congratulations, your Red Hat Enterprise Linux installation is complete 界面会出现。
-
重启实例,并以
root
用户登录。 更新
/etc/sysconfig/network-scripts/ifcfg-eth0
文件,使它只包括以下内容:TYPE=Ethernet DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp NM_CONTROLLED=no
- 重启机器。
在 Content Delivery Network 中注册机器:
# subscription-manager register
在提示时输入您的用户门户网站(Customer Portal)的用户名和密码:
Username: admin@example.com Password:
找到包括所需频道的权利池:
# subscription-manager list --available | grep -A8 "Red Hat Enterprise Linux Server"
使用在上一步所获得的权利池 ID 来把
Red Hat Enterprise Linux Server
的权利附加到系统上:# subscription-manager attach --pool=pool_id
启用所需的频道:
# subscription-manager repos --enable=rhel-6-server-rpms
对于 RHEL OpenStack Platform 7,所需的频道是
rhel-7-server-openstack-7.0-rpms
和rhel-6-server-rh-common-rpms
。注意如需更多相关信息,请参阅 Installation Reference 中的 "Subscribe to the Required Channels"。
更新系统。
# yum -y update
安装
cloud-init
软件包。# yum install -y cloud-utils-growpart cloud-init
编辑
/etc/cloud/cloud.cfg
配置文件,在cloud_init_modules
下添加以下内容:- resolv-conf
当实例第一次引导时,
resolv-conf
选项会自动配置resolv.conf
。这个文件包括了与实例相关的信息,如nameservers
、domain
和其它选项。为了防止网络出现问题,创建
/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 地址也没有被分配)。把以下行添加到
/etc/sysconfig/network
以避免访问 EC2 元数据服务时出现问题。NOZEROCONF=yes
为了确保控制台的信息出现在 dashboard 的
日志
标签页中,以及nova console-log
输出中,把以下的引导选项添加到/etc/grub.conf
中:console=tty0 console=ttyS0,115200n8
取消注册虚拟机。这样可以避免通过对创建的镜像进行克隆所产生的镜像都有相同的订阅请求。
# subscription-manager repos --disable=* # subscription-manager unregister # yum clean all
关闭实例:
# poweroff
使用
virt-sysprep
命令重置并清理镜像,从而可以避免在创建实例时出现问题:[user@host]# virt-sysprep -d rhel6.6
使用
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. 上传镜像
- 在 dashboard 中,选择项目 > Compute > 镜像。
- 点创建镜像。
- 输入相关的值后点创建镜像。
项 | 备注 |
---|---|
名称 |
镜像的名称。在一个项目中,不同镜像的名称需要是唯一的。 |
描述 |
对镜像的简单描述。 |
镜像源 |
镜像源:镜像地址或镜像文件。根据您的选择,以下项会被显示。 |
镜像地址或镜像文件 |
|
格式 |
镜像格式(例如 qcow2)。 |
构架 |
镜像架构。例如,使用 i686 作为 32 位架构;或使用 x86_64 作为 64 位架构。 |
最小磁盘 (GB) |
引导镜像所需的最小磁盘大小。如果没有指定,默认值是 0(没有最小磁盘大小的限制)。 |
最低内存 (MB) |
引导镜像所需的最低内存大小。如果没有指定,默认值是 0(没有最低内存大小的限制)。 |
公有 |
如果选择这个选项,这个镜像对所有可以访问这个项目的用户有效。 |
受保护的 |
如果选择了这个选项,只有具有特定权限的用户可以删除这个镜像。 |
另外,您也可以使用带有 property
选项的 glance image-create
命令创建镜像。在这个命令的命令行中可以使用多个值(请参阅镜像配置参数)。
1.2.3. 更新镜像
- 在 dashboard 中,选择项目 > Compute > 镜像。
从下拉菜单中选编辑镜像。
注意编辑镜像选项只在以
admin
用户登录时才有效。当以demo
用户登录时,有效的选项是启动云主机和创建云硬盘。- 更新相关的值后点更新镜像。您可以编辑以下值:名称、描述、内核 ID、ramdisk ID、架构、格式、最小磁盘、最低内存、公共、受保护的。
- 点下拉菜单并选更新元数据选项。
- 通过把左面栏中的项添加到右面栏来指定元数据。左面的栏中包括了在 Image Service Metadata Catalog 中定义的元数据。如果需要添加您自己选择的关键字的元数据,选其它,然后点保存。
另外,您也可以使用带有 property
选项的 glance image-update
命令创建镜像。在这个命令的命令行中可以使用多个值(请参阅镜像配置参数)。
1.2.4. 删除镜像
- 在 dashboard 中,选择项目 > Compute > 镜像。
- 选择需要删除的镜像后点删除镜像。