1.rbd map失败,然后dmesg查看到如下错误信息。ceph集群版本12.2.10, ceph-common 12.2.10, kernel 3.10
libceph: mon0 172.16.0.104:6789 feature set mismatch, my 106b84a842a42 < server's 40106b84a842a42, missing 400000000000000
出现该信息的原因在于待映射机器内核太低不支 feature flag 400000000000000,需要kernel>=4.5的机器才能map成功。
在ceph集群版本大于v10.0.2 (jewel)时候,会需要这个400000000000000这个特性,可以手动关闭
ceph osd crush tunables hammer
可以参考:https://silvenga.com/ceph-feature-mismatch/
2.由于新建image的时候,image包含了许多特性,会在kernel版本低的机器上无法map成功
比如一个image包含了这么多features,在kernel 3.10的机器上无法map成功,必须使用rbd features disable命令禁用所有才能挂载成功,这个时候如果想使用这些特性,但是又不想升级内核,那么就可以尝试NDB
rbd image 'test':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
id: 8e221d6b8b4567
block_name_prefix: rbd_data.8e221d6b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
sudo rbd map -p $poolName --image $imageName -m $monHost --id $user --key $keyring
当然你也可以把monHost保存在/etc/ceph/ceph.conf文件中,keyring保存在/etc/ceph/ceph.client.$user.keyring文中,然后使用命令
sudo rbd map $poolName/$imageName --id $user
取消映射
sudo rbd unmap /dev/rbd0
在jewel及以后版本中,RBD支持将RBD image map为本地nbd设备
由于rbd是走的kernel模块,因此对kernel版本要求过高,如果不想升级kernel版本那么就可以尝试NBD。
rbd-nbd的实现是依赖librbd用户空间和NBD模块,大多数Linux都是支持NBD模块的,因此通过该方法map image对机器内核版本要求不高,但是性能比rbd低
该条命名发现在某些版本ceph-common中会执行不成功,无法识别-m和–key参数
sudo rbd nbd map -p $poolName --image $imageName -m $monHost --id $user --key $keyring
只能添加这些信息到本机了
sudo echo -e "[client.$user]\nkey = $keyring" > /etc/ceph/ceph.client.$user.keyring
sudo echo -e "[global]\nmon host = $monHost" > /etc/ceph/ceph.conf
取消映射
sudo rbd nbd unmap /dev/nbd0
caps: [mds] allow r path=/
可以参考:https://wiki2.xbits.net:4430/storage:ceph:cephfs%E9%99%90%E5%88%B6%E6%8C%82%E8%BD%BD%E7%82%B9
cephfsPath: 对应cephfs中的一个路径
path:对应本机上的一个路径
sudo mount -t ceph $monHost:$cephfsPath $path -o name=$user,secret=$keyring
不过只执行上面命令的话,机器重启之后就不会重新挂载,如果需要添加开机自动挂载需要在fstab中增加信息
sudo echo "$monHost:$cephfsPath $absPath ceph name=$user,secret=$keyring,_netdev,noatime 0 0" >> /etc/fstab
比如:
10.16.42.79,10.16.42.162,10.16.42.193,10.16.42.76:/test/zz /root/ceph-test ceph name=admin,secret=AQAlfVVbsa0hBxAASO4ifEqlRwx2DvPJYWliuA==,_netdev,noatime 0 0
卸载的话直接执行umount即可
sudo umount /your/dir/path
可以参考官网:https://docs.ceph.com/docs/master/cephfs/fstab/
cephfsPath: 对应cephfs中的一个路径
path:对应本机上的一个路径
absPath: path对应的绝对路径
sudo ceph-fuse -n client.$user -r $cephfsPath --key $keyring -m $monHost $path
(发现不同ceph版本,ceph-fuse 在fstab中挂载方式有区别,所以写了两个方式,这个对应的是jewel,参考官网:https://docs.ceph.com/docs/jewel/cephfs/fstab/)
如果需要添加开机启动的话,需修改fstab
sudo echo -e "[global]\nmon host = $monHost" > /etc/ceph/ceph.conf
sudo echo "id=$user,conf=/etc/ceph/ceph.conf,key=$keyring,client_mountpoint=$cephfsPath $absPath fuse.ceph defaults,noatime 0 0" >> /etc/fstab
上面操作分两步,第一步将mon host信息添加到/etc/ceph/ceph.conf中,其他信息都不用添加
[global]
mon host = 10.16.42.79,10.16.42.162,10.16.42.193,10.16.42.76
第二步添加信息到fstab,比如:
id=admin,conf=/etc/ceph/ceph.conf,key=AQAlfVVbsa0hBxAASO4ifEqlRwx2DvPJYWliuA==,client_mountpoint=/test/zz /root/ceph-test fuse.ceph defaults,noatime 0 0
卸载可以用umount或fusermount命令,暂时还没发现两者的区别,官方文档也没说,尽量用fusermount吧
sudo umount /your/dir/path
sudo fusermount -u /your/dir/path
(之前一直使用的上面的方法添加到fstab,后来发现有的机器能行,有的不能行,然后又google搜了一圈,发现到了更高的版本后方式已经变了。我的版本是:12.2.10 。参考官网:https://docs.ceph.com/docs/master/cephfs/fstab/)
但是官网上的方式只是挂载到根目录,也没写怎么挂载子目录真的是醉了,吐槽下写ceph官网文档的人。
好在搜到了一个博客:http://manjusri.ucsc.edu/2017/09/25/ceph-fuse/
新版本挂载方式如下:
把下面这行加到fstab中就行。此外也要添加ceph.conf文件,方式跟上面一样
none /root/test fuse.ceph ceph.id=admin,ceph.conf=/etc/ceph/ceph.conf,ceph.client_mountpoint=/test/zz,_netdev,defaults 0 0
挂载子目录就靠ceph.client_mountpoint这个参数来设置了。over