ceph rbd map failed
探索 kernel RBD map 失败的问题。场景
搭完 rbd mirror后,想通过client往image里写一些数据,所以在client端map rbd设备,结果失败了。
rbd mirror的image 需要两个属性:exclusive-lock, journaling
原因
查看rbd image info
# rbd info rbd/image-1
rbd image 'image-1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.108b238e1f29
format: 2
features: exclusive-lock, journaling
flags:
journal: 108b238e1f29
mirroring state: enabled
mirroring global id: c603d9dc-6f8d-49e0-ab68-5944d348e527
mirroring primary: true
输出
# rbd map rbd/image-1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail" or so.
rbd: map failed: (6) No such device or address
然后dmesg看一下
# dmesg | tail
[ 64.808315] rbd: loaded (major 251)
[ 64.818369] libceph: mon2 172.20.2.160:6789 session established
[ 64.819187] libceph: client14167 fsid 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
[ 64.836328] rbd: image image-1: image uses unsupported features: 0x40
libceph: mon1 172.20.2.161:6789 session established
libceph: client4313 fsid 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
rbd: rbd0: capacity 10737418240 features 0x1
rbd: image image-1: image uses unsupported features: 0x40
错误原因
image uses unsupported features: 0x40
不支持特性 0x40 = 64,也就是不支持特性 journaling
关于内核支持的特性分析
查看内核版本
# uname -r
3.10.0-327.el7.x86_64
根据查阅资料和实践,发现:
CentOS的3.10内核仅支持其中的layering 和 exclusive-lock,其他feature概不支持
内核4.6仍然只支持:layering、exclusive-lock和 striping 属性
# rbd info rbd/test-map
rbd image 'test-map':
size 512 MB in 128 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.10ca238e1f29
format: 2
features: layering, exclusive-lock
flags:
map
# rbd map rbd/test-map
/dev/rbd1
此时可以map成功。
RBD特性解析
特性一览表
RBD支持的特性,及具体BIT值的计算如下
属性 功能 BIT码
layering 支持分层 1
striping 支持条带化 v2 2
exclusive-lock 支持独占锁 4
object-map 支持对象映射(依赖 exclusive-lock ) 8
fast-diff 快速计算差异(依赖 object-map ) 16
deep-flatten 支持快照扁平化操作 32
journaling 支持记录 IO 操作(依赖独占锁) 64
ceph kraken版本默认属性值
# ceph --show-config|grep rbd|grep features
rbd_default_features = 61
为啥是61?我们创建一个默认配置的rbd看看
# rbd create test-feature --size 64
# rbd info rbd/test-feature
rbd image 'test-feature':
size 65536 kB in 16 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.107d238e1f29
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
1+4+8+16+32 = 61
就是说除了特性:striping 和 journaling 外都开启了。
控制属性
有三种方法来开启需要的特性
1、在创建image时,通过 --image-feature 来指定需要开启的特性
2、对已存在的image可以通过如下命令开启和关闭
1
2
rbd feature enable <pool-name>/<image-name> <feature-name>
rbd feature disable <pool-name>/<image-name> <feature-name>
3、当然,每次通过enable和disable来不是很便捷,可以通过修改配置文件来解决
1
2
3
4
vim /etc/ceph/ceph.conf
...
rbd_default_features = 1
...
具体该设为多少可以通过上面BIT值查表计算得出。
页:
[1]