[关闭]
@dyj2017 2017-10-31T17:36:09.000000Z 字数 5337 阅读 3053

查看,创建,删除,映射rbd镜像

ceph ceph实验 pg


1. 创建镜像:

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

2. 查看镜像信息:

  1. [root@node3 ~]# rbd info testpool/foo
  2. rbd image 'foo':
  3. size 1024 MB in 256 objects
  4. order 22 (4096 kB objects)
  5. block_name_prefix: rbd_data.3723643c9869
  6. format: 2
  7. features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
  8. flags:
  9. 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中生成的对象:

  1. [root@node3 ~]# rados -p testpool ls
  2. rbd_directory
  3. rbd_info
  4. rbd_object_map.3723643c9869
  5. rbd_id.foo
  6. rbd_header.3723643c9869

查看 rbd_directory 中的内容:

  1. [root@node3 ~]# rados -p testpool listomapvals rbd_directory
  2. id_3723643c9869
  3. value (7 bytes) :
  4. 00000000 03 00 00 00 66 6f 6f |....foo|
  5. 00000007
  6. name_foo
  7. value (16 bytes) :
  8. 00000000 0c 00 00 00 33 37 32 33 36 34 33 63 39 38 36 39 |....3723643c9869|
  9. 00000010

rbd_directory会增加刚刚的创建的rbdName及其prefix,rbd_directory文件就是这个pool里面的所有RBD的索引。

查看 rbd_id.foo 中的内容:

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

每个RBD刚创建(format 2)时都会生成一个rbd_id.rbdName这样的文件,里面保存了这个块的prefix。

查看 rbd_header.3723643c9869 中的内容:

  1. [root@node3 ~]# rados -p testpool listomapvals rbd_header.3723643c9869
  2. create_timestamp
  3. value (8 bytes) :
  4. 00000000 4c eb ea 59 0d f4 01 06 |L..Y....|
  5. 00000008
  6. features
  7. value (8 bytes) :
  8. 00000000 3d 00 00 00 00 00 00 00 |=.......|
  9. 00000008
  10. object_prefix
  11. value (25 bytes) :
  12. 00000000 15 00 00 00 72 62 64 5f 64 61 74 61 2e 33 37 32 |....rbd_data.372|
  13. 00000010 33 36 34 33 63 39 38 36 39 |3643c9869|
  14. 00000019
  15. order
  16. value (1 bytes) :
  17. 00000000 16 |.|
  18. 00000001
  19. size
  20. value (8 bytes) :
  21. 00000000 00 00 00 40 00 00 00 00 |...@....|
  22. 00000008
  23. snap_seq
  24. value (8 bytes) :
  25. 00000000 00 00 00 00 00 00 00 00 |........|
  26. 00000008

rbd_header 保存的是一个 RBD 镜像的元数据
再创建一个镜像,看看 testpool 中的对象和 rbd_directory 有什么变化:

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

查看testpool中存储的内容:

  1. [root@node3 ~]# rados -p testpool ls|sort
  2. rbd_directory
  3. rbd_header.3723643c9869
  4. rbd_header.3734643c9869
  5. rbd_id.foo
  6. rbd_id.myimage
  7. rbd_info
  8. rbd_object_map.3723643c9869
  9. rbd_object_map.3734643c9869

可以看到多了myimage相关的内容,再看看 rbd_directory 中的内容:

  1. [root@node3 ~]# rados -p testpool listomapvals rbd_directory
  2. id_3723643c9869
  3. value (7 bytes) :
  4. 00000000 03 00 00 00 66 6f 6f |....foo|
  5. 00000007
  6. id_3734643c9869
  7. value (11 bytes) :
  8. 00000000 07 00 00 00 6d 79 69 6d 61 67 65 |....myimage|
  9. 0000000b
  10. name_foo
  11. value (16 bytes) :
  12. 00000000 0c 00 00 00 33 37 32 33 36 34 33 63 39 38 36 39 |....3723643c9869|
  13. 00000010
  14. name_myimage
  15. value (16 bytes) :
  16. 00000000 0c 00 00 00 33 37 33 34 36 34 33 63 39 38 36 39 |....3734643c9869|
  17. 00000010

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

3. 删除镜像:

  1. [root@node3 ~]# rbd rm testpool/myimage
  2. Removing image: 100% complete...done.
  3. [root@node3 ~]# rbd -p testpool ls
  4. foo

4. 映射使用rbd:

4.1. 映射镜像:

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

映射镜像如果提示 rbd: sysfs write failed,参考 映射块设备提示rbd: sysfs write failed的解决方法

4.2. 格式化该设备:

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

4.3. 挂载该设备:

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

上面的33M就是刚格式化完的xfs系统的大小,此时查看集群发生的变化,观察下:

  1. [root@node3 ~]# rados -p testpool ls|sort
  2. rbd_data.3723643c9869.0000000000000000
  3. rbd_data.3723643c9869.0000000000000001
  4. rbd_data.3723643c9869.000000000000001f
  5. rbd_data.3723643c9869.000000000000003e
  6. rbd_data.3723643c9869.000000000000005d
  7. rbd_data.3723643c9869.000000000000007c
  8. rbd_data.3723643c9869.000000000000007d
  9. rbd_data.3723643c9869.000000000000007e
  10. rbd_data.3723643c9869.000000000000009b
  11. rbd_data.3723643c9869.00000000000000ba
  12. rbd_data.3723643c9869.00000000000000d9
  13. rbd_data.3723643c9869.00000000000000f8
  14. rbd_data.3723643c9869.00000000000000ff
  15. rbd_directory
  16. rbd_header.3723643c9869
  17. rbd_header.3752643c9869
  18. rbd_id.foo
  19. rbd_id.foo1
  20. rbd_info

比刚刚多了13个文件,这些文件的后缀缀是以16进制进行编码的,那么从0x00 -> 0xff是多大呢,就是十进制的256。可是这里只有13个文件,并没有256个,这就是RBD的精简置备的一个验证,刚刚创建foo的时候,一个都没有呢,而这里多出的13个,是因为刚刚格式化成xfs时生成的。

查看头两个对象:

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

查看第一个对象,开头就是XFSB,可以验证这是刚刚mkfs.xfs留下来的,这时候查看文件大小,发现并没有4M那么大,别担心一会会变大的,值得关注的是file第0x00个对象,输出居然是XFS filesystem data,进一步验证了刚刚mkfs.xfs的足迹,这和整个块的file信息是一样的

参考文献:

大话Ceph--RBD那点事儿

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注