Ceph 分布式存储 认证和授权管理
cephx 协议
Ceph 存储使用 cephx 协议管理集群认证。
管理用户账户
查看用户账户
要列出现有用户帐户,可运行 ceph auth ls 或者 ceph auth list 命令
bash
[root@ceph1 ~]# ceph auth list
osd.0
key: AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
......
获取特定帐户的详细信息,可使用 ceph auth get 命令
bash
[root@ceph1 ~]# ceph auth get osd.0
[osd.0]
key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow *"
exported keyring for osd.0
要获取特定帐户的key内容
bash
[root@ceph1 ~]# ceph auth get-key osd.0
AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
[root@ceph1 ~]# ceph auth print-key osd.0
AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
[root@ceph1 ~]# ceph auth print_key osd.0
AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
创建用户账户
bash
[root@ceph1 ~]# ceph auth add client.app1
added key for client.app1
[root@ceph1 ~]# ceph auth get-or-create client.app2
[client.app2]
key = AQC2vKZoZQzOCRAAWn6PfXhyMxh3/i4KTTvKQg==
[root@ceph1 ~]# ceph auth get-or-create-key client.app3
AQDFvKZoF8/iDxAAV7gMq2lnCQcLs9NAQGH5Kg==
还可以在创建用户账户的时候,赋予用户账户权限
bash
##增加读权限
[root@ceph1 ~]# ceph auth add client.app4 mon 'allow r'
added key for client.app4
删除用户账户
bash
[root@ceph1 ~]# ceph auth del client.app3
updated
[root@ceph1 ~]# ceph auth rm client.app2
updated
[root@ceph1 ~]# ceph auth ls | grep client.app
installed auth entries:
client.app1
client.app4
导出和导入用户账户
要导出特定帐户的详细信息,可使用命令:
ceph auth export -o
ceph auth get -o
bash
[root@ceph1 ~]# ceph auth export osd.0 -o ceph.osd.0.keyring.1
export auth(key=AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==)
[root@ceph1 ~]# cat ceph.osd.0.keyring.1
[osd.0]
key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow *"
[root@ceph1 ~]# ceph auth get osd.0 -o ceph.osd.0.keyring.2
exported keyring for osd.0
[root@ceph1 ~]# cat ceph.osd.0.keyring.2
[osd.0]
key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow *"
导入特定帐户的详细信息,使用 ceph auth import -i 命令
bash
# 先导出client.app4然后删除client.app4
[root@ceph1 ~]# ceph auth export client.app4 -o ceph.client.app4.keyring
export auth(key=AQDnvKZoY7irCRAA5ap2HQ1nQ2ADHSJRJWtczw==)
[root@ceph1 ~]# ceph auth rm client.app4
updated
[root@ceph1 ~]# ceph auth get client.app4
Error ENOENT: failed to find client.app4 in keyring
# 将刚才删除的client.app4导入观察现象
[root@ceph1 ~]# ceph auth import -i ceph.client.app4.keyring
imported keyring
[root@ceph1 ~]# ceph auth get client.app4
[client.app4]
key = AQDnvKZoY7irCRAA5ap2HQ1nQ2ADHSJRJWtczw==
caps mon = "allow r"
exported keyring for client.app4
用户账户功能
cephx 中的权限称为功能
allow,在守护进程的访问权限之前设置
r,授予读取访问权限
w,授予写入访问权限
x,授予执行扩展对象类的权限
class-read ,让用户能够调用类读取方法
class-write,让用户能够调用类写入方法
*,授予完整访问权限
bash
[root@ceph1 ~]# ceph auth add client.laogao mon 'allow r' osd 'allow rw'
限制访问范围
池
限制用户只能访问他们需要的池。
bash
[root@ceph1 ~]# ceph auth get-or-create client.formyapp1 mon 'allow r' osd
'allow rw pool=myapp'
[client.formyapp1]
key = AQAMxqZodL12BhAA0IyPEV6SqT+9cLpr+k1DPw==
命名空间
限制用户帐户仅访问从属于特定命名空间中对象。
bash
[root@ceph1 ~]# ceph auth get-or-create client.formyapp2 mon 'allow r' osd
'allow rw namespace=photos'
[client.formyapp2]
key = AQA6xqZolcVtBxAAMGJtK4hes9LLfuwaoTnMFA==
池和命名空间
限制用户帐户仅访问特定池中特定命名空间中对象
bash
[root@ceph1 ~]# ceph auth get-or-create client.formyapp3 mon 'allow r' osd
'allow rw pool=myapp namespace=photos'
[client.formyapp3]
key = AQBmxqZo9uExExAAePkx63ERHvgGmMiEJd4GEg==
对象名称前缀
限制用户帐户仅访问特定名称前缀的对象
bash
[root@ceph1 ~]# ceph auth get-or-create client.formyapp4 mon 'allow r' osd
'allow rw object_prefix pref'
[client.formyapp4]
key = AQCYxqZorsmOHxAAlQMGO+Ouv719SN1/BLpy8w==
文件路径
限制用户帐户仅访问 Ceph 文件系统 (CephFS) 中特定目录
bash
[root@ceph1 ~]# ceph fs authorize cephfs client.webdesigner /webcontent rw
monitor 命令
限制用户帐户只能使用一组特定的命令
bash
[root@ceph1 ~]# ceph auth get-or-create client.operator1 mon 'allow r, allow
command "auth get-or-create", allow command "auth list"'
[client.operator1]
key = AQDdxqZotZpCFRAAI1DFw519uGF/EbAF2KB6GQ==
实践1:
创建一个可执行ceph auth list的用户,并使用该用户执行该命令
bash
[root@ceph1 ~]# ceph auth get-or-create client.gaoqiaodong mon 'allow r,allow
command "auth list"'
[client.gaoqiaodong]
key = AQCn56Zo8hxHFxAA1GnGWHE9RRGe6TnglJIoVg==
[root@ceph1 ~]# ceph auth get client.gaoqiaodong -o /etc/ceph/ceph.client.gaoqiaodong.keyring
exported keyring for client.gaoqiaodong
[root@ceph1 ~]# ceph auth ls --id gaoqiaodong
#执行等同于auth list的auth ls都不行
Error EACCES: access denied
[root@ceph1 ~]# ceph auth list --id gaoqiaodong
osd.0
key: AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
......
Ceph 分布式存储 块存储管理

管理 RADOS 块设备
块设备是服务器、笔记本电脑和其他计算系统上最为常见的长期存储设备
创建 RBD 镜像
bash
[root@ceph1 ~]# ceph osd pool create images_pool
pool 'images_pool' created
[root@ceph1 ~]# rbd pool init images_pool
application enable images_pool rbd
[root@ceph1 ~]# ceph osd pool ls detail | grep images_pool #看现象
pool 2 'images_pool' replicated size 3 min_size 2 crush_rule 0 object_hash
rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 41 flags
hashpspool,selfmanaged_snaps stripe_width 0 `application rbd`
[root@ceph1 ~]# rbd create images_pool/webapp1 --size 1G
# 查看池中镜像清单
[root@ceph1 ~]# rbd ls images_pool
webapp1
# 查看池整体情况
[root@ceph1 ~]# rbd pool stats images_pool
Total Images: 1
Total Snapshots: 0
Provisioned Size: 1 GiB
访问 RADOS 块设备存储
将 images_pool 池中的 webapp1 镜像映射为client上 /dev/rbd0 设备
创建映射
bash
#client上操作:
[root@client ~]# dnf install -y ceph-common
#ceph1上操作:
[root@ceph1 ~]# scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.rbd.keyring root@client:/etc/ceph
# 在客户端 client 上操作
[root@client ceph]# rbd ls images_pool --id rbd
webapp1
# 为了简化命令参数,定义CEPH_ARGS环境变量,确保ceph相关命令使用该环境变量提供的默认值。
[root@client ~]# export CEPH_ARGS='--id=rbd'
[root@client ~]# rbd ls images_pool
webapp1
# 使用 krbd 内核模块来映射镜像
[root@client ~]# rbd device map images_pool/webapp1
#或者使用rbd map images_pool/webapp1映射镜像
/dev/rbd0
[root@client ~]# lsblk
#多了个rbd0设备
# 列出计算机中映射的 RBD 镜像
[root@client ~]# rbd showmapped
id pool namespace image snap device
0 images_pool webapp1 - /dev/rbd0
# 或者
[root@client ~]# rbd device list
#等于rbd device ls
# 格式化和挂载
[root@client ~]# lsblk /dev/rbd0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 252:0 0 1G 0 disk
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mkdir -p /webapp/webapp1
[root@client ~]# mount /dev/rbd0 /webapp/webapp1/
[root@client ~]# echo Hello World > /webapp/webapp1/index.html
[root@client ~]# cat /webapp/webapp1/index.html
Hello World
[root@client ~]# df /webapp/webapp1/
Filesystem
1K-blocks Used Available Use% Mounted on
1038336 40504 997832 4% /webapp/webapp1
[root@client ~]# rbd status images_pool/webapp1
Watchers:
watcher=192.168.108.10:0/1267779106 client.44650
cookie=18446462598732840961
取消映射 RBD 镜像
bash
# 先卸载改设备
[root@client ~]# umount /webapp/webapp1
# 取消映射
[root@client ~]# rbd unmap /dev/rbd0
# rbd unmap images_pool/webapp1也可以
# 或者
[root@client ~]# rbd device unmap /dev/rbd0
[root@client ~]# rbd device ls
#查看现象
持久映射 RBD 镜像
bash
[root@client ~]# vim /etc/fstab
......
/dev/rbd/images_pool/webapp1 /webapp/webapp1 xfs _netdev 0 0
[root@client ~]# systemctl enable rbdmap.service
使用 rbd 命令管理镜像
status
用于查看哪些客户端在使用该镜像
bash
[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
用于查看镜像大小使用情况。
bash
[root@client ~]# rbd du images_pool/webapp1 --id rbd
NAME PROVISIONED USED
webapp1 1 GiB 36 MiB
resize
用于扩展和缩减镜像
bash
# 扩展未在使用的镜像
[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
# 缩减正在使用的镜像(xfs文件系统不支持缩减)
rename 和 mv
用于重命名镜像,该操作不支持跨池。
bash
# 创建新池
[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
用于复制镜像。
bash
#实验前观察
[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
trash
使用垃圾箱管理镜像
bash
# 将镜像放入垃圾箱
[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 ##讲回收站的webapp2删除
# 删除垃圾箱中镜像
[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
Removing image: 100% complete...done.
[root@ceph1 ~]# rbd trash ls images_pool
[root@ceph1 ~]# rbd ls images_pool
webapp1
rm
用于删除镜像
bash
[root@ceph1 ~]# rbd rm images_pool_2/webapp2
Removing image: 100% complete...done.
[root@ceph1 ~]# rbd ls images_pool_2
管理 RADOS 块设备快照
镜像操作
RBD 快照使用 COW 技术
在拍摄快照前卸载文件系统。
使用 rbd snap create 命令,创建 Ceph 块设备的快照
bash
# 重新创建一个镜像
[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 laogao > /webapp/webapp/index.html
[root@client ~]# cat /webapp/webapp/index.html
Hello laogao
使用 rbd snap ls 命令,列出块设备快照
bash
[root@client ~]# rbd snap ls images_pool/webapp
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap1 2 GiB Fri Aug 22 17:52:20 2025
镜像快照和镜像具有相同的文件系统,同一客户端不允许挂载具有相同UUID的文件系统
bash
#将/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 命令,回滚块设备快照,并用快照中的数据覆盖镜像的当前版本
bash
# 还原
[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 unmap /dev/rbd1
[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 块设备的快照。
bash
[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 命令,删除镜像所有快照。
bash
[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 快照克隆。
克隆过程有三个步骤:
- 创建快照
bash
[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列默认未保护
- 保护快照以免被删除
bash
[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
- 使用受保护的快照创建克隆
bash
[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/webapp-clone-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
查看基于特定快照的克隆列表
bash
[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 镜像,不再是受保护快照的子级。
bash
[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的
文件系统,需要修改uuid
bash
[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
rbd4 252:64 0 2G 0 disk /webapp/webapp-clone-2
导入和导出 RBD 镜像
导出 RBD 镜像
示例
bash
[root@ceph1 ~]# rbd export images_pool/webapp webapp.img
Exporting image: 100% complete...done.
导入 RBD 镜像
bash
[root@ceph1 ~]# rbd import webapp.img images_pool/webapp-backup
Importing image: 100% complete...done.