Ceph RBD 和Cephfs 的使用指南(映射挂载卸载)
0x01 RBD映射
tips:
- rbd的映射需要Linux内核支持ceph和rbd模块,可以通过命令modprobe ceph、modprobe rbd来判断
- 在挂载 rbd之前需要下载对应版本的ceph-common,最好是>=集群版本,否则可能出现兼容性问题
- 低版本的Linux内核可能导致各种挂载问题,是因为内核模块开发进度跟不上Ceph开发进度导致。可以升级内核,或者使用NBD方式挂载
总结下自己在遇到的问题:
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
0x02 NBD映射
在jewel及以后版本中,RBD支持将RBD image map为本地nbd设备
由于rbd是走的kernel模块,因此对kernel版本要求过高,如果不想升级kernel版本那么就可以尝试NBD。
rbd-nbd的实现是依赖librbd用户空间和NBD模块,大多数Linux都是支持NBD模块的,因此通过该方法map image对机器内核版本要求不高,但是性能比rbd低
tips:
- rbd-nbd的映射需要Linux内核支持nbd模块,可以通过命令modprobe nbd来判断
- 在挂载 rbd之前需要下载对应版本的ceph-common和 rbd-nbd 最好是>=集群版本,否则可能出现兼容性问题
映射命令
该条命名发现在某些版本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
0x03 cephfs kernel 挂载
tips:
- 如果在一套cephfs系统中,对不同用户授权不同路径的读写权限,此时用kernel模式挂载的话,如果kernel版本低于4.9会出现挂载失败的问题。
解决上述问题的办法:升级kernel;或者给每个用户都授权根目录的读权限,但是这样的话又会破坏权限管理,因此不是很推荐。在kernel低于4.9的机器上还是用ceph-fuse挂载吧
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
kernel mount in fstab
不过只执行上面命令的话,机器重启之后就不会重新挂载,如果需要添加开机自动挂载需要在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/
0x04 cephfs fuse挂载
tips:
- ceph-fuse是通过用户空间实现的,因此性是比不上kernel方式挂载的,应该如果是生产环境还是应该尽量使用kernel挂载
- ceph-fuse对内核没有太多要求,在使用的使用只需安装ceph-fuse及其依赖包即可,同样版本应该>=集群版本
挂载命令
cephfsPath: 对应cephfs中的一个路径
path:对应本机上的一个路径
absPath: path对应的绝对路径
sudo ceph-fuse -n client.$user -r $cephfsPath --key $keyring -m $monHost $path
ceph fuse mount in fstab 1
(发现不同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
ceph fuse mount in fstab 2
(之前一直使用的上面的方法添加到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
更多推荐
所有评论(0)