任务一 理解OpenStack镜像服务
1.1 •什么是镜像
• 镜像通常是指一系列文件或一个磁盘驱动器的精确副本。
• 虚拟机 所使用的 虚拟磁盘 , 实际上是 一种 特殊格式的镜像文件 。
• 云 环境下尤其需要 镜像。
• 镜像 就是一个模板,类似于 VMware 的虚拟机模板,其预先安装基本的操作系统和其他 应用软件 。
• OpenStack 中的镜像就是虚拟机镜像,是包含有可启动的操作系统的虚拟机实例磁盘的单个文件。
1.2 •什么是镜像服务
• 镜像服务用来管理镜像 ,让 用户能够发现、获取和保存镜像 。
• 镜像服务主要功能
Ø 查询 和获取镜像的元数据和镜像本身。
Ø 注册 和上传虚拟机镜像,包括镜像的创建、下载和管理。
Ø 维护 镜像信息,包括镜像的元数据和镜像本身。
Ø 支持 多种方式存储 镜像。
Ø 对 虚拟机实例执行创建 快照命令创建 新的镜像, 或备份 虚拟机实例的状态。
• Glance 是关于镜像的 中心。
1.3 •Glance****架构


1.4 •查看Glance配置文件
• Glance API服务器配置文件名一般是glance-api.conf,其配置对应Glance的glance-api服务,其中镜像存储后端的相关配置在[glance_store]节中定义,默认设置如下。
stores=file,http,swift
default_store=file
• glance- cache.conf 定义镜像缓存 配置。
• glance- scrubber.conf 定义镜像删除相关 配置。
policy.json是镜像服务的策略配置文件。
1.5 •验证Glance服务
• 查看 当前运行的 Glance 服务。
root@node-a etc\]# systemctl status \*glance\*.service • glance-registry 是 系统后台运行的 Glance 注册服务进程,负责处理与镜像元数据相关的 RESTful 请求 。 • OpenStack 从 Queens 版本 开始将 glance-registry 服务集成到了 glance- api 中 ,如果 glance- api 接收到与镜像元数据有关的请求,会直接操作 数据库。 1.6 •**试用镜像服务的****API** (1)请求一个admin项目作用域的令牌。 \[root@node-a \~\]# curl -i -H "Content-Type: application/json" -d ' \\ { "auth": { "identity": { ... }, "scope": { ... } } }' "http://localhost:5000/v3/auth/tokens" (2)导出环境变量OS_TOKEN,并将其值设置为上述操作获取的令牌ID。 (3)通过Images API v1获取当前镜像列表。 \[root@node-a \~\]# curl -s -H "X-Auth-Token: $OS_TOKEN" http://localhost:9292/v1/images {"versions": \[{"status": "CURRENT", "id": "v2.9", "links": \[{"href": "http://localhost:9292/v2/", "rel": "self"}\]}, {"status": "SUPPORTED", "id": "v2.7", "links": \[{"href": "http://localhost:9292/v2/", "rel": "self"}\]}, ... "links": \[{"href": "http://localhost:9292/v2/", "rel": "self"}\]}, {"status": "SUPPORTED", "id": "v2.0", "links": \[{"href": "http://localhost:9292/v2/", "rel": "self"}\]}\]} 任务二 管理OpenStack镜像 2.1 •**虚拟机镜像的磁盘****格式**  2.2 •**虚拟机镜像****的容器格式**  2.3 •**镜像的****状态**  2.4 •**镜像的访问权限** • Public (公共的):可以被所有的项目使用。 • Private (私有的):只能被镜像所有者所在的项目使用。 • Shared (共享的):一个非共有的镜像可以共享给其他 项目。 • Protected (受保护的) :镜像 不能被删除。 2.5 •**镜像的元数据** • 镜像的 元数据 即 镜像 属性,提供关于由镜像服务所存储的虚拟磁盘的信息 。 • 元数据 作为与镜像数据关联的镜像记录的一部分由镜像服务存储 。 • 相关 的 OpenStack 组件和驱动通过镜像元数据与镜像服务交互。 • 元数据 定义 服务提供 了一个通用的 API 来自定义可用的键值对 元数据。 2.6 •**命令行的镜像管理方法** • 建议 使用 openstack 命令替代传统的 glance 命令 。 (1)查看镜像 Ø 查看 已有的镜像列表,查询结果包括镜像的 ID 和名称,以及状态。 openstack image list Ø 查看 镜像详细 信息。 openstack image show 镜像名称或ID (2)创建镜像 openstack image create \[选项\] 镜像名称 (3)更改镜像 Ø 更改镜像。 openstack image set \[选项\] 镜像名称 Ø 取消 镜像 更改。 openstack image unset \[选项\] 镜像名称 (4)删除镜像 openstack image delete \<镜像名称或ID\> (5)镜像与项目关联。 Ø 将镜像与项目 关联。 openstack image add project \[--project-domain 项目所属域\] 镜像名或ID 项目名或ID Ø 将镜像与项目解除 关联。 openstack image remove project \[--project-domain 项目所属域\] 镜像名或ID 项目名或ID 2.7 ••**查看镜像** • 使用命令行工具查看镜像。 • 加载用户的环境变量。 \[root@node-a \~\]# source keystonerc_demo • 显示镜像列表。 \[root@node-a \~(keystone_demo)\]# openstack image list +------------------------------------+-------+-----+ \| ID \| Name \| Status \| +------------------------------------+-------+-----+ \| 369d0e73-abb8-4a90-b835-6c627a0f47d1 \| cirros \| active \| \| 37116975-33c9-4d3e-8551-0c83e4efe7ef \| fedora \| active \| • 查看镜像的详细信息。 \[root@node-a \~(keystone_demo)\]# openstack image show fedora 2.8 •**创建镜像** • 加载 云管理员 admin 的环境脚本,以 admin 用户身份进行操作。 \[root@node-a \~\]# source keystonerc_admin • 向 OpenStack 云上传一个 .qcow2 格式的 CentOS 7 镜像并进行注册。 \[root@node-a \~(keystone_admin)\]# openstack image create --disk-format qcow2 --container-format bare --public --file \~/Downloads/CentOS-7-x86_64-GenericCloud.qcow2 centos7 2.9 •**管理镜像** • 使用 命令行工具为镜像设置元数据 。 • 在 创建镜像的 openstack image create 命令或修改镜像的 openstack image set 命令中,通过 --property 选项以键值对的形式定义 元数据。 • 示例 \[root@node-a \~(keystone_admin)\]# openstack image set --property architecture= x86_64 --property hypervisor_type=qemu fedora 2.10•**转换镜像格式** • 使用 qemu-img 工具的 convert 子 命令将 镜像从一种格式转换为另一种格式 。 • 基本 语法格式如下。 qemu-img convert \[-f 源格式\] \[-O 目标格式\] \[-o 选项\] 源文件路径 目标文件路径 • 示例 \[root@node-a \~\]# qemu-img convert -f raw -O qcow2 \~/Downloads/cirros-0.5.1-x86_64-disk.img \~/Downloads/cirros-0.5.1-x86_64-disk.qcow2 任务三 基于预制镜像定制OpenStack镜像 3.1 •**什么是****cloud-****init** • cloud- init 是一组 Python 脚本的集合,是一个能够定制云镜像的实用 工具。 • 通过 修改 / etc /cloud/ cloud.cfg 配置文件来 实现。 • cloud- init 一般会被包含在用于启动虚拟机实例的镜像文件 中。 • 基于镜像 部署虚拟机实例, cloud- init 会随虚拟机实例的启动自动启动,对虚拟机实例进行自定义的初始配置 。 • cloud- init 目前 支持 Ubuntu 、 Fedora 、 Debian 、 RHEL 、 CentOS 等主流的 Linux 操作系统发行版 。 3.2 •**什么是实例快照** • 快照( Snapshots )是一种基于时间点的数据备份技术,能够记录某一个时刻的数据信息并将其保存,以便在需要时将数据恢复到之前时间点的 状态 • OpenStack 中为虚拟机实例生成的快照抓取实例正在运行的磁盘的状态,其实是一个完整的镜像,由 Glance 镜像服务 管理。 3.3•**对实例进行定制** (1)登录实例。 \[root@node-a \~\]# ssh -i \~/.ssh/demo-key.pem [email protected] (2)切换到root用户。 \[root@cenos7-vm \~\]$ sudo su - (3)执行passwd命令设置root用户的密码。 \[root@cenos7-vm \~\]# passwd Changing password for user root. New password: Retype new password: passwd: all authentication tokens updated successfully. (4)使用vi工具编辑/etc/ssh/sshd_config配置文件,将其中的PasswordAuthentication参数值设置为yes,然后保存该文件并退出编辑,重启SSH服务。 (5)查看CentOS的详细版本。 \[root@cenos7-vm \~\]# cat /etc/redhat-release (6)安装图形界面。 yum groupinstall "Server with GUI" (7)将时区修改为上海。 \[root@cenos7-vm \~\]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime cp: overwrite '/etc/localtime'? y (8)将系统语言修改为中文。 \[root@cenos7-vm \~\]# localectl set-locale LANG=zh_CN.UTF8 (9)设置系统默认启动图形界面。 \[root@cenos7-vm \~\]# systemctl set-default graphical.target Removed symlink /etc/systemd/system/default.target. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target. 3.4 •**定制****cloud-****init****初始化行为** • 编辑 实例 CentOS 7 的 / etc /cloud/ cloud.cfg 配置文件。 Ø 将 disable_root 参数的值设为 0 ,让 root 账户能够直接登录实例(默认不允许登录) 。 Ø 将 ssh_pwauth 参数的值设为 1 ,以启用 SSH 密码登录(默认只能通过私钥 SSH 登录) 。 • 重 启系统。 \[root@cenos7-vm \~\]# reboot 3.5•**将实例快照转换成镜像** • 获取 实例快照的文件路径,可通过查看其" ID" 值确定 具体的文件路径。 \[root@node-a \~(keystone_demo)\]# openstack image list +----------------------------------+---------------+--------+ \| ID \| Name \| Status \| +----------------------------------+---------------+--------+ \| 885aeabf-3753-43c0-865f-85d08083a1f1 \| centos7 \| active \| \| c9e65002-07fc-4ed8-92f5-8c0ced750332 \| centos7-gui-snap \| active \| \| 369d0e73-abb8-4a90-b835-6c627a0f47d1 \| cirros \| active \| \| 37116975-33c9-4d3e-8551-0c83e4efe7ef \| fedora \| active \| • 执行 openstack image create 命令创建新的镜像。 \[root@node-a \~(keystone_demo)\]# openstack image create centos7-gui --file /var/lib/ glance/images/c9e65002-07fc-4ed8-92f5-8c0ced750332 --disk-format qcow2 --container- format bare 任务四 使用自动化工具制作OpenStack镜像 4.1 •**Diskimage****-builder****工具** • Diskimage -builder 简称 DIB ,是 OpenStack 的官方 项目。 • DIB 主要 用于构建适用于 OpenStack 平台的操作系统 镜像。 • Diskimage -builder 的镜像生成 原理 (1)将最初启动虚拟机实例时安装操作系统完成后的镜像保存为基础镜像。 (2)将该基础镜像挂载到本地。 (3)chroot到根分区。 (4)根据不同的定制需要增加不同的模块。 (5)安装完成后保存为特定格式的镜像文件。 • 使用 Diskimage -builder 首次制作某操作系统镜像时需要从网上下载该操作系统的基础镜像文件,后面再制作同一版本的镜像时,可直接 使用镜像 缓存 文件。 4.2 •**其他自动化镜像生成工具** • Oz :自动化生成虚拟机镜像文件的命令行工具 。 • Packer :从单个源配置构建多种平台的虚拟机镜像的工具。 • image-bootstrap :生成可启动的虚拟机镜像的命令行 工具。 • imagefactory :可以自动构建、转换和上传镜像到不同的云提供商的新型 工具。 • KIWI :操作系统镜像构建器,支持多种 Linux 硬件平台、虚拟化和云系统的操作系统镜像构建。 • virt -builder :快速构建虚拟机镜像的工具 。 4.3 •**安装****Diskimage-builder** (1)安装epel扩展源。 yum -y install epel-release (2)安装pip工具。 yum -y install python-pip (3)安装支持环境。 yum -y install qemu-img kpartx (4)升级pip工具。 pip install --upgrade "pip \< 20.0" (5)安装Diskimage-builder。 pip install "diskimage-builder==2.2.0" 4.4 •**熟悉****Diskimage-builder****的用法** disk-image-create \[选项\]...\[元素\]... • 元素 ( Element )是指用来组织制作镜像的元素。元素决定镜像中包含的内容,例如创建用户、安装软件包、进行某种 配置。元素 还可以为 disk-image-create 命令的运行提供环境变量 。有许多 针对具体元素的环境变量 。 • 简单的示例 • 生成 一个通用的、可启动的最新发行版 Ubuntu 操作系统镜像。 disk-image-create ubuntu vm • 进一步 定制可通过执行以下命令设置环境变量来实现。 export ELEMENTS_PATH=\~/source/tripleo-image-elements/elements disk-image-create -a amd64 -o fedora-amd64-heat-cfntools vm fedora heat-cfntools 4.5 •**使用****Diskimage-builder****自动构建****Ubuntu****操作系统镜像** • 设置 相关的环境变量。 \[root@localhost \~\]# export DIB_DEV_USER_USERNAME=ubuntu #初始用户名 \[root@localhost \~\]# export DIB_DEV_USER_PASSWORD=ubuntu #初始用户密码 \[root@localhost \~\]# export DIB_DEV_USER_PWDLESS_SUDO=YES #为用户启用无密码sudo \[root@localhost \~\]# export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack #cloud-init的源是ConfigDrive和OpenStack • 构建 镜像。 \[root@localhost \~\]# disk-image-create -a amd64 -t qcow2 -o ubuntu.qcow2 ubuntu vm cloud-init-datasources devuser 任务五 手动制作OpenStack镜像 5.1 •**手动制作镜像** • 可以 使用 KVM ,或者使用 GUI 桌面虚拟化 工具。 • 创建新的虚拟机镜像时,应连接 Hypervisor 的图形界面控制台,用作虚拟机实例的显示 界面。 • KVM 提供的图形界面控制台可以通过虚拟网络计算 ( VNC )协议或更新的独立计算环境简单协议 ( SPICE )访问 。 • 使用 KVM 平台制作 OpenStack 镜像实际上是一种系统镜像文件格式的转换,将制作好的系统镜像文件转换为原始格式的文件。 5.2 •**KVM****虚拟化工具** • KVM 的基本架构  • Libvirt 是一个软件集合,是一套为方便管理平台虚拟化技术而设计的开源代码的应用程序接口、守护进程和管理工具 。 • Libvirt 不仅 提供了对虚拟机的管理,也提供了对虚拟网络和存储的管理 。 • Libvirt 是目前使用非常广的虚拟机管理程序 接口。 5.3 •**KVM****虚拟磁盘(镜像)文件格式** • . raw :原始的格式 ,直接 将文件系统的存储单元分配给虚拟机使用,采取直读直写的策略 。 • . qcow2 : QEMU 引入的镜像文件格式,也是目前 KVM 默认的格式 。 • . qed : .qcow2 的一种改型,存储定位查询方式和数据块大小和 .qcow2 一样 。 ★★如果要使用虚拟机快照,则选择.qcow2格式。 5.4 •**VirtIO****驱动程序与****Cloudbase-init** • VirtIO 其实就是一个运行于 Hypervisor 之上的 API ,虚拟化环境中的 I/O 操作通过 VirtIO 与 Hypervisor 通信,可以具有更好的性能 。 • Cloudbase-init 是 Windows 操作系统和其他系统的云初始化 程序。 其作用与 Linux 操作系统中的 cloud- init 一样,也是一个开源的 Python 项目 。 • Cloudbase-init 主要包括两个部分 Ø 服务 ( Service ) Ø 插件 ( Plugin ) 5.5 •**部署****KVM** • 检查是否支持 CPU 虚拟化。 grep -E 'svm\|vmx' /proc/cpuinfo • 安装 KVM 软件包。 yum install qemu-kvm libvirt virt-install virt-manager virt-viewer • 为 便于实验,应关闭该 KVM 主机的防火墙和 SELinux 功能。