6.1ceph4
使用 rbd 命令管理镜像
status
用于查看哪些客户端在使用该镜像。
[root@client ~]# rbd status images_pool/webapp1 --id rbd
Watchers:
watcher=192.168.108.10:0/2614504094 client.44320
cookie=18446462598732840961
[root@client ~]# rbd status images_pool/webapp2 --id rbd
Watchers: none
du
用于查看镜像大小使用情况
[root@client ~]# rbd du images_pool/webapp1 --id rbd
NAME PROVISIONED USED
webapp1 1 GiB 36 MiB
resize
用于扩展和缩减镜像。
# 扩展未在使用的镜像
[root@client ~]# rbd resize images_pool/webapp2 --size 2G --id rbd
Resizing image: 100% complete...done.
[root@client ~]# rbd du images_pool/webapp2
NAME PROVISIONED USED
webapp2 2 GiB 0 B
# 扩展正在使用的镜像
# 扩展时可以写文件进行测试,扩展不影响数据的读取与写入
[root@client ~]# rbd resize images_pool/webapp1 --size 2G --id rbd
Resizing image: 100% complete...done.
[root@client ~]# lsblk /dev/rbd0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 252:0 0 2G 0 disk /webapp/webapp1
[root@client ~]# df -h /dev/rbd0
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 1014M 40M 975M 4% /webapp/webapp1
[root@client ~]# xfs_growfs /webapp/webapp1/
[root@client ~]# df -h /webapp/webapp1/
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 2.0G 48M 2.0G 3% /webapp/webapp1
# 缩减镜像
[root@client ~]# rbd resize images_pool/webapp2 --size 1G --id rbd
rbd: shrinking an image is only allowed with the --allow-shrink flag
[root@client ~]# rbd resize images_pool/webapp2 --size 1G --allow-shrink --id rbd
Resizing image: 100% complete...done.
[root@client ~]# rbd du images_pool/webapp2 --id rbd
NAME PROVISIONED USED
webapp2 1 GiB 0 B
rename 和 mv
用于重命名镜像,该操作不支持跨池。
# 创建新池
[root@ceph1 ~]# ceph osd pool create images_pool_2 32 32
pool 'images_pool_2' created
[root@ceph1 ~]# rbd pool init images_pool_2
# 重命名
[root@ceph1 ~]# rbd rename images_pool/webapp2 images_pool/webapp02
[root@ceph1 ~]# rbd ls images_pool
webapp02
webapp1
[root@ceph1 ~]# rbd mv images_pool/webapp02 images_pool/webapp2
[root@ceph1 ~]# rbd ls images_pool
webapp1
webapp2
# 跨池重命名
[root@ceph1 ~]# rbd rename images_pool/webapp2 images_pool_2/webapp02
rbd: mv/rename across pools not supported #不支持
source pool: images_pool dest pool: images_pool_2
cp
用于复制镜像。
#实验前观察
[root@client ~]# ceph osd lspools
1 device_health_metrics
2 images_pool
3 images_pool_2
[root@client ~]#
[root@client ~]# rbd ls images_pool
webapp1
webapp2
[root@client ~]# rbd ls images_pool_2
[root@ceph1 ~]# rbd cp images_pool/webapp2 images_pool_2/webapp2 #打这条命令之
前可以先rbd ls -p images_pool_2查看下
Image copy: 100% complete...done.
[root@ceph1 ~]# rbd ls -p images_pool
webapp1
webapp2
[root@ceph1 ~]# rbd ls -p images_pool_2
webapp2 #原来images_pool_2是没有image的,通过copy产生
# 后续将复制的images_pool_2/webapp2挂载到新目录测试
# -o nouuid
trash
使用垃圾箱管理镜像。
# 将镜像放入垃圾箱
[root@ceph1 ~]# rbd ls images_pool #先查看下images_pool
webapp1
webapp2
[root@ceph1 ~]# rbd trash mv images_pool/webapp2
[root@ceph1 ~]# rbd ls images_pool #再验证
webapp1
[root@ceph1 ~]# rbd trash ls images_pool
ada41793809a webapp2
# 恢复垃圾箱中镜像,必须使用id
[root@ceph1 ~]# rbd trash restore -p images_pool ada41793809a
[root@ceph1 ~]# rbd ls images_pool
webapp1
webapp2
[root@client ~]# rbd trash ls images_pool
# 删除垃圾箱中镜像
[root@ceph1 ~]# rbd trash mv images_pool/webapp2
[root@ceph1 ~]# rbd trash ls images_pool
ada41793809a webapp2
[root@ceph1 ~]# rbd trash rm -p images_pool ada41793809a #将回收站中的webapp2
删除
Removing image: 100% complete...done.
[root@ceph1 ~]# rbd trash ls images_pool
[root@ceph1 ~]# rbd ls images_pool
webapp1
rm
用于删除镜像。
[root@ceph1 ~]# rbd rm images_pool_2/webapp2
Removing image: 100% complete...done.
[root@ceph1 ~]# rbd ls images_pool_2
管理 RADOS 块设备快照
RBD 镜像功能
使用 格式 2 的RBD 镜像支持若干可选功能:
-
layering,镜像分层功能,该功能支持快照和克隆。
-
striping,提高性能的分条 v2 功能,由 librbd 提供支持。
-
exclusive-lock,独占锁定功能。
-
object-map,对象映射功能(依赖 exclusive-lock)。
-
fast-diff,快速 diff 命令功能(依赖 object-map 和 exclusive-lock)。
-
deep-flatten,扁平化 RBD 镜像的所有快照。
-
journaling,日志功能(依赖 exclusive-lock)。
-
data-pool,EC 数据池功能。
在RBD的features中,源代码定义如下
#define RBD_FEATURE_LAYERING (1ULL<<0)
#define RBD_FEATURE_STRIPINGV2 (1ULL<<1)
#define RBD_FEATURE_EXCLUSIVE_LOCK (1ULL<<2)
#define RBD_FEATURE_OBJECT_MAP (1ULL<<3)
#define RBD_FEATURE_FAST_DIFF (1ULL<<4)
#define RBD_FEATURE_DEEP_FLATTEN (1ULL<<5)
#define RBD_FEATURE_JOURNALING (1ULL<<6)
#define RBD_FEATURE_DATA_POOL (1ULL<<7)
(1ULL<<0) 2^0=1
(1ULL<<1) 2^1=2
(1ULL<<2) 2^2=4
(1ULL<<3) 2^3=8
(1ULL<<4) 2^4=16
(1ULL<<5) 2^5=32
(1ULL<<6) 2^6=64
(1ULL<<7) 2^7=128
集群中 RBD 镜像默认启用功能:
layering, exclusive-lock, object-map, fast-diff, deep-flatten
[root@ceph1 ~]# ceph config get client rbd_default_features
layering,exclusive-lock,object-map,fast-diff,deep-flatten
-
使用命令 ceph config set client rbd_default_features value 命令设置镜像默认功能。
-
/etc/ceph/ceph.conf 的 [client] 中 rbd_default_features 参数定义镜像支持的功能。
-
命令行创建image时候,可以通过 –image-feature feature-name 指定镜像功能
禁用object-map 功能
[root@ceph1 ~]# rbd feature disable images_pool/webapp1 object-map
启用 object-map 功能
[root@ceph1 ~]# rbd feature enable images_pool/webapp1 object-map
有些功能是永久性的,不能直接禁用和启用,例如 layering。
[root@ceph1 ~]# rbd feature disable images_pool/webapp1 layering
rbd: failed to update image features: (22) Invalid argument
2026-06-01T17:31:15.602+0800 7ff4768033c0 -1 librbd::Operations: cannot update
immutable features
RBD 快照
RBD 快照使用 COW 技术,实现最大程度减少维护快照所需的存储空间。在将写入 I/O 请求应用到 RBD
快照镜像前,集群会将原始数据复制到 I/O 操作所影响对象的 PG 中的另一区域。快照在创建时不会占用
存储空间,随着所包含对象的变化而增大。RBD 镜像支持增量快照。
注意: 在拍摄快照前,一定要完成以下任一操作:
- 卸载文件系统。
- 使用 fsfreeze命令冻结文件系统,只允许读操作。
使用 rbd snap create 命令,创建 Ceph 块设备的快照。
# 重新创建一个镜像
[root@client ~]# export CEPH_ARGS='--id=rbd'
[root@client ~]# rbd create images_pool/webapp --size 2G
[root@client ~]# rbd map images_pool/webapp
/dev/rbd1
[root@client ~]# mkfs.xfs /dev/rbd/images_pool/webapp
[root@client ~]# mkdir /webapp/webapp
[root@client ~]# mount /dev/rbd/images_pool/webapp /webapp/webapp
[root@client ~]# echo Hello World > /webapp/webapp/index.html
[root@client ~]# cat /webapp/webapp/index.html
Hello World
# 卸载文件系统
[root@client ~]# umount /webapp/webapp
# 拍摄快照
[root@client ~]# rbd snap create images_pool/webapp@snap1
Creating snap: 100% complete...done.
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap1 2 GiB Fri Aug 22 17:52:20 2025
# 挂载文件系统,并写入新数据
[root@client ~]# mount /dev/rbd/images_pool/webapp /webapp/webapp
[root@client ~]# echo Hello cyh > /webapp/webapp/index.html
[root@client ~]# cat /webapp/webapp/index.html
Hello cyh
使用 rbd snap ls 命令,列出块设备快照
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap1 2 GiB Fri Aug 22 17:52:20 2025
RBD 快照是创建于特定时间的 RBD 镜像的只读副本。
重要提示:镜像快照和镜像具有相同的文件系统,同一客户端不允许挂载具有相同UUID的文件系统
#将/webapp/webapp里的index.html删除,通过挂载/webapp/webapp@snap1找回来
[root@client ~]# rm /webapp/webapp/index.html
# 在挂载快照前,需要卸载原始镜像
[root@client ~]# umount /dev/rbd/images_pool/webapp
[root@client ~]# mkdir /webapp/webapp-snap1
[root@client ~]# rbd map images_pool/webapp@snap1
/dev/rbd2
[root@client ~]# mount /dev/rbd/images_pool/webapp@snap1 /webapp/webapp-snap1
mount: /webapp/webapp1-snap1: WARNING: device write-protected, mounted read-only.
[root@client ~]# cat /webapp/webapp-snap1/index.html #将快照里的文件复制出来,
实现数据找回
Hello World
使用 rbd snap rollback 命令,回滚块设备快照,并用快照中的数据覆盖镜像的当前版本
# 还原上一个实验
[root@client ~]# umount /webapp/webapp-snap1/
[root@client ~]# mount /dev/rbd1 /webapp/webapp
# 回滚快照失败,排他锁导致的
[root@client ~]# rbd snap rollback images_pool/webapp@snap1
Rolling back to snapshot: 0% complete...failed.
rbd: rollback failed: (30) Read-only file system
# 要先卸载原来的镜像挂载,且要取消rbd map
[root@client ~]# rbd device ls
id pool namespace image snap device
0 images_pool webapp1 - /dev/rbd0
1 images_pool webapp - /dev/rbd1
2 images_pool webapp snap1 /dev/rbd2
[root@client ~]# rbd unmap /dev/rbd1
[root@client ~]# rbd device ls
id pool namespace image snap device
0 images_pool webapp1 - /dev/rbd0
2 images_pool webapp snap1 /dev/rbd2
[root@client ~]# rbd snap rollback images_pool/webapp@snap1
Rolling back to snapshot: 100% complete...done.
# 回滚好后再将webapp image挂载
[root@client ~]# rbd device map images_pool/webapp
/dev/rbd1
[root@client ~]# mount /dev/rbd1 /webapp/webapp
# 最后观察现象
[root@client ~]# cat /webapp/webapp/index.html
Hello World
使用 rbd snap rm 命令,删除 Ceph 块设备的快照。
[root@client ~]# umount /dev/rbd/images_pool/webapp@snap1
[root@client ~]# rbd unmap images_pool/webapp@snap1
[root@client ~]# rbd snap rm images_pool/webapp@snap1
Removing snap: 100% complete...done.
[root@client ~]# rbd snap ls images_pool/webapp
使用 rbd snap purge 命令,删除镜像所有快照。
[root@client ~]# rbd snap create images_pool/webapp@snap1
[root@client ~]# rbd snap create images_pool/webapp@snap2
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
6 snap1 2 GiB Fri Aug 22 18:07:20 2025
7 snap2 2 GiB Fri Aug 22 18:07:22 2025
[root@client ~]# rbd snap purge images_pool/webapp
Removing all snapshots: 100% complete...done.
[root@client ~]# rbd snap ls images_pool/webapp
RBD 克隆
RBD 克隆是 RBD 镜像的可读写副本,它使用受保护的 RBD 快照克隆。RBD 克隆也可以被扁平化,转换
为独立于来源的 RBD 镜像。
克隆过程有三个步骤:
- 创建快照
[root@client ~]# rbd snap create images_pool/webapp@snap1
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 2 GiB Fri Aug 22 18:10:18 2025 #看PROTECTED
列默认未保护
- 保护快照以免被删除
[root@client ~]# rbd snap protect images_pool/webapp@snap1
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 snap1 2 GiB yes Fri Aug 22 18:10:18 2025
- 使用受保护的快照创建克隆
[root@client ~]# rbd clone images_pool/webapp@snap1 images_pool/webapp-clone-
1
[root@client ~]# rbd map images_pool/webapp-clone-1
/dev/rbd3
[root@client ~]# mkdir /webapp/webapp-clone-1
[root@client ~]# umount /webapp/webapp # 挂载clone前确保镜像和快照不要
挂载
# 挂载clone前确保镜像和快照不要挂载
[root@client ~]# mount /dev/rbd/images_pool/webapp-clone-1 /webapp/webappclone-1
[root@client ~]# df /webapp/webapp-clone-1/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/rbd2 2086912 47864 2039048 3% /webapp/webapp-clone-1
新创建的克隆可以像常规 RBD 镜像一样运作,克隆支持 COW 和 COR技术,默认只支持 COW。
COW 会将父快照数据复制到克隆中,然后将写入 I/O 请求应用到克隆。
[root@ceph1 ~]# ceph config get client rbd_clone_copy_on_read
false
RBD 克隆未启用 COR 功能时,父 RBD 快照和克隆相同的数据会直接从父快照读取。相对于客户端而
言,父快照的 OSD 具有较高的延迟,这种操作会提高读取的代价。
如果用户启用了 COR,并且克隆中尚未存在数据,则 Ceph 会在处理读取 I/O 请求前先从父快照复制数
**据到克隆。**通过为客户端或全局设置运行 ceph config set client rbd_clone_copy_on_read true命令或 ceph ceph config set global rbd_clone_copy_on_read true 命令来激活 COR 功能。原始数据不会被覆盖。
# ceph config set client rbd_clone_copy_on_read true
# ceph config get client rbd_clone_copy_on_read
true
查看基于特定快照的克隆列表
[root@client ~]# rbd clone images_pool/webapp@snap1 images_pool/webapp-clone-2
[root@client ~]# rbd children images_pool/webapp@snap1
images_pool/webapp-clone-1
images_pool/webapp-clone-2
扁平化克隆,Ceph 会将所有缺失的数据从父级复制到克隆,然后移除对父级的引用。克隆会变成独立的
RBD 镜像,不再是受保护快照的子级。
[root@client ~]# rbd flatten images_pool/webapp-clone-1
Image flatten: 100% complete...done.
[root@client ~]# rbd children images_pool/webapp@snap1
images_pool/webapp-clone-2
[root@client ~]# rbd ls images_pool
挂载克隆镜像
通过镜像快照克隆出来的镜像,具有原镜像相同的文件系统,修改文件系统UUID。
假设客户端将克隆出来的镜像映射为/dev/rbd3设备。操作如下:
[root@client ~]# rbd map images_pool/webapp-clone-2
/dev/rbd4
blkid | grep rbd #看UUID
# 生成新的 UUID
[root@client ~]# uuidgen
e0e005e5-c8a0-4102-a266-3964c7069e18
# 修改 ext4 文件系统 UUID
[root@client ~]# tune2fs -U e0e005e5-c8a0-4102-a266-3964c7069e18 /dev/rbd4
# 修改 xfs 文件系统 UUID
[root@client ~]# xfs_admin -U e0e005e5-c8a0-4102-a266-3964c7069e18 /dev/rbd4
Clearing log and setting UUID
writing all SBs
new UUID = e0e005e5-c8a0-4102-a266-3964c7069e18
# 挂载测试
[root@client ~]# mkdir /webapp/webapp-clone-2
[root@client ~]# mount /dev/rbd4 /webapp/webapp-clone-2/
#查看现象
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─cs-root 253:0 0 70G 0 lvm /
├─cs-swap 253:1 0 3.9G 0 lvm [SWAP]
└─cs-home 253:2 0 125.1G 0 lvm /home
sr0 11:0 1 12.8G 0 rom
rbd0 252:0 0 2G 0 disk /webapp/webapp1
rbd1 252:16 0 2G 0 disk
rbd2 252:32 0 2G 1 disk
rbd3 252:48 0 2G 0 disk /webapp/webapp-clone-1
rbd4 252:64 0 2G 0 disk /webapp/webapp-clone-2 #挂载上了
第 7 章 Ceph 分布式存储 对象存储管理
对象存储介绍
Ceph 对象网关是一个构建在librados之上的对象存储接口,Ceph 对象存储支持两个接口:
-
兼容 S3 :通过与 Amazon S3 RESTful API 的大部分子集兼容的接口提供对象存储功能。
-
兼容 Swift:提供对象存储功能,其接口与 OpenStack Swift API 的大部分子集兼容。 Ceph 对象存储使用 Ceph 对象网关守护进程 ( radosgw),它是用于与 Ceph 存储集群交互的 HTTP 服务器。由于它提供了与 OpenStack Swift 和 Amazon S3 兼容的接口,因此 Ceph 对象网关有自己的用户管理。
对象存储简介
对象存储是一个基于对象的存储服务, 提供海量、 安全、 高可靠、 低成本的数据存储能力。
对象存储将数据存储为离散项,每一项也是一个对象。每个对象都具有唯一的对象ID(也称对象密
钥),用户可在不了解对象位置的情况下,通过对象ID进行存储或检索。
对象存储中的对象实际是一个文件数据与其相关属性信息的集合体, 包括三个部分:
Key:键值,即对象的名称,为经过 UTF-8 编码的长度大于0且不超过1024的字符序列。一个桶里的每个对象必须拥有唯一的对象键值。
Metadata:元数据,即对象的描述信息,包括系统元数据和用户元数据,这些元数据以键值对(Key-Value)的形式被上传到对象存储中。元数据由对象存储产生,在处理对象数据时使用,包括Date, Content-length,Last-modify, ETag等。
Data:数据,即文件的数据内容。
对象存储在扁平的命名空间中,称为桶,是对象存储存储对象的容器。 桶中的所有对象都处于同一逻辑
层级, 去除了文件系统中的多层级树形目录结构。每个桶都有自己的存储类别、 访问权限、 所属区域等
属性, 用户可以在不同区域创建不同存储类别和访问权限的桶, 并配置更多高级属性来满足不同场景的存储诉求。
对象存储特征
接入灵活:支持多种形态客户端,如通过用对象存储接口、 RESTful接口、 SDK等。
访问协议简单:使用http或https协议访问。
访问网络不受限:通过互联网或局域网都进行访问。
结构扁平化:对象直接存放在桶中,无目录结构。
RADOS 网关介绍
RADOS 网关简介
RADOS GateWay,也称对象网关 (RGW),为客户端提供标准对象存储 API 来访问 Ceph 集群。
Ceph 存储支持 Amazon S3(简单存储服务)和 OpenStack Swift(OpenStack 对象存储)两种常
用的对象 API。Amazon S3 将对象存储的扁平命名空间称为存储桶,而 OpenStack Swift 则将其称为容器。
守护进程 radosgw 在 librados 库的基础上构建,提供基于 Beast HTTP、WebSocket 和网络协议库的 Web 服务接口,作为处理 API 请求的前端。
radosgw 是Ceph存储的客户端,用于访问对象存储中对象。
RADOS 网关中用户只能访问网关,不能像cephx 用户一样直接访问存储集群。提交 Amazon S3 或
OpenStack Swift API 请求时,RADOS 网关客户端会使用这些网关用户帐户进行身份验证。网关用户通
过 RADOS 网关完成身份验证后,网关会使用 cephx 凭据向存储集群进行身份验证,以处理对象请求。
也可通过集成基于 LDAP 的外部身份验证服务来管理网关用户。
RADOS 网关会为默认区域创建多个池:
-
.rgw.root,存储信息记录。
-
.default.rgw.control,控制池。
-
.default.rgw.meta,存储 user_keys 和其他关键元数据。
-
.default.rgw.log,包含所有存储桶/容器和对象操作(如创建、读取和删除)的日志。
-
.default.rgw.buckets.index,存储存储桶的索引。
-
.default.rgw.buckets.data,存储存储桶数据。
- .default.rgw.buckets.non-ec,用于对象元数据上传。
用户也可以手动创建这些池。建议这些池名称以区域名称为前缀,例如区域名称是 us-east-1,则池名称
可以是 .us-east-1.rgw.buckets.data。
RADOS 网关架构
Ceph RADOS 网关支持多站点部署:在多个 Ceph 存储集群之间自动复制对象数据。常见的用例是在地
理上分隔的集群之间进行主动/主动复制,以便于灾难恢复。
-
**区域(**zone),每个区域会关联一个或多个 RADOS 网关,这些网关关联Ceph 存储。
-
**区域组(**zone group **),区域组是由一个或多个区域的集合。**存储在区域组中某个区域中的数据
会被复制到该区域组中的所有其他区域。每个区域组中会有一个区域为该组的主区域**,该组中的其他区域为**次要区域。
- 域 (realm) ,代表所有对象和存储桶的全局命名空间。域中含有一个或多个区域组,各自包含一个或多个区域。域中会指定一个区域组为主区域组,其他都是次要区域组。域 (realm) 中的所有RADOS 网关都从位于主区域组中主区域中的 RADOS 网关拉取配置。因为主区域组中的主区域负责处理所有元数据更新,所以创建用户等操作都必须在主区域进行。
RADOS 网关部署
Ceph 使用 Ceph 编排器来部署(或删除) RADOS 网关服务,用于管理单个集群或多个集群。使用集中
式配置数据库中的 client.rgw.\ 部分来定义新 RADOS 网关守护进程的参数和特征。
对象存储网关部署流程:
- 创建对象存储域
- 创建对象网关
# 创建 realm
[root@ceph1 ~ 14:24:45]# radosgw-admin realm create --rgw-realm=webapp --default
{
"id": "ac24e595-503f-4175-90a6-3b3fc5d3b5a1",
"name": "webapp",
"current_period": "1e2c836d-1939-4218-a4f9-baf92075534e",
"epoch": 1
}
# 创建master zone group
[root@ceph1 ~ 15:02:38]# radosgw-admin zonegroup create --rgw-realm=webapp --rgw-zonegroup=video --master --default
{
"id": "07d1567f-e466-43c5-8911-39aa3cc0430d",
"name": "video",
"api_name": "video",
"is_master": "true",
"endpoints": [],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "",
"zones": [],
"placement_targets": [],
"default_placement": "",
"realm_id": "ac24e595-503f-4175-90a6-3b3fc5d3b5a1",
"sync_policy": {
"groups": []
}
}
[root@ceph1 ~ 15:03:43]# radosgw-admin zonegroup list
{
"default_info": "07d1567f-e466-43c5-8911-39aa3cc0430d",
"zonegroups": [
"video"
]
}
# 创建 zone,并将其设置为 master
[root@ceph1 ~ 15:04:05]# radosgw-admin zone create --rgw-realm=webapp --rgw-zonegroup=video --rgw-zone=storage1 --master --default
{
"id": "aec3cdc5-7059-48ca-b0ed-6481a258ce4d",
"name": "storage1",
"domain_root": "storage1.rgw.meta:root",
"control_pool": "storage1.rgw.control",
"gc_pool": "storage1.rgw.log:gc",
"lc_pool": "storage1.rgw.log:lc",
"log_pool": "storage1.rgw.log",
"intent_log_pool": "storage1.rgw.log:intent",
"usage_log_pool": "storage1.rgw.log:usage",
"roles_pool": "storage1.rgw.meta:roles",
"reshard_pool": "storage1.rgw.log:reshard",
"user_keys_pool": "storage1.rgw.meta:users.keys",
"user_email_pool": "storage1.rgw.meta:users.email",
"user_swift_pool": "storage1.rgw.meta:users.swift",
"user_uid_pool": "storage1.rgw.meta:users.uid",
"otp_pool": "storage1.rgw.otp",
"system_key": {
"access_key": "",
"secret_key": ""
},
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "storage1.rgw.buckets.index",
"storage_classes": {
"STANDARD": {
"data_pool": "storage1.rgw.buckets.data"
}
},
"data_extra_pool": "storage1.rgw.buckets.non-ec",
"index_type": 0
}
}
],
"realm_id": "ac24e595-503f-4175-90a6-3b3fc5d3b5a1",
"notif_pool": "storage1.rgw.log:notif"
}
# 提交配置
[root@ceph1 ~ 15:05:20]# radosgw-admin period update --rgw-realm=webapp --commit
# 查看配置
[root@ceph1 ~ 15:06:00]# radosgw-admin zone get --rgw-zone=storage1
{
"id": "aec3cdc5-7059-48ca-b0ed-6481a258ce4d",
"name": "storage1",
"domain_root": "storage1.rgw.meta:root",
"control_pool": "storage1.rgw.control",
"gc_pool": "storage1.rgw.log:gc",
"lc_pool": "storage1.rgw.log:lc",
"log_pool": "storage1.rgw.log",
"intent_log_pool": "storage1.rgw.log:intent",
"usage_log_pool": "storage1.rgw.log:usage",
"roles_pool": "storage1.rgw.meta:roles",
"reshard_pool": "storage1.rgw.log:reshard",
"user_keys_pool": "storage1.rgw.meta:users.keys",
"user_email_pool": "storage1.rgw.meta:users.email",
"user_swift_pool": "storage1.rgw.meta:users.swift",
"user_uid_pool": "storage1.rgw.meta:users.uid",
"otp_pool": "storage1.rgw.otp",
"system_key": {
"access_key": "",
"secret_key": ""
},
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "storage1.rgw.buckets.index",
"storage_classes": {
"STANDARD": {
"data_pool": "storage1.rgw.buckets.data"
}
},
"data_extra_pool": "storage1.rgw.buckets.non-ec",
"index_type": 0
}
}
],
"realm_id": "",
"notif_pool": "storage1.rgw.log:notif"
}
RADOS 网关部署
RADOS 网关部署命令行
# 创建 rgw,并和已创建的 realm webapp 进行关联,数量为 3
[root@ceph1 ~ 15:06:26]# ceph orch apply rgw webapp --placement="3 ceph1.cyh.cloud ceph2.cyh.cloud ceph3.cyh.cloud" --realm=webapp --zone=storage1 --port=8080
Scheduled rgw.webapp update...
# 查看服务
[root@ceph1 ~ 15:21:58]# ceph orch ls rgw
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
rgw.webapp ?:8080 0/3 - 14s ceph1.cyh.cloud;ceph2.cyh.cloud;ceph3.cyh.cloud;count:3
# 查看进程
[root@ceph1 ~ 15:22:13]# ceph orch ps --daemon-type rgw| awk '{print $1,$4}'
NAME STATUS
rgw.webapp.ceph1.vzyfjd running
rgw.webapp.ceph2.ruwtoa running
rgw.webapp.ceph3.gqydox running
验证对象存储是否可以访问
[root@ceph1 ~ 15:23:15]# curl http://ceph1.cyh.cloud:8080
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
[root@ceph1 ~ 15:23:42]# curl http://ceph2.cyh.cloud:8080
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
[root@ceph1 ~ 15:23:54]# curl http://ceph3.cyh.cloud:8080
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>[root@ceph1 ~ 15:23:59]#
管理对象网关用户
创建用户
使用 radosgw-admin user create 命令来创建 RADOS 网关用户。
-
必选选项 --uid 和 --display-name ,指定唯一的帐户名和人性化显示名。
-
可选选项 --access-key 和 --secret,指定自定义 AWS 帐户和机密密钥。
示例:
[root@ceph1 ~ 15:41:49]# radosgw-admin user create --uid="operator" --display-name="s3Operator" --email="operator@example.com" --access-key="12345" --secret-key="67890"
{
"user_id": "operator",
"display_name": "s3Operator",
"email": "operator@example.com",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "operator",
"access_key": "12345",
"secret_key": "67890"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
如果未指定访问密钥和机密密钥,则自动生成,并显示在输出中。
[root@ceph1 ~ 15:44:01]# radosgw-admin user create --uid=s3user --display-name="Amazon s3 API user"
{
"user_id": "s3user",
"display_name": "Amazon s3 API user",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "s3user",
"access_key": "CDZA9NBZOA9DQ93ZWCFX",
"secret_key": "EYAD1YBbIWMrDvAL2YkiVwLcVGt53E3LQjQt2UEW"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
**注意:**radosgw-admin 命令自动生成的访问密钥和机密密钥可能包含 JSON 转义字符()。客户端可能无
法正确处理此字符。建议重新生成或手动指定密钥以避免此问题。
重新生成密钥
仅重新生成现有用户的机密密钥。
[root@ceph1 ~ 15:44:57]# radosgw-admin key create --uid=s3user --access-key=CDZA9NBZOA9DQ93ZWCFX" --gen-secret
添加用户访问密钥
若要为现有用户添加访问密钥,请使用 –gen-access-key 选项。创建额外的密钥可以方便地授予同一用
户对需要不同或唯一密钥的多个应用的访问权限。
[root@ceph1 ~ 15:47:04]# radosgw-admin key create --uid=s3user --gen-access-key{
"user_id": "s3user",
"display_name": "Amazon s3 API user",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "s3user",
"access_key": "02AQGDF3F3IPHQ0L1W0J",
"secret_key": "gQwmDXoP5YSRX10XzFfnvAFGH6BkEPQHpoeQrBmm"
},
{
"user": "s3user",
"access_key": "CDZA9NBZOA9DQ93ZWCFX",
"secret_key": "EYAD1YBbIWMrDvAL2YkiVwLcVGt53E3LQjQt2UEW"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
删除用户密钥
要从用户删除访问密钥和相关的机密密钥,请使用 radosgw-admin key rm --access-key 命令。此操
作非常适用于删除单个应用访问权限,并且不会影响使用其他密钥的访问权限。
[root@ceph1 ~ 15:47:46]# radosgw-admin key rm --uid=s3user --access-key=02AQGDF3F3IPHQ0L1W0J
{
"user_id": "s3user",
"display_name": "Amazon s3 API user",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "s3user",
"access_key": "CDZA9NBZOA9DQ93ZWCFX",
"secret_key": "EYAD1YBbIWMrDvAL2YkiVwLcVGt53E3LQjQt2UEW"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
临时禁用对象网关用户
使用 radosgw-admin user suspend 命令可临时禁用 RADOS 网关用户,用户的子用户也会暂停,无法与 RADOS 网关服务交互。
[root@ceph1 ~ 15:48:34]# radosgw-admin user suspend --uid=s3user
{
"user_id": "s3user",
"display_name": "Amazon s3 API user",
"email": "",
"suspended": 1,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
....
注意:suspended的值为1
临时启用对象网关用户
使用 radosgw-admin user enable 命令可启用 RADOS 网关用户。
[root@ceph1 ~ 16:29:16]# radosgw-admin user enable --uid=s3user
{
"user_id": "s3user",
"display_name": "Amazon s3 API user",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "s3user",
...
注意:suspended的值为0。
修改用户信息
用户可修改用户信息,如电子邮件、显示名、密钥和访问控制级别。
[root@ceph1 ~ 16:29:26]# radosgw-admin user modify --uid=s3user --display-name=huitailang
{
"user_id": "s3user",
"display_name": "huitailang",
"email": "",
"suspended": 0,
"max_buckets": 1000,
...
[root@ceph1 ~ 16:29:36]# radosgw-admin user modify --uid=s3user --access=full
{
"user_id": "s3user",
"display_name": "huitailang",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
...
删除用户
若要移除用户,同时删除其对象和存储桶,需使用 --purge-data 选项。
[root@ceph1 ~ 16:29:42]# radosgw-admin user list
[
"operator",
"dashboard",
"s3user"
]
[root@ceph1 ~ 16:29:50]# radosgw-admin user rm --uid=s3user --purge-data
[root@ceph1 ~ 16:29:58]# radosgw-admin user list
[
"operator",
"dashboard"
]
使用 Amazon S3 API 访问对象存储
Amazon S3 API 介绍
在混合云环境中,用户希望应用可以通过相同的 API 无缝混用私有企业、公共云资源和存储位置。Ceph
存储支持使用 Amazon S3 API 接口管理对象存储资源。
Amazon S3 API 称命名空间为存储桶,用于存储对象。要使用 Amazon S3 API 管理对象和存储桶,应
用需通过 RADOS 网关用户进行身份验证。每个用户都有一个识别用户的 access key 和一个对用户进行
身份验证的 secret key。
使用 Amazon S3 API 时,需考虑对象和元数据的大小限制:
-
对象大小介于 0B 和 5 TB 之间。
-
单次上传操作的最大大小为 5GB。
-
使用分段上传功能可上传 100MB 以上的对象。
-
单个 HTTP 请求中的元数据大小最大为 16,000 字节。
安装 Amazon S3 API 客户端
Amazon S3 API 客户端有多个,例如 awscli、cloudberry、cyberduck 和 curl。
这里我们讲解 aws **工具。**aws工具由awscli 软件包提供。
以下演示通过pip方式安装。
# 准备 aliyun 源 pip 仓库
[root@client ~ 16:31:55]# mkdir .pip
[root@client ~ 16:32:02]# cat > .pip/pip.conf << 'EOF'
> [global]
> index-url = http://mirrors.aliyun.com/pypi/simple/
> [install]
> trusted-host=mirrors.aliyun.com
> EOF
# 安装软件包
[root@client ~ 16:32:09]# pip3 install awscli
使用 Amazon S3 API 客户端
aws 命令帮助信息
[root@client ~ 16:35:16]# aws
Note: AWS CLI version 2, the latest major version of the AWS CLI, is now stable and recommended for general use. For more information, see the AWS CLI version 2 installation instructions at: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:
aws help
aws <command> help
aws <command> <subcommand> help
aws: error: the following arguments are required: command
配置 AWS CLI 凭据
配置 AWS CLI 工具默认凭据:使用 operator 用户,输入 12345 作为访问密钥,67890 作为机密密钥
[root@client ~ 16:35:28]# aws configure
AWS Access Key ID [None]: 12345
AWS Secret Access Key [None]: 67890
Default region name [None]:
Default output format [None]:
配置信息保存在~/.aws目录。
[root@client ~ 16:35:57]# ls .aws
config credentials
[root@client ~ 16:36:04]# cat .aws/config
[default]
[root@client ~ 16:36:14]# cat .aws/credentials
[default]
aws_access_key_id = 12345
aws_secret_access_key = 67890
**注意:**aws 命令默认使用 default 中凭据。
#如果想配置多个凭据,配置如下:
[root@client ~ 16:36:52]# aws configure --profile=ceph
AWS Access Key ID [None]: 12345
AWS Secret Access Key [None]: 67890
Default region name [None]:
Default output format [None]:
[root@client ~ 16:38:24]# cat .aws/config
[default]
[profile ceph]
[root@client ~ 16:38:33]# cat .aws/credentials
[default]
aws_access_key_id = 12345
aws_secret_access_key = 67890
[ceph]
aws_access_key_id = 12345
aws_secret_access_key = 67890
创建存储桶
环境准备:
client:
[root@client ~ 16:52:14]# scp 192.168.108.11:/etc/hosts /etc/hosts root@192.168.108.11's password:
hosts 100% 438 171.3KB/s 00:00
可以通过选项 –profile 指定凭据,–endpoint 指定服务器位置
[root@client ~ 16:53:09]# aws --endpoint=http://ceph1.cyh.cloud:8080 s3 mb s3://webapp
make_bucket: webapp
查看存储桶清单
示例:
[root@client ~ 16:53:17]# aws --endpoint=http://ceph1.cyh.cloud:8080 s3 ls
2026-06-01 16:39:17 webapp
radosgw-admin 命令也支持存储桶操作,例如使用 radosgw-admin bucket list 或 radosgw-admin
bucket rm 命令。
[root@client ~ 16:53:26]# radosgw-admin buckets list
上传对象到存储桶
cp 子命令支持三种复制方向:
-
,将本地文件上传到对象存储中。
-
,下载对象存储中对象到本地。
-
,将对象存储中对象复制到对象存储中。
示例:
[root@client ~ 16:53:46]# echo Hello World > Welcome-pub.html
[root@client ~ 16:53:56]# echo Hello cyh > Welcome-pri.html
[root@client ~ 16:54:07]# aws --endpoint=http://ceph1.cyh.cloud:8080 s3 cp Welcome-pub.html s3://webapp/ --acl=public-read-write
upload: ./Welcome-pub.html to s3://webapp/Welcome-pub.html
[root@client ~ 16:54:40]# aws s3 cp Welcome-pri.html s3://webapp --endpoint=http://ceph1.cyh.cloud:8080
upload: ./Welcome-pri.html to s3://webapp/Welcome-pri.html
查看存储桶中对象
[root@client ~ 16:55:09]# aws s3 ls s3://webapp --endpoint=http://ceph1.cyh.cloud:8080
2026-06-01 16:55:09 10 Welcome-pri.html
2026-06-01 16:54:39 12 Welcome-pub.html
下载存储桶中对象
# 下载单个
[root@client ~ 16:55:23]# aws s3 cp s3://webapp/Welcome-pri.html /tmp --endpoint=http://ceph1.cyh.cloud:8080
download: s3://webapp/Welcome-pri.html to ../tmp/Welcome-pri.html
[root@client ~ 16:55:50]# ls /tmp/Welcome-pri.html
/tmp/Welcome-pri.html
# 使用选项 --recursive 递归下载bucket中所有对象
[root@client ~ 16:55:57]# aws s3 cp s3://webapp /tmp --recursive --endpoint=http://ceph1.cyh.cloud:8080
download: s3://webapp/Welcome-pri.html to ../tmp/Welcome-pri.html
download: s3://webapp/Welcome-pub.html to ../tmp/Welcome-pub.html
# 使用wget或者curl下载
[root@client ~ 16:56:42]# wget http://ceph1.cyh.cloud:8080/webapp/Welcome-pub.html
--2026-06-01 16:56:54-- http://ceph1.cyh.cloud:8080/webapp/Welcome-pub.html
Resolving ceph1.cyh.cloud (ceph1.cyh.cloud)... 192.168.108.11
Connecting to ceph1.cyh.cloud (ceph1.cyh.cloud)|192.168.108.11|:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12 [text/html]
Saving to: ‘Welcome-pub.html.1’
Welcome-pub.html.1 100%[==================>] 12 --.-KB/s in 0.001s
可以正常下载
2026-06-01 16:56:54 (7.97 KB/s) - ‘Welcome-pub.html.1’ saved [12/12]
[root@client ~ 16:56:54]# wget http://ceph1.cyh.cloud:8080/webapp/Welcome-pri.html
--2026-06-01 16:57:08-- http://ceph1.cyh.cloud:8080/webapp/Welcome-pri.html
Resolving ceph1.cyh.cloud (ceph1.cyh.cloud)... 192.168.108.11
Connecting to ceph1.cyh.cloud (ceph1.cyh.cloud)|192.168.108.11|:8080... connected.
HTTP request sent, awaiting response... 403 Forbidden
2026-06-01 16:57:08 ERROR 403: Forbidden.
不可以下载,因为权限不允许
删除存储桶中对象
[root@client ~ 16:57:08]# aws s3 rm s3://webapp/Welcome-pri.html --endpoint=http://ceph1.cyh.cloud:8080
delete: s3://webapp/Welcome-pri.html
[root@client ~ 16:57:25]# aws s3 ls s3://webapp --endpoint=http://ceph1.cyh.cloud:8080
2026-06-01 16:54:39 12 Welcome-pub.html
删除存储桶
# 非空的存储桶不能删除
[root@client ~ 16:57:36]# aws s3 rb s3://webapp --endpoint=http://ceph1.cyh.cloud:8080
remove_bucket failed: s3://webapp argument of type 'NoneType' is not iterable
# 清空存储桶,再次删除
[root@client ~ 16:57:52]# aws s3 rm s3://webapp --recursive --include "Welcome-*" --endpoint=http://ceph1.cyh.cloud:8080
delete: s3://webapp/Welcome-pub.html
[root@client ~ 16:58:11]# aws s3 rb s3://webapp --endpoint=http://ceph1.cyh.cloud:8080
remove_bucket: webapp
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)