镜像上传成功、状态显示正常,共享给别的项目后对方
openstack image list里却死活找不到——十有八九是卡在成员状态pending。这篇按一条完整链路走完镜像管理:下载验证 → 注册 → 改可见性 → 共享(pending → accept)→ 转格式 → 导出删除,全部命令对着一套192.168.108.10的 Victoria 环境验证过,可直接照抄。文中命令名均标注英文全称(如qemu-img= QEMU disk image manipulator),完整清单见文末《附:命令英文全称速查表》。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | Glance 镜像从下载注册到共享、转格式、导出的完整操作链路,重点讲清 shared 镜像 pending 与 accept 两态 |
| 所属类别 | 云计算 → 私有云平台 → OpenStack 镜像管理 |
| 知识关键字 | Glance·qemu-img info·openstack image create·--disk-format·--protected·--shared·image add project·--accept·qemu-img convert·image save |
主线的因果只有一条:镜像先属于创建它的项目,别的项目要用,要么 public 全员开放,要么 shared 走两步共享。所以先看镜像怎么注册进来,再讲可见性怎么改,最后把最容易卡住的共享流程拆开讲。
一、镜像从哪来:下载 cirros 并验证格式
cirros 是一个 12 MB 左右的迷你 Linux 测试镜像,格式 qcow2。下载即可注册使用,练手最省事。镜像文件从本机拖到 controller 节点的/root目录后,先qemu-img info验一下真实格式再动手。
qemu-img info 用法速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
qemu-img | QEMU 磁盘镜像工具 | QEMU disk image manipulator |
info | 子命令:查看镜像格式与容量信息 | information |
<镜像文件> | 要查看的本地镜像路径 | — |
[root@controller ~]# qemu-img info cirros-0.5.2-x86_64-disk.imgimage: cirros-0.5.2-x86_64-disk.imgfileformat: qcow2# 磁盘格式 qcow2,注册时要如实填virtual size:112MiB(117440512bytes)disk size:15.5MiB...virtual size 是启动后系统看到的盘大小,disk size 是文件实际占地。qcow2 支持动态扩展与写时复制,两者不等是正常的。iso 文件查出来是 raw,注册时格式就填 iso。
二、Dashboard 创建并注册镜像
admin 登录后走「项目 → 计算 → 镜像 → 创建镜像」,七步:
| 步 | 操作 | 关键点 |
|---|---|---|
| 1 | 镜像名称Img_web | 自定义 |
| 2 | 镜像文件点「预览」选本地 img | 选定后格式一般自动带出 |
| 3 | 镜像格式 QCOW2 | 必须与qemu-img info查到的一致 |
| 4 | 最小磁盘 1 GB、最低内存 128 MB | 低于它的规格用不了这个镜像 |
| 5 | 可见性选「私有」 | 只有本项目可见(private) |
| 6 | 受保护性选「是」 | protected,挡删除 |
| 7 | 提交后等状态变「运行中」 | 排队 → 保存 → 活动 |
⚠️注意:「受保护 = 是」的镜像删不掉,想删除必须先编辑镜像把受保护改回「否」。
修改镜像在同一个列表:镜像行「编辑镜像」→ 可见性改「公有」、受保护改「否」→ 更新镜像。点镜像名称进详情页,可核对 ID、格式与大小。
三、CLI 创建镜像:一条命令七个参数
openstack image create 用法速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
openstack image create | 创建并注册镜像 | create |
--disk-format | 磁盘格式:ami/ari/aki/vhd/vmdk/raw/qcow2/vhdx/vdi/iso/ploop | disk format |
--container-format | 容器格式,裸镜像填 bare | container format |
--min-disk | 启动镜像所需最小磁盘(GB) | minimum disk |
--min-ram | 启动镜像所需最小内存(MB) | minimum RAM |
--private/--public/--community/--shared | 可见性四选一,默认 private;--shared只是把共享口子打开,给别人仍要走第四章的两步 | private / public / community / shared |
--protected/--unprotected | 是否禁止删除,默认可删 | protected |
--file | 本地镜像文件路径 | file |
<镜像名> | 镜像名称,如Img_cli | — |
[root@controller ~(keystone_admin)]# openstack image create --disk-format qcow2 \>--container-format bare --min-disk1--min-ram128--private\>--file./cirros-0.5.2-x86_64-disk.img Img_cli[root@controller ~(keystone_admin)]# openstack image list # 状态 active 即注册成功大镜像走 Web 界面容易失败且没有进度条,命令行更稳:旧版 glance 客户端的glance image-create --file <文件> --progress能带进度条看传输进度。
四、可见性与共享:pending 到 accept 才算真共享
可见性有四种取值,一次只能取一个:
共享动作与成员状态速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
openstack image set | 修改镜像属性 | set |
--public/--private | 全员可见 / 仅本项目可见 | public / private |
--community | 全员可用,但不出现在他人默认列表 | community |
--shared | 允许共享给指定项目 | shared |
openstack image add project | 把镜像加入目标项目,产生 pending 成员关系 | add project |
openstack image member list | 查看共享成员及状态 | member list |
--accept/--reject/--pending | 接收方对成员关系的表态 | accept / reject / pending |
共享实验接着上一篇的环境做:user_cli_01在Project_cli里先降权(移除 admin,换成 Role_cli),现象才干净。
# 前置:user_cli_01 失去 admin 角色[root@controller ~(keystone_admin)]# openstack role remove --project Project_cli --user user_cli_01 admin[root@controller ~(keystone_admin)]# openstack role remove --project Project_cli --group Group_cli admin[root@controller ~(keystone_admin)]# openstack role add --project Project_cli --user user_cli_01 Role_cli# 第 1 步 owner:镜像设为 shared[root@controller ~(keystone_admin)]# openstack image set --shared Img_cli# 第 2 步 owner:加进目标项目,成员状态变 pending[root@controller ~(keystone_admin)]# openstack image add project Img_cli Project_cli# 第 3 步 接收方:切到 user_cli_01 的环境变量再接受[root@controller ~(keystone_user_cli_01)]# openstack image set --accept Img_cli[root@controller ~(keystone_user_cli_01)]# openstack image list # Img_cli 出现了⚠️注意:pending 状态下接收方完全看不见镜像;
--accept只能由接收方自己执行,owner 代做会报 403 授权错误。
把验证链完整走一遍,四行结论对应四条命令:private 时接收方看不到 →--public后看得到 → 改回--shared又看不到 →add project后仍看不到(pending)→--accept后看得到。共享镜像的全部逻辑就在这条链上。
五、镜像格式转换:qemu-img convert
qcow2 支持压缩,其他格式的镜像(VMDK 最常见)建议转成 qcow2 再上传。以 Ubuntu bionic 云镜像为例:
格式转换参数速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
convert | 子命令:转换镜像格式 | convert |
-f | 指定输入格式 | from |
-O | 指定输出格式(大写) | output format |
-c | 压缩目标镜像,仅 qcow2 支持 | compress |
-p | 显示转换进度条 | progress |
[root@controller ~]# qemu-img info bionic-server-cloudimg-amd64.vmdk # 先确认源格式[root@controller ~]# qemu-img convert -f vmdk -O qcow2 -c -p \>bionic-server-cloudimg-amd64.vmdk bionic-server-cloudimg-amd64.qcow2[root@controller ~]# qemu-img info bionic-server-cloudimg-amd64.qcow2 # 转完再验一遍[root@controller ~]# openstack image create --disk-format qcow2 --container-format bare \>--min-disk1--min-ram128--public--file./bionic-server-cloudimg-amd64.qcow2 ubuntu_cli-f/-O两个格式参数缺了会靠文件扩展名猜,显式写上最稳。
六、导出与删除
[root@controller ~(keystone_admin)]# openstack image save --file ubuntu.qcow2 ubuntu_cli # 导出到本地[root@controller ~(keystone_admin)]# ls # ubuntu.qcow2 已落在当前目录[root@controller ~(keystone_admin)]# openstack image delete ubuntu_cli # 删除save 是把 Glance 里的镜像数据拉回本地一份,原镜像不动。delete 遇到 protected 镜像会报错,先openstack image set --unprotected解除保护再删。
📚 参考资料(官方文档 · 中英双语)
英文原版
- openstack image 命令参考(python-openstackclient):
image set --accept与成员状态的权威定义 - cirros 镜像下载页
- Ubuntu 云镜像下载
中文版
- OpenStack 中文文档:官方文档中文入口
附:命令英文全称速查表
| 命令 / 缩写 | 英文全称 / 原意 | 作用 |
|---|---|---|
qemu-img | QEMU disk image manipulator | QEMU 磁盘镜像工具 |
info | information | 查看镜像格式与容量 |
convert | convert | 转换镜像格式 |
-c | compress | 压缩目标镜像(仅 qcow2) |
-p | progress | 显示进度条 |
| Glance | Glance Image Service | OpenStack 镜像服务 |
openstack image create / set / save / delete | create / set / save / delete | 镜像注册、改属性、导出、删除 |
--disk-format | disk format | 磁盘格式 |
--container-format | container format | 容器格式,裸镜像 bare |
--min-disk/--min-ram | minimum disk / RAM | 启动镜像的资源下限 |
--protected/--unprotected | protected | 禁止 / 允许删除 |
--shared | shared | 共享可见性 |
image add project | add project | 建立共享成员关系(产生 pending) |
--accept/--reject/--pending | accept / reject / pending | 接收方对成员关系的表态 |
image member list | member | 查看共享成员状态 |
| qcow2 | QEMU copy-on-write v2 | 支持动态扩展、写时复制与压缩的镜像格式 |
| vmdk | Virtual Machine Disk | VMware 磁盘格式 |
总结:镜像管理的因果线是「格式先验证 → 注册填对格式与下限 → 可见性决定谁能用 → 共享必须接收方 accept → 转格式统一成 qcow2」。记住 pending 不等于共享成功,accept 之后才算落地,剩下的大文件、转格式问题都在命令行解决。
📚同系列 · OpenStack 实验手册(其余篇目见博客主页)
blog.csdn.net/nbsxl
- 上一篇:《OpenStack 认证管理:角色、用户、组、项目、配额,五样东西到底谁绑谁》
- 下一篇:《OpenStack 计算管理:实例锁定后被普通用户解锁了?避坑实操》
💬 你共享镜像时卡在哪一步?pending 看不见、accept 报 403,评论区贴出你的报错。