查看,創建,刪除,映射rbd鏡像


標簽(空格分隔): ceph,ceph實驗,pg


1. 創建鏡像:

[root@node3 ~]# rbd create testpool/foo --size 1024

2. 查看鏡像信息:

[root@node3 ~]# rbd info testpool/foo
rbd image 'foo':
        size 1024 MB in 256 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.3723643c9869
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        flags: 
        create_timestamp: Sat Oct 21 14:38:04 2017

size : 就是這個塊的大小,即1024MB=1G,1024MB/256 = 4M,共分成了256個對象(object),每個對象4M。
order 22: 22是個編號,4M是22, 8M是23,也就是2^22 bytes = 4MB, 2^23 bytes = 8MB
block_name_prefix : 這個是塊的最重要的屬性了,這是每個塊在ceph中的唯一前綴編號,有了這個前綴,把主機上的OSD都拔下來帶回家,就能復活所有的VM了
format : 格式有兩種,1和2

查看創建了鏡像之后,該pool中生成的對象:

[root@node3 ~]# rados -p testpool ls
rbd_directory
rbd_info
rbd_object_map.3723643c9869
rbd_id.foo
rbd_header.3723643c9869

查看 rbd_directory 中的內容:

[root@node3 ~]# rados -p testpool listomapvals rbd_directory
id_3723643c9869
value (7 bytes) :
00000000  03 00 00 00 66 6f 6f                              |....foo|
00000007

name_foo
value (16 bytes) :
00000000  0c 00 00 00 33 37 32 33  36 34 33 63 39 38 36 39  |....3723643c9869|
00000010

rbd_directory會增加剛剛的創建的rbdName及其prefix,rbd_directory文件就是這個pool里面的所有RBD的索引。

查看 rbd_id.foo 中的內容:

[root@node3 ~]# rados -p testpool get rbd_id.foo rbd_id.foo
[root@node3 ~]# hexdump -vC rbd_id.foo 
00000000  0c 00 00 00 33 37 32 33  36 34 33 63 39 38 36 39  |....3723643c9869|
00000010

每個RBD剛創建(format 2)時都會生成一個rbd_id.rbdName這樣的文件,里面保存了這個塊的prefix。

查看 rbd_header.3723643c9869 中的內容:

[root@node3 ~]# rados -p testpool listomapvals rbd_header.3723643c9869
create_timestamp
value (8 bytes) :
00000000  4c eb ea 59 0d f4 01 06                           |L..Y....|
00000008

features
value (8 bytes) :
00000000  3d 00 00 00 00 00 00 00                           |=.......|
00000008

object_prefix
value (25 bytes) :
00000000  15 00 00 00 72 62 64 5f  64 61 74 61 2e 33 37 32  |....rbd_data.372|
00000010  33 36 34 33 63 39 38 36  39                       |3643c9869|
00000019

order
value (1 bytes) :
00000000  16                                                |.|
00000001

size
value (8 bytes) :
00000000  00 00 00 40 00 00 00 00                           |...@....|
00000008

snap_seq
value (8 bytes) :
00000000  00 00 00 00 00 00 00 00                           |........|
00000008

rbd_header 保存的是一個 RBD 鏡像的元數據
再創建一個鏡像,看看 testpool 中的對象和 rbd_directory 有什么變化:

[root@node3 ~]# rbd create testpool/myimage --size 100 --order 23
[root@node3 ~]# rbd -p testpool ls
foo
myimage

查看testpool中存儲的內容:

[root@node3 ~]# rados -p testpool ls|sort
rbd_directory
rbd_header.3723643c9869
rbd_header.3734643c9869
rbd_id.foo
rbd_id.myimage
rbd_info
rbd_object_map.3723643c9869
rbd_object_map.3734643c9869

可以看到多了myimage相關的內容,再看看 rbd_directory 中的內容:

[root@node3 ~]# rados -p testpool listomapvals rbd_directory
id_3723643c9869
value (7 bytes) :
00000000  03 00 00 00 66 6f 6f                              |....foo|
00000007

id_3734643c9869
value (11 bytes) :
00000000  07 00 00 00 6d 79 69 6d  61 67 65                 |....myimage|
0000000b

name_foo
value (16 bytes) :
00000000  0c 00 00 00 33 37 32 33  36 34 33 63 39 38 36 39  |....3723643c9869|
00000010

name_myimage
value (16 bytes) :
00000000  0c 00 00 00 33 37 33 34  36 34 33 63 39 38 36 39  |....3734643c9869|
00000010

從上面的內容可以看出:rbd_directory 中保存了pool內所有image的 ID 和 name 信息。

3. 刪除鏡像:

[root@node3 ~]# rbd rm testpool/myimage
Removing image: 100% complete...done.

[root@node3 ~]# rbd -p testpool ls
foo

4. 映射使用rbd:

4.1. 映射鏡像:

[root@node3 ~]# rbd map testpool/foo 
/dev/rbd0

映射鏡像如果提示 rbd: sysfs write failed,參考 映射塊設備提示rbd: sysfs write failed的解決方法

4.2. 格式化該設備:

[root@node3 ~]# mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=9, agsize=31744 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

4.3. 掛載該設備:

[root@node3 ~]# mkdir foo
[root@node3 ~]# mount /dev/rbd0 foo/
[root@node3 ~]# df -h
文件系統                 容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root   18G  1.7G   16G   10% /
devtmpfs                 482M     0  482M    0% /dev
tmpfs                    493M     0  493M    0% /dev/shm
tmpfs                    493M   26M  468M    6% /run
tmpfs                    493M     0  493M    0% /sys/fs/cgroup
/dev/sda1                497M  171M  326M   35% /boot
tmpfs                     99M     0   99M    0% /run/user/0
/dev/sdb1                 97M   13M   84M   14% /var/lib/ceph/osd/ceph-2
/dev/sdc1                 97M   23M   74M   24% /var/lib/ceph/osd/ceph-5
/dev/rbd0               1014M   33M  982M    4% /root/foo

上面的33M就是剛格式化完的xfs系統的大小,此時查看集群發生的變化,觀察下:

[root@node3 ~]# rados -p testpool ls|sort
rbd_data.3723643c9869.0000000000000000
rbd_data.3723643c9869.0000000000000001
rbd_data.3723643c9869.000000000000001f
rbd_data.3723643c9869.000000000000003e
rbd_data.3723643c9869.000000000000005d
rbd_data.3723643c9869.000000000000007c
rbd_data.3723643c9869.000000000000007d
rbd_data.3723643c9869.000000000000007e
rbd_data.3723643c9869.000000000000009b
rbd_data.3723643c9869.00000000000000ba
rbd_data.3723643c9869.00000000000000d9
rbd_data.3723643c9869.00000000000000f8
rbd_data.3723643c9869.00000000000000ff
rbd_directory
rbd_header.3723643c9869
rbd_header.3752643c9869
rbd_id.foo
rbd_id.foo1
rbd_info

比剛剛多了13個文件,這些文件的后綴綴是以16進制進行編碼的,那么從0x00 -> 0xff是多大呢,就是十進制的256。可是這里只有13個文件,並沒有256個,這就是RBD的精簡置備的一個驗證,剛剛創建foo的時候,一個都沒有呢,而這里多出的13個,是因為剛剛格式化成xfs時生成的。

查看頭兩個對象:

[root@node3 ~]# rados -p testpool get rbd_data.3723643c9869.0000000000000000 rbd_data.3723643c9869.0000000000000000

[root@node3 ~]# hexdump -vC rbd_data.3723643c9869.0000000000000000|more 
00000000  58 46 53 42 00 00 10 00  00 00 00 00 00 04 00 00  |XFSB............|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  0d d3 5d 60 90 8c 42 d4  9f 72 90 53 4b 4f b1 4c  |..]`..B..r.SKO.L|
……
[root@node3 ~]# ll rbd* -h
-rw-r--r-- 1 root root 128K 10月 21 17:29 rbd_data.3723643c9869.0000000000000000
-rw-r--r-- 1 root root  32K 10月 21 17:31 rbd_data.3723643c9869.0000000000000001
[root@node3 ~]# file rbd_data.3723643c9869.0000000000000000
rbd_data.3723643c9869.0000000000000000: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
[root@node3 ~]# file rbd_data.3723643c9869.0000000000000001
rbd_data.3723643c9869.0000000000000001: data

查看第一個對象,開頭就是XFSB,可以驗證這是剛剛mkfs.xfs留下來的,這時候查看文件大小,發現並沒有4M那么大,別擔心一會會變大的,值得關注的是file第0x00個對象,輸出居然是XFS filesystem data,進一步驗證了剛剛mkfs.xfs的足跡,這和整個塊的file信息是一樣的

參考文獻:

大話Ceph--RBD那點事兒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM