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

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐