一、管理 RADOS 块设备
1、使用 RADOS 块设备(RBD)进行块存储
块设备是服务器、笔记本电脑和其他计算系统上最常见的长期存储类型。基于旋转磁盘片的硬盘驱动器(HDD)和基于非易失性存储器的固态驱动器(SSD)都是块设备。数据已固定大小块的形式存储在块设备中。
为了更容易地管理存储,可以使用文件系统格式化块设备,并将其挂载到Linux文件系统目录。您可以使用RADOS块设备(RBD)功能从您的RedHat Ceph存储集群提供块存储。它使您能够在RedHat Ceph Storage集群的池中创建作为RBD镜像作为虚拟块设备。
1)Accessing RADOS Block Devices Storage(访问RADOS块设备存储)
使用Linux内核的krbd可以将RBD镜像映射为一个Linux块设备,另外,Openstack或其他程序通过调用用户态的librbd接口也可以访问块设备,作为虚拟机和云主机的磁盘镜像。
2)Managing and Configuring RBD Images(管理和配置RBD镜像)
我们可以使用rbd命令管理RBD镜像,默认情况下该命令会在rbd池冲创建镜像。如果没有rbd池可以自己创建该存储池。如果没有rbd池也可以通过 ceph osd pool create 创建一个自定义池来存储RBD镜像,并且使用rbd pool init pool-name 初始化存储池(相当于指定池的application)
Ceph 客户机使用本地Linux内核模块krbd挂载RBD镜像。该模块将RBD镜像映射到名称为/dev/rbd0的Linux块设备。

① rbd device map 命令,使用krbd内核模块映射镜像。rbd map命令是rbd device map命令的缩写形式。
-
命令:rbd device map
-
命令:rbd map
将RBD池中的test RBD镜像映射到主机客户端的/dev/rbd0设备上,示例如下:
[root@node ~]# rbd map rbd/test
/dev/rbd0
警告:有可能你需要在多个客户端同时访问RBD镜像,这个对于高可用是非常有用的,但是如果块设备包含有文件系统,则需要确保同时只能由一个客户端mount挂载该设备,否则可能会导致异常和数据丢失的情况!
② rbd device list命令,缩写为rbd showmapped,用于列出机器中映射的rbd镜像。
-
命令:rbd device list
-
命令:rbd showmapped
[root@node ~]# rbd showmapped
id pool namespace image snap device
0 rbd test - /dev/rbd0
③ rbd device unmap命令,简称rbd unmap,用于从客户端机器上解除rbd镜像的映射。
-
命令:rbd device unmap
-
命令:rbd unmap
[root@node ~]# rbd unmap /dev/rbd0
注意:The rbd map and rbd unmap commands require root privileges.
rbd map 和 rbd unmap 命令需要root权限。
2、RBD 常用命令
|
Command |
Purpose |
|
rbd create --size nM|G|T [pool-name]/image-name |
创建RBD |
|
rbd ls [pool-name] |
列出RBD |
|
rbd info [pool-name]/image-name |
查看RBD镜像详细信息 |
|
rbd status [pool-name]/image-name |
查看RBD镜像状态信息 |
|
rbd du [pool-name]/image-name |
查看RBD镜像已配置和实际磁盘使用情况 |
|
rbd resize [pool-name]/image-name --size nM|G|T |
调整RBD镜像的大小 |
|
rbd rm [pool-name]/image-name |
删除RBD镜像 |
|
rbd cp [pool-name]/src-image-name [pool-name]/tgt-image-name |
复制RBD镜像 |
|
rbd mv [pool--name]/src-image-name [pool-name]/new-image-name |
重命名RBD镜像 |
|
rbd trash mv [pool-name]/image-name |
将RBD镜像移动到回收站 |
|
rbd trash rm [pool-name]/image-name |
从回收站中删除RBD镜像 |
|
rbd trash restore [pool-name]/image-name |
从回收站中恢复RBD镜像 |
|
rbd trash ls [pool-name] |
将所有RBD镜像列在回收站中 |
3、持久映射 RBD 镜像
rbdmap 服务可以在开机和关机时,自动映射和取消RBD镜像设备。该服务通过 /etc/ceph/rbdmap 凭证文件映射镜像设备。这个服务读取 /etc/fstab 文件,将RBD镜像设备挂载到特定的挂载点,或者取消设备挂载。
下面是使用 rbdmap 配置永久映射包含文件系统的RBD镜像的步骤:
1.Create the mount point for the file system (创建挂载点)
2.Create a single-line entry in the /etc/ceph/rbdmap RBD map file(创建映射文件)
该文件必须指定RBD镜像名称和存储池名称,它还必须引用具有读/写权限的Cephx用户来访问镜像和相应的密钥环文件,文件格式如下:
- poolname/imagename id=client,keyring=/etc/ceph/ceph.client.keyring
3.Create an entry for the RBD in the /etc/fstab file on the client system.(客户端在/etc/fstab文件中添加挂载条目)
设备文件名称格式如下:
- /dev/rbd/pool_name/image_name /mnt/rbd ext4 noauto 0 0
Specify the noauto mount option. 设置noauto挂载属性
- auto属性(当执行mount -a时自动挂载)
- noauto(不能通过mount -a自动挂载,仅执行特定的mount命令指定设备时才挂载设备)
4.Confirm that the block device mapping works. (验证设备是否以及映射成功)
5.Enable the rbdmap systemd service. (启动并设置rbdmap服务为开机自启动)
对于虚拟化和云环境而言,可以基于librbd库直接访问Ceph存储。

4、调整 RBD 镜像格式
所有存储在RBD镜像中的对象数据,都有一个以RBD块设备名称前缀,我们可以使用rbd info查看镜像设备的前缀
RBD镜像中所有对象的名称都以每个RBD镜像的RBD块名称前缀字段中的值开头,并使用rbd info命令显示。在这个前缀之后,有一个句点(.),后面跟着对象号,从0开始。对象编号字段的值为12个字符的十六进制数。
查看名称为rbdimage镜像的基本信息(没有rbdimage镜像会报错,根据实际情况填写镜像名称)
- 命令:rbd info rbdimage
[root@node ~]# rbd info rbdimage
rbd image 'rbdimage':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.1219b74b0dc51
format: 2
features: layering
flags:
create_timestamp: Mon Nov 2 09:23:44 2022
查看rbd存储池中的数据(没有rbd池该命令会报错,根据实际情况填写池名称)
-
命令:rados -p rbd ls
[root@node ~]# rados -p rbd ls
rbd_info
rbd_directory
rbdimage.rbd
rbd_data.1219b74b0dc51.000000000000
rbd_data.1219b74b0dc51.00000000001a
rbd_data.1219b74b0dc51.00000000004b
## rbd.data.1219b74b0dc51 是镜像的名称前缀(prefix),后是具体对象数据的编号

RBD Image Order(RBD镜像顺序)
Image order 指的是在一个RBD镜像中对象切割的大小,表示为C语言中按位左移操作。
例如:1<<=4. 十进制的1就是二进制的0001,将0001按位左移2位就是0100,0100对应的十进制就是4。而ceph进行的order必须是12和25之间位移

默认镜像使用的是22,也就是4MiB。你可以在使用rbd create命令是使用--order指定order大小。可以使用--object-size参数指定所使用对象的大小。该参数指定的对象大小必须在4096字节(4KiB)到33554432字节(32MiB)之间,单位为字节K或M。(例如, 4096, 8K or 4M,指定单位需使用大写字母)
例如1:在rbd池中创建一个名称为image1的镜像,该镜像支持layering分层数据功能,镜像大小为1G,对象大小为8M
[root@node ~]# rbd create rbd/image1 --image-feature=layering --size=1G --object-size=8M
[root@node ~]# rbd info rbd/image1 //查看镜像信息
rbd image 'image1': //镜像名称
size 1024 MB in 128 objects //镜像大小为1G,对象大小为8M,最多存储128个对象
order 23 (8192 kB objects)
block_name_prefix: rbd_data.121a1643c9869
例如2:创建一个1G大小,对象大小为1M的image2镜像
[root@node ~]# rbd create rbd/image2 --image-feature=layering --size=1G --object-size=1M
[root@node ~]# rbd info rbd/image2 //查看镜像信息
rbd image 'image2':
size 1024 MB in 1024 objects //该镜像大小为1G,对象大小为1M,最多存储1024个对象
order 20 (1024 kB objects)
block_name_prefix: rbd_data.5e7574b0dc51
例如3:创建一个10G大小,对象大小为4K的image3镜像
[root@node ~]# rbd create rbdimage/image3 --image-feature=layering --size=10G --object-size=4K
[ceph@serverc ~]$ rbd info rbdimage/image3
rbd image 'image3':
size 10240 MB in 2621440 objects //该镜像大小为10G,对象大小为4K,最多存储2621440个对象
order 12 (4096 bytes objects)
block_name_prefix: rbd_data.121c5643c9869
每个RBD镜像都会绑定三个参数:
-
image_format: The version of the RBD image format. The default value is 2, the most recent version.Version 1 is deprecated and does not support features such as cloning and mirroring.(RBD镜像格式的版本。默认值是2,即最新版本。版本1已弃用,不支持克隆和镜像等特性。)
-
stripe_unit: The number of consecutive bytes stored in one object(object_size by default) (存储在一个对象中的连续字节数(默认为object_size))
-
stripe_count: The number of RBD image objects a strip spans(1 by default).(一个条带所跨越的RBD镜像对象的数量(默认为1))
stripe_unit * stripe_count = object_size
如: strip_unit = 4M, stripe_count=1 for default 4MB objects.
LAB: 管理 RADOS 块设备
1. 管理RADOS块设备
有ceph用户名和密码的任何主机都可以管理ceph集群
前提条件:安装ceph-common客户端软件和配置账户、密码
[root@foundation0 ~]# ssh root@serverc
[root@serverc ~]# cephadm shell --mount /etc/ceph:/etc/ceph
[ceph: root@serverc /]# ceph -s
创建test_pool存储池
[ceph: root@serverc /]# ceph osd pool create test_pool 32 32
[ceph: root@serverc /]# ceph osd pool ls
[ceph: root@serverc /]# ceph osd lspools
将rbd设置为池的应用类型
或者: ceph osd pool application enable test_pool rbd
[ceph: root@serverc /]# rbd pool init test_pool
[ceph: root@serverc /]# ceph osd pool ls detail
[ceph: root@serverc /]# ceph df

在test_pool中创建名为test的RBD镜像。指定大小为128M。
[ceph: root@serverc /]# rbd create test_pool/test --size=128M
[ceph: root@serverc /]# rbd ls test_pool
[ceph: root@serverc /]# rbd info test_pool/test
rbd image 'test':
size 128 MiB in 32 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 3804f5a1308
block_name_prefix: rbd_data.3804f5a1308
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Oct 25 17:46:39 2023
access_timestamp: Wed Oct 25 17:46:39 2023
modify_timestamp: Wed Oct 25 17:46:39 2023
为clientb创建名为 client.test_pool.clientb 的专用Ceph用户
[ceph: root@serverc /]# ceph auth get-or-create client.test_pool.clientb mon 'profile rbd' osd 'profile rbd' -o /etc/ceph/ceph.client.test_pool.clientb.keyring
[ceph: root@serverc /]# cat /etc/ceph/ceph.client.test_pool.clientb.keyring
[ceph: root@serverc /]# ceph auth get client.test_pool.clientb
## 开启另一个命令终端(Open a second terminal window)
[root@foundation0 ~]# ssh root@clientb
[root@clientb ~]# yum -y install ceph-common
[root@clientb ~]# scp root@serverc:/etc/ceph/{ceph.conf,ceph.client.test_pool.clientb.keyring} /etc/ceph/
[root@clientb ~]# export CEPH_ARGS='--id=test_pool.clientb'
通过使用内核RBD客户端在clientb节点上映射RBD镜像。
[root@clientb ~]# rbd map test_pool/test
/dev/rbd0
[root@clientb ~]# rbd showmapped
id pool namespace image snap device
0 test_pool test - /dev/rbd0
[root@clientb ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 251:0 0 128M 0 disk
...
Format the device with an XFS filesystem. 使用XFS文件系统格式化设备。
[root@clientb ~]# mkfs.xfs /dev/rbd0
Create a mount point for the filesystem. 为文件系统创建一个挂载点。
[root@clientb ~]# mkdir /mnt/rbd
Mount the file system created on the /dev/rbd0 device. 挂载在/dev/rbd0上创建的文件系统。
[root@clientb ~]# mount /dev/rbd0 /mnt/rbd
Change the ownership of the mount point. 更改挂载点的所有权。
[root@clientb ~]# chown admin:admin /mnt/rbd
[root@clientb ~]# ls -ld /mnt/rbd
drwxr-xr-x. 2 admin admin 6 Oct 25 13:54 /mnt/rbd
[root@clientb ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
...
/dev/rbd0 xfs 121M 7.8M 113M 7% /mnt/rbd
## 测试
[root@clientb ~]# dd if=/dev/zero of=/mnt/rbd/test1 bs=10M count=1
[root@clientb ~]# df -Th /mnt/rbd
[root@clientb ~]# ceph df
[root@clientb ~]# umount /mnt/rbd

2. 持久挂载 RDB 镜像
配置客户机系统,以便它持久地将test_pool/test RBD镜像挂载为/mnt/ RBD。
[root@clientb ~]# vim /etc/ceph/rbdmap
... ...
test_pool/test id=test_pool.clientb,keyring=/etc/ceph/ceph.client.test_pool.clientb.keyring
[root@clientb ~]# vim /etc/fstab
... ...
/dev/rbd/test_pool/test /mnt/rbd xfs noauto 0 0
验证您的RBD映射配置。rbdmap命令用来映射和取消映射已配置的RBD设备。
[root@clientb ~]# rbdmap map
[root@clientb ~]# rbd showmapped
id pool namespace image snap device
0 test_pool test - /dev/rbd0
验证RBD映射设备正常工作后,启动rbdmap服务。
[root@clientb ~]# systemctl enable rbdmap
[root@clientb ~]# reboot
[root@foundation0 ~]# ssh root@clientb
[root@clientb ~]# df -Th /mnt/rbd
[root@clientb ~]# ls /mnt/rbd

## 清理实验:
## 取消映射
[root@clientb ~]# rbdmap unmap
[root@clientb ~]# rbd showmapped
## 删除rbd配置行
[root@clientb ~]# vim /etc/fstab
#/dev/rbd/test_pool/test /mnt/rbd xfs noauto 0 0
[root@clientb ~]# vim /etc/ceph/rbdmap
#test_pool/test id=test_pool.clientb,keyring=/etc/ceph/ceph.client.test_pool.clientb.keyring
## 删除镜像
[root@clientb ~]# rbd rm test_pool/test --id test_pool.clientb
Removing image: 100% complete...done.
[root@clientb ~]# exit
二、管理 RADOS 块设备快照
1、启用 RBD 快照和克隆
2版本的RBD镜像支持很多可选的特色功能,使用rbd feature enable可以开启这些功能,使用rbd feature disable可以关闭这个功能。
例如,在rbd池的测试镜像上开启分层功能。
- 命令:rbd feature enable rbd/test layering
[root@node ~]$ rbd feature enable rbd/test layering
需要禁用分层特性,使用rbd feature disable命令,如下所示:
- 命令:rbd feature disable rbd/test layering
[root@node ~]$ rbd feature disable rbd/test layering
The available features for an RBD image are: RBD镜像的可用特性有:
|
Name |
Description |
|
layering |
Layering support to enable cloning(支持克隆) |
|
striping |
Striping v2 support for enhanced performance. Currently only supported by librbd.(支持性能增强) |
|
exclusive-lock |
Exclusive locking support(排他锁,支持多进程访问RADOS块设备) |
|
object-map |
Object map support(requires exclusive-lock) (对象地图,客户端看图即可知道对象位置,不需要计算) |
|
fast-diff |
Fast diff command support(requires object-map and exclusive-lock)(支持fast diff命令) |
|
deep-flatten |
Flattens all snapshots of the RBD image(flatten镜像的所有快照) |
|
journaling |
Journaling support(日志) |
|
date-pool |
EC data pool support(支持erasure coding池) |
2、RBD Snapshots 快照
快照就是镜像在某个特定时间点的一份只读副本。RBD快照使用写时复制原理利用最小化存储空间实现数据备份功能。当一个读写请求应用到一个被快照的RBD镜像后,你的集群才会真正拷贝原始数据到快照的特定区域。因此,创建快照不会占用、消耗存储空间。RBD镜像还支持分层增量快照克隆结束。
快照的原理是基于COW(写时复制),默认所有快照中的数据都是对原始镜像的引用,所以快照很快,并且不占用磁盘空间

COW,当原始镜像发生写操作时,原始镜像的数据会被拷贝到快照区域,那些没有发生写操作的数据依然是对原始镜像的引用。

RedHat Ceph Storage支持使用RBD命令管理RBD快照:
1)Create snapshot(创建快照)
- 命令:rbd snap create [pool-name/]image-name@snap-name
$ rbd snap create testpool/rbd@snap-rbd
2)List snapshots(列出快照)
-
命令:rbd snap ls [pool-name/]image-name
$ rbd snap ls testpool/rbd
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap-rbd 500 GiB Fri Mar 8 16:19:08 2024
3)Limit the number of snapshots(限制快照数量)
-
命令:rbd snap limit set --limit number [pool-name/]image-name
$ rbd snap limit set --limit 4 testpool/rbd
4)Remove the limit on the number of snapshots(删除限制)
-
命令:rbd sanp limit clear [pool-name/]image-name
$ rbd snap limit clear testpool/rbd
5)Rename snapshot(重命名快照)
-
命令:rbd snap rename [pool-name/]{image-name@old-snap-name} [pool-name/]{image-name@new-snap-name
$ rbd snap rename testpool/rbd@snap-rbd testpool/rbd@new-snap
6)Delete snapshot(删除快照)
-
命令:rbd snap rm [pool-name/]image-name@snap-name
$ rbd snap rm testpool/rbd@new-snap
7)Purge snapshot(删除镜像的所有快照)
-
命令:rbd snap purge [pool-name/]image-name
$ rbd snap purge testpool/rbd
8)Roll back snapshot(还原快照)
-
命令:rbd snap rollback [pool-name/]image-name@snap-name
$ rbd snap rollback testpool/rbd@snap-rbd
9)Protect snapshot(保护快照,被保护的快照,无法被删除)
-
命令:rbd snap protect [pool-name/]image-name@snapshot-name
$ rbd snap protect testpool/rbd@snap-rbd
$ rbd snap rm testpool/rbd@snap-rbd
2024-03-08T16:30:48.540+0800 7fce6dba2640 -1 librbd::Operations: snapshot is protected
Removing snap: 0% complete...failed.
rbd: snapshot 'snap-rbd' is protected from removal.
10)Unprotect snapshot(取消快照保护)
-
命令:rbd snap unprotect [pool-name/]image-name@snapshot-name
$ rbd snap unprotect testpool/rbd@snap-rbd
提示:在创建快照之前,使用fsfreeze命令挂起对文件系统的访问。带有--freeze选项的fsfreeze命令会停止对文件系统的访问,并在磁盘上创建一个稳定的镜像。如果在不使用fsfreeze的情况下拍摄文件系统快照,则快照可能会损坏。快照完成后,带unfreeze选项的fsfreeze命令恢复对文件系统的访问。
- 命令:fsfreeze --freeze 挂载点 #锁定文件系统
- 命令:fsfreeze --unfreeze 挂载点 #取消锁定文件系统
3、RBD Clones 克隆
RBD克隆是以受保护的RBD快照为基础的RBD镜像的读/写副本。新克隆的RBD镜像数据都是对原始数据的引用(剩空间,原理还是COW)。RBD克隆也可以被平面化(flattened),这将其转换为完全独立于其原始来源的RBD镜像(完整克隆)。
The cloning process has three steps(克隆需要三个步骤):
1)Create a snapshot (创建快照)
-
命令:rbd snap create pool/image@snapshot
2)Protect the snapshot from deletion (保护快照不被删除)
-
命令:rbd snap protect pool/image@snapshot
3)Create the clone using the protected snapshot(使用受保护的快照创建克隆)
-
命令:rbd clone pool/imagename@snapshotname pool/clonename
4)remove clone(删除克隆)
-
命令:rbd rm pool/clonename
新克隆的镜像盘支持COW(写时复制)和COR(读时复制),默认是COW。
COW当有写操作时,会拷贝父快照中的数据到clone的镜像盘。

客户端发送写操作时会复制数据并在Clone镜像盘修改数据

用户读取clone镜像,如果镜像中有数据则直接读取,如果没有,则需要读取父镜像数据!
## 也可以配置clone的镜像盘支持COR
COR copies objects to the clone when they are first read. COR在第一次读取对象时将对象复制到克隆。
可以使用如下命令激活COR模式:
-
命令:ceph config set client rbd_clone_copy_on_read true
-
命令:ceph config set global rbd_clone_copy_on_read true
在扁平化克隆时,Ceph将所有缺失的数据从父类复制到克隆中,然后删除对父类的引用。克隆成为一个独立的RBD镜像,不再是受保护快照的子快照。
-
命令:rbd flatten [pool-name]/child-image-name

LAB: 管理 RADOS 块设备快照
有ceph用户名和密码的任何主机都可以管理ceph集群
前提条件:安装ceph-common客户端软件(如果没有则安装该软件)和配置账户、密钥
1. 创建、还原块设备快照操作
[root@foundation0 ~]# ssh root@serverc
[root@serverc ~]# cephadm shell
[ceph: root@serverc /]# ceph -s //查看集群状态
创建存储池(32个PG),设置存储池应用类型为RBD
或者执行 rbd pool init rbd ,设置存储池的application类型
[ceph: root@serverc /]# ceph osd pool create rbdpool 32 32
[ceph: root@serverc /]# ceph osd pool application enable rbdpool rbd
创建名称为image1的镜像(大小为128M)
[ceph: root@serverc /]# rbd create rbdpool/image1 --size=128M
[ceph: root@serverc /]# exit
将rbd/image1镜像映射为块设备
[root@serverc ~]# rbd map --pool rbdpool image1
/dev/rbd0
用XFS文件系统格式化块设备
[root@serverc ~]# mkfs.xfs /dev/rbd0
[root@serverc ~]# blockdev --getro /dev/rbd0 //确认该块设备为可读可写设备(非只读设备)
0
客户端创建挂载点,挂载设备,任意写入文件内容测试
[root@serverc ~]# mkdir /mnt/image
[root@serverc ~]# mount /dev/rbd0 /mnt/image/
[root@serverc ~]# echo hello world > /mnt/image/hello.txt
[root@serverc ~]# umount /mnt/image
创建一个名为firstsnap的初始快照
[root@clienta ~]# cephadm shell
[ceph: root@serverc /]# rbd snap create rbdpool/image1@firstsnap
[ceph: root@serverc /]# rbd snap list rbdpool/image1
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 firstsnap 128 MiB Wed Oct 25 18:08:01 2023
[ceph: root@serverc /]# exit
做完快照后,可以回到客户端,模拟数据被误删,使用快照就可以还原数据
[root@serverc ~]# mount /dev/rbd0 /mnt/image/
[root@serverc ~]# ls /mnt/image/
hello.txt //查看刚才写的数据还在
## 模拟误删除
[root@serverc ~]# rm -rf /mnt/image/hello.txt
[root@serverc ~]# ls /mnt/image/
[root@serverc ~]# umount /mnt/image
[root@serverc ~]# rbd unmap /dev/rbd0
注意:ceph不支持在线还原快照,必须要把设备 umount,unmap
进入ceph管理容器,执行还原快照的命令
[root@clienta ~]# cephadm shell
[ceph: root@serverc /]# rbd snap rollback rbdpool/image1@firstsnap //还原快照
Rolling back to snapshot: 100% complete...done.
[ceph: root@clienta /]# exit
重新映射块设备并测试
[root@serverc ~]# rbd map rbdpool/image1
/dev/rbd0
[root@serverc ~]# mount /dev/rbd0 /mnt/image/
[root@serverc ~]# ls /mnt/image/
hello.txt
[root@serverc ~]# cat /mnt/image/hello.txt
hello world
## 取消挂载
[root@clienta ~]# umount /mnt/image
[root@clienta ~]# rbd unmap /dev/rbd0
[root@clienta ~]# rbd showmapped
2. 通过快照映射块设备操作
注意:原始镜像是可读可写的镜像,快照是只读的
打开另一个命令终端(Open another terminal window)
[root@foundation0 ~]# ssh root@clientb
[root@clientb ~]# export CEPH_ARGS='--id=test_pool.clientb'
[root@clientb ~]# rbd map rbdpool/image1@firstsnap //将rbd/image1镜像的firstsnap快照映射为块设备
/dev/rbd0
[root@clientb ~]# rbd showmapped
id pool namespace image snap device
0 rbdpool image1 firstsnap /dev/rbd0
[root@clientb ~]# blockdev --getro /dev/rbd0 //确认快照设备为只读设备
1
验证快照是只读的,无法写操作
[root@clientb ~]# mkdir /mnt/snapshot/
[root@clientb ~]# mount /dev/rbd0 /mnt/snapshot/
mount: /mnt/snapshot: WARNING: device write-protected, mounted read-only.
[root@clientb ~]# umount /mnt/snapshot
[root@clientb ~]# rbd unmap --pool rbdpool image1@firstsnap
[root@clientb ~]# rbd showmapped
3. 通过快照进行克隆盘操作
注意:需要克隆镜像快照,必须要开启快照保护功能
Protect the firstsnap snapshot. 保护firstsnap快照。
[root@serverc ~]# rbd snap protect rbdpool/image1@firstsnap
克隆第一个snap块设备快照,以创建一个名为clone1的读写子镜像,该镜像使用rbdpool池。
[root@serverc ~]# rbd clone rbdpool/image1@firstsnap rbdpool/clone1
## clientb操作
[root@clientb ~]# rbd map --pool rbd clone1
[root@clientb ~]# mkdir /mnt/clone
[root@clientb ~]# mount /dev/rbd0 /mnt/clone
[root@clientb ~]# ls -l /mnt/clone
hello.txt
[root@clientb ~]# dd if=/dev/zero of=/mnt/clone/file1 bs=1M count=10
[root@clientb ~]# ls /mnt/clone
[root@clientb ~]# rbd map --pool rbdpool clone1 //将clone1镜像映射为块设备
/dev/rbd0
[root@clientb ~]# mkdir /mnt/clone //创建挂载点并测试
[root@clientb ~]# mount /dev/rbd0 /mnt/clone //镜像是可以写入非只读,可挂载
[root@clientb ~]# ls -l /mnt/clone
total 4
-rw-r--r--. 1 root root 12 Oct 25 2023 hello.txt
## 测试写入数据
[root@clientb ~]# dd if=/dev/zero of=/mnt/clone/file1 bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0205534 s, 510 MB/s
[root@clientb ~]# ls /mnt/clone
file1 hello.txt
## 清理实验:
[root@clientb ~]# umount /mnt/clone
[root@clientb ~]# rbd unmap --pool rbdpool clone1
[root@clientb ~]# rbd showmapped
[root@clientb ~]# exit
4. 通过克隆盘进行flatten操作
查看克隆盘信息,可以看到该克隆盘依赖于原始镜像的快照
[root@serverc ~]# rbd info rbdpool/clone1
rbd image 'clone1':
size 128 MiB in 32 objects
order 22 (4 MiB objects)
snapshot_count: 0
... ...
parent: rbdpool/image1@firstsnap //firstsnap 镜像快照
执行flatten之后,克隆盘的parent信息就没了,该克隆盘是完全独立的!
[root@serverc ~]# rbd flatten rbdpool/clone1
Image flatten: 100% complete...done.
[root@serverc ~]# rbd info rbdpool/clone1 //相关 parent 信息已经不存在

5. 总结客户端使用方式:
1)基于KRBD(Linux内核模块):Linux客户端直接访问ceph块共享

2)基于librbd库:虚拟机通过调用librbd库访问Ceph块共享

三、导入和导出 RBD 镜像
增量备份和恢复:
使用 rbd export-diff 和 rbd import-diff 来备份和恢复镜像的增量数据。
全量备份和恢复:
使用 rbd export 和 rbd import 来备份和恢复整个镜像或快照。
镜像迁移:
使用 rbd export 和 rbd import 将镜像从一个集群迁移到另一个集群。
通过这些命令,你可以灵活地管理和操作 RBD 镜像的数据,无论是备份、恢复还是迁移。
|
命令 |
用途 |
示例命令 |
|
rbd export-diff |
导出增量差异数据 |
rbd export-diff --from-snap snap1 rbd/test@snap2 /mnt/diff-export.dat |
|
rbd import-diff |
导入增量差异数据 |
rbd import-diff /mnt/diff-export.dat rbd/test |
|
rbd export |
导出整个镜像或快照 |
rbd export rbd/test@snap1 /mnt/test-snap1.img |
|
rbd import |
导入镜像文件 |
rbd import /mnt/test.img rbd/test |
1、导出 RBD 镜像
RedHat Ceph Storage支持使用RBD export命令将RBD镜像导出为文件。该命令将RBD镜像或RBD镜像快照作为输入,并将其导出到指定的目标文件。rbd export命令的语法如下:
-
命令:rbd export [--export-format ]
1. --export-format format(1 or 2)
功能: 指定导出文件的格式。
选项:
1: 默认格式,适用于大多数场景。
2: 优化格式,支持更大的镜像和更高的性能。
解释::如果你不指定 --export-format,默认使用格式 1。 格式 2 通常用于非常大的镜像,以提高导出和导入的性能。
2. (image-spec | snap-spec)
功能: 指定要导出的 RBD 镜像或快照。
选项:
image-spec: 镜像名称(例如 poolname/imagename)。
snap-spec: 镜像快照名称(例如 poolname/imagename@snapname)。
解释: 如果是 image-spec,导出的是整个镜像。 如果是 snap-spec,导出的是镜像的某个快照。
3. [dest-path]
功能: 指定导出文件的目标路径。
解释:导出的文件将存储在指定的本地路径中。
例如:导出一个名为test的RBD镜像到/tmp/test.dat文件
[root@clienta ~]# rbd export rbd/test /tmp/test.dat
2、导入 RBD 镜像
RedHat Ceph Storage支持使用RBD import命令从文件导入RBD镜像。该命令创建一个新镜像,并从指定的源路径导入数据。rbd import命令的格式如下:
-
命令:rbd import [--export-format format(1 or 2) [--image-format format-id] [--object-size size-in-B/K/M] [--strip-unit size-in-B/K/M] --strip-count num] [--image-feature feature-name]… [--image-shared] src-path [image-spec]
-
命令:rbd import [--image-format ] <src-path> <image-spec>
--image-format :指定导入镜像的格式(1 或 2)。
1:默认格式。
2:优化格式,支持更高的性能和特性。
<src-path>:指定要导入的源文件路径。
<image-spec>:指定目标镜像。
例如: 管道导出和导入流程
[root@clienta ~]# rbd export rbd/image1 - | rbd import - bup/img1
3、导出 RBD 镜像的增量差异数据
导出 RBD 镜像的增量差异数据。仅导出从一个快照到另一个快照之间的变化数据。
- 命令:rbd export-diff [--from-snap <from-snapshot>] <image-spec@to-snapshot> <dest-path>
--from-snap <from-snapshot>:指定起始快照。
<image-spec@to-snapshot>:指定目标镜像和结束快照。
<dest-path>:指定导出文件的目标路径。
例如:导出从快照 snap1 到快照 snap2 的差异数据:
rbd export-diff --from-snap snap1 rbd/test@snap2 /mnt/diff-export.dat
用途场景:
1.备份镜像的增量数据。
2.在迁移或恢复时,减少数据传输量。
4、导入增量差异数据到 RBD 镜像
导入增量差异数据到 RBD 镜像。 将导出的增量差异文件应用到目标镜像。
- 命令:rbd import-diff <diff-file> <image-spec>
<diff-file>:指定要导入的增量差异文件。
<image-spec>:指定目标镜像。
例如 :将增量差异文件 /mnt/diff-export.dat 导入到镜像 rbd/test:
rbd import-diff /mnt/diff-export.dat rbd/test
用途场景
1.恢复镜像的增量数据。
2.在迁移或备份后,将增量数据应用到目标镜像。
LAB: 导入和导出 RBD 镜像
有ceph用户名和密码的任何主机都可以管理ceph集群
前提条件ceph-common客户端软件(如果没有则安装该软件)和账户、密码
1. 导入和导出 RBD 镜像
[root@foundation0 ~]# ssh root@serverc
[root@serverc ~]# cephadm shell
[ceph: root@serverc /]# ceph -s
打开另一个终端,远程serverf(一个单节点的ceph存储)
[root@foundation0 ~]# ssh root@serverf
[root@serverf ~]# cephadm shell
[ceph: root@serverf /]# ceph -s
创建一个名为rbd的池,然后为Ceph块设备启用rbd客户机应用程序,并使其可用于rbd特性。
[ceph: root@serverc /]# ceph osd pool create rbd 32
[ceph: root@serverc /]# ceph osd pool application enable rbd rbd
[ceph: root@serverc /]# ceph osd pool ls
在第二个存储服务器serverf上面也创建一个rbd存储池
[ceph: root@serverf /]# ceph osd pool create rbd 32
[ceph: root@serverf /]# ceph osd pool application enable rbd rbd
[ceph: root@serverf /]# ceph osd pool ls
创建RBD镜像。退出cephadm shell,映射镜像,然后使用XFS文件系统对其进行格式化。
[ceph: root@serverc /]# rbd create test --size 128M --pool rbd
[ceph: root@serverc /]# exit
[root@serverc ~]# rbd map --pool rbd test
/dev/rbd0
[root@serverc ~]# mkfs.xfs /dev/rbd0
[root@serverc ~]# mkdir /mnt/rbd
[root@serverc ~]# mount /dev/rbd0 /mnt/rbd
[root@serverc ~]# cp /etc/ceph/ceph.conf /mnt/rbd/file0
[root@serverc ~]# ls /mnt/rbd
file0
[root@serverc ~]# umount /mnt/rbd
使用--mount参数运行cephadm shell 绑定挂载 /home/admin/rbd-export。
-
命令:rbd export rbd/test@snap1 /mnt/test-snap1.img
[root@serverc ~]# mkdir -p /home/admin/
[root@serverc ~]# cephadm shell --mount /home/admin/
[ceph: root@serverc /]# rbd export rbd/test /mnt/export.dat //导出镜像
Exporting image: 100% complete...done.
[ceph: root@serverc /]# exit
[root@serverc ~]# ls /home/admin/
ceph export.dat
将export.dat文件复制到 serverf 的 /home/目录
[root@serverc ~]# rsync -avP /home/admin/export.dat serverf:/home/
1. -a --archive
功能: 归档模式,表示递归传输并保留所有属性(如权限、时间戳、符号链接等)。
详细说明:
相当于同时使用 -rlptgoD 选项的组合:
- -r: 递归传输目录及其内容。
- -l: 保留符号链接。
- -p: 保留文件权限。
- -t: 保留文件时间戳。
- -g: 保留文件的属组。
- -o: 保留文件的属主。
- -D: 保留设备文件和特殊文件。2. -v --verbose
功能: 显示详细的输出信息,帮助用户了解传输的进度和内容。
3. -P --partial --progress
功能: 显示传输进度并支持断点续传。
- --partial: 保留未完成的传输文件,以便在传输中断时可以继续传输。
- --progress: 显示传输进度条,包括已传输的字节数、传输速度和剩余时间。
在 serverf 上面通过文件导入镜像
-
命令:rbd import /mnt/test.img rbd/test
[root@serverf ~]# ls /home/ //在serverf上确认是否同步
admin devops export.dat student
[root@serverf ~]# yum -y install ceph-common
[root@serverf ~]# rbd import /home/export.dat rbd/test //导入镜像
Importing image: 100% complete...done.
[root@serverf ~]# rbd --pool rbd ls //查看rbd池的rbd镜像
test
[root@serverf ~]# rbd map test //重新映射并验证查看是否有导入RBD镜像的内容
/dev/rbd0
[root@serverf ~]# mount /dev/rbd0 /mnt
[root@serverf ~]# df -Th /mnt
Filesystem Type Size Used Avail Use% Mounted on
/dev/rbd0 xfs 121M 7.8M 113M 7% /mnt
[root@serverf ~]# ls /mnt
file0
## 清理
[root@serverf ~]# umount /mnt
[root@serverf ~]# rbd unmap /dev/rbd0
2. 导出和导入差异数据
在serverc 和 serverf 上创建快照
[root@serverc ~]# rbd snap create rbd/test@firstsnap
[root@serverf ~]# rbd snap create rbd/test@firstsnap
将文件系统挂载到/dev/rbd0设备上(主存储挂载设备,写入测试数据)
[root@serverc ~]# mount /dev/rbd0 /mnt/rbd
[root@serverc ~]# dd if=/dev/zero of=/mnt/rbd/file1 bs=1M count=5
[root@serverc ~]# ls /mnt/rbd/
file0 file1
[root@serverc ~]# umount /mnt/rbd
创建镜像快照,导出差异数据,将数据拷贝到serverf
- 命令:rbd export-diff [--from-snap <from-snapshot>] <image-spec@to-snapshot> <dest-path>
[root@serverc ~]# cephadm shell --mount /home/admin/
[ceph: root@serverc /]# rbd snap create rbd/test@secondsnap
Creating snap: 100% complete...done.
[ceph: root@serverc /]# rbd export-diff --from-snap firstsnap rbd/test@secondsnap /mnt/export-diff.dat
Exporting image: 100% complete...done.
[ceph: root@serverc /]# exit
[root@serverc ~]# rsync -avP /home/admin/export-diff.dat serverf:/home/
serverf导入增量数据,验证效果
- 命令:rbd import-diff <diff-file> <image-spec>
[root@serverf ~]# ls /home/
admin devops export.dat export-diff.dat student
[root@serverf ~]# rbd import-diff /home/export-diff.dat rbd/test
Importing image diff: 100% complete...done.
[root@serverf ~]# rbd snap list rbd/test
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 firstsnap 128 MiB Sun Feb 16 11:40:10 2025
5 secondsnap 128 MiB Sun Feb 16 11:44:15 2025 //增量数据中的快照
[root@serverf ~]# rbd map rbd/test
/dev/rbd0
[root@serverf ~]# mount /dev/rbd0 /mnt
[root@serverf ~]# ls /mnt //查看是否有2个文件
file0 file1
[root@serverf ~]# umount /mnt
可以在foundation执行 rht-vmctl fullreset all 重置所有虚拟机还原快照,恢复环境
思维导图

小结:
本篇为 【RHCA认证 - CL260 | Day06:块存储】的学习笔记,希望这篇笔记可以让您初步了解如何管理 RADOS 块设备、管理 RADOS 块设备快照、导入和导出 RBD 镜像,不妨跟着我的笔记步伐亲自实践一下吧!
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关环境、视频,可评论666并私信小安,请放下你的羞涩,花点时间直到你真正的理解。
1068

被折叠的 条评论
为什么被折叠?



