<center></center>node
原文地址:经过ganesha-nfs导出Ceph为NFS(Luminous)c++
自从Jewel
版本,nfs-ganesha
开始支持ceph
,而且把对接点选择了rados
。Ganesha
支持两种方式将Ceph
导出为NFS
,一种经过RGW
,一种经过CephFS
,经过FSAL
模块 链接到RGW
或者CephFS
, 其中,FSAL_RGW
调用librgw2
将NFS
协议转义为S3
协议再经过RGW
存入到Ceph
中,FSAL_CEPH
调用libcephfs1
将NFS
转义为Cephfs
协议再存入到Ceph
中。因此须要额外安装这两个包。git
本文就Luminous
版本的ceph
基于ganesha
导出nfs
部署,而且测试一下rgw
和cephfs
的性能。@徐小胖已经就jewel
版本的过程进行了大体的讲解,我这边主要分享一下我遇到他文章没提到的和Luminous
场景致使的问题。github
一些编译须要的公共库ubuntu
yum install gcc git cmake autoconf libtool bison flex doxygen openssl-devel gcc-c++ krb5-libs krb5-devel libuuid-devel nfs-utils -y
ubuntu
的我也试了一下,主要有如下几个包不一样:centos
gcc-c++
-> g++
libuuid-devel
-> uuid-dev
nfs-utils
-> nfs-kernel-server
若是要生成FSAL_RGW
模块,须要安装librgw2-devel
(我装的librgw-devel
也能够work
,看了so
文件发现就是2
,只是创建了映射关系,这个看了源码知道了是由于K
版本对librgw
编译这块作了升级,加了2
标识一下)性能
yum install librgw2-devel -y
若是要生成FSAL_CEPH
模块,须要安装libcephfs1-devel
测试
yum install libcephfs1-devel -y
上面两篇文章一个下载的是v2.3 stable
,一个是v2.4 stable
,两个我都试过,都会在make
到80%
左右的时候报错,应该是源码版本和库的版本有冲突致使的,这个问题耽误我挺长时间的,后来猜测多是版本问题,尝试了一下v2.5 stable
的源码就能够了flex
git clone -b V2.5-stable https://github.com/nfs-ganesha/nfs-ganesha.git --recursive
注意:(重要)ui
最近我同事根据这篇文档部署nfs-ganesha
的时候,发现以后cmake
的操做后USE_FSAL_RGW
始终是OFF
的状态,一开始检查了一下环境发现ganesha
是v2.5
,而后ceph
也是L
版本,centos
也是7
。
报错以下:
local RGW version is 1.1.4 not suitable match, but required latest RGW version is 1.1.6
很好理解,就是咱们安装的RGW
达不到nfs-ganesha
的要求,首先咱们尝试去安装新的版本,可是yum
的源已经配置了luminous
,而且网上搜索了一圈并无找到更新的。
ok,那就第二步,那就找缘由一样的环境为啥我能够成功?而这位同事却不行?莫非由于我帅?不能这么逆天吧^_^ (明明能够靠脸吃饭,恰恰靠才华,哎……)
言归正传,经过报错信息查看源代码?定位到了报错文件src/CMakeLists.txt
,而后代码中对RGW
的版本要求也的确是1.1.6
,回过头再看我以前下载下来的源代码,怪异的现象发生了,我代码中对RGW
的版本要求只有1.1.3
,此时个人第一反应就是应该这个文件被修改过致使两份代码不同,出于本能直接上了github
,果不其然,发现了mattbenjamin
同窗在10
月17
号在v2.5
的分支上提交了一个commit
针对RGW
版本作出了修改!具体参看commit详情,而这位贡献者几乎同时也在ceph
提交了相关代码。这样想一想就说得通了,我在搭建nfs-ganesha
的时候刚好是在他提交以前的,因此我本地RGW
本地版本是1.1.4
是比要求版本1.1.3
要高的,虽然不是彻底match
,可是也基本符合了要求,而我这位同事脸就比较黑了。。。
那该怎么解决这个问题呢?
有两种解决方案:
Luminous Ceph
把最新的RGW
包编译出来,由于如今这个资源还没被公开分享出来;这么看来第二种更为简单一些,咱们也是采用的这种方式,git clone v2.5 stable
后,而后git checkout
恰当的版本号便可。
总结:
其实直接clone
实时的代码这是不合理的,由于你不知道他何时会更新。正确的方式是咱们应该找到稳定的release
版本,nfs-ganesha
也有提供一系列的release,而咱们经过查看2.5 tree
上面的commit
信息,能够知道RGW
的改动是介于2.5.3
和2.5.4
之间的,因此咱们下载2.5.3
较为合适,下载地址在这里。
这边还须要注意一个问题,这边release
包下载下来你会发现libntrirpc
这个文件夹没有内容,出现这个问题是由于libntrirpc
对应的也是一个git
仓库,咱们须要去ntrirpc手动克隆,而后经过nfs-ganesha
的目录发现对ntrirpc
的版本要求是fadcbde
(这些都是上github
能够看到的),咱们须要作的就是在下载下来的ntrirpc
目录下切到fadcbde
这个commit
上,并把当前的内容拷贝到nfs-ganesha
的libntrirpc
目录下。
实在搞不定的童鞋,我提供一个我克隆的nfs-ganesha
的代码包,大家能够对比一下,这个我是能够成功部署的
附:个人nfs-ganesha
下载地址
编译nfs-ganesha
, 注意打开对应的模块:
FSAL_RGW
模块,则在编译选项中添加: -DUSE_FSAL_RGW=ON
FSAL_CEPH
模块,则在编译选项中添加: -DUSE_FSAL_CEPH=ON
cd src/ mkdir build cd /build/ cmake -DUSE_FSAL_RGW=ON -DUSE_FSAL_CEPH=ON ../
cmake
的过程当中会有如下输出:
-- Looking for ceph_ll_lookup_root in cephfs - found -- Found cephfs libraries: /usr/lib64/libcephfs.so -- Found CEPHFS: /usr/include -- Looking for rgw_mount in rgw -- Looking for rgw_mount in rgw - found -- Found rgw libraries: /usr/lib64/librgw.so -- Found RGW: /usr (found suitable version "1.1", minimum required is "1.1") ... -- USE_FSAL_CEPH = ON -- USE_FSAL_CEPH_MKNOD = OFF -- USE_FSAL_CEPH_SETLK = OFF -- USE_FSAL_CEPH_LL_LOOKUP_ROOT = ON -- USE_FSAL_RGW = ON
这一步,很重要,不少时候会由于没有装好的librgw2-devel
或者libcephfs1-devel
致使这边的USE_FSAL_RGW
或者USE_FSAL_CEPH
状态为OFF
确保,确保,确保: -- USE_FSAL_CEPH
为ON
,以及-- USE_FSAL_RGW
为ON
。
若是是OFF
,请检查下librgw2-devel
或者libcephfs1-devel
是否有安装,若是这两个包都已经安装了,还显示为OFF
, 能够尝试下清空编译目录:rm -rf build/*
,再进行编译,若是依旧为 OFF
,能够尝试下删除全部的Ceph
包,再从新yum install ceph librgw2-devel libcephfs1-devel -y
。
编译和安装,在build
目录下
make make install
PS:
在make install
生成的输出中,能够看到:-- Up-to-date: /usr/share/doc/ganesha/config_samples/rgw.conf
...
-- Up-to-date: /usr/share/doc/ganesha/config_samples/ceph.conf这两个文件就是配置将
RGW
和CephFS
配置为ganesha-nfs
的配置模板。
注意Path
后面的路径须要加引号,rgw
替换成建立S3
用户生成的用户信息
cat /etc/ganesha/ganesha.conf EXPORT { Export_ID=1; Path = "/"; Pseudo = /cephfs; Access_Type = RW; NFS_Protocols = 4; Transport_Protocols = TCP; FSAL { Name = CEPH; } } EXPORT { Export_ID=2; Path = "/"; Pseudo = /rgw; Access_Type = RW; Squash = No_root_squash; NFS_Protocols = 4; Transport_Protocols = TCP; FSAL { Name = RGW; User_Id = "admin"; Access_Key_Id ="1MWH3LWM1BS4ZF4HN5IH"; Secret_Access_Key = "cuObxYgtl1lJgqNxOIpENycVqXfxLxZ8z5IXDM0O"; } } RGW { ceph_conf = "/etc/ceph/ceph.conf"; }
ganesha.nfsd -f /etc/ganesha/ganesha.conf -L /var/log/nfs-ganesha.log -N NIV_DEBUG
若是一切顺利,你应该能够看到ganesha.nfsd
进程在那,若是进程不在,那么查看Log
,记得在启动进程前,关闭全部CephX
配置。
重要:librgw init failed (-5)
解决方法
报错内容以下
RGW-1 : nfs-ganesha-2232083[main] create_export :FSAL :CRIT :RGW module: librgw init failed (-5) RGW-1 : nfs-ganesha-2232083[main] mdcache_fsal_create_export :FSAL :MAJ :Failed to call create_export on underlying FSAL
通过屡次尝试,包括在ganesha.conf
内添加init_args
指定秘钥和Ceph
的用户,ganesha-nfs
均没法启动,报的错如标题,解决方法就是关闭CephX
,将/etc/ceph/ceph.conf
内的三个 cephx
改成none
,而后重启ceph-mon
,ceph-osd
,ceph-radosgw
,ceph-mds
进程,再启动ganesha-nfs
,便可正常运行。
须要注意的是:
当你在当前节点上,关闭cephx
后,你用ceph -s
查看集群状态时,这时候会报错说明因为没有auth
认证致使没法链接集群,因此我当时试了好久,尽管nfs-ganesha
已经运行了,可是mount
都没有成功export
,查看log
才发现原来在init
配置的时候就失败了,致使这个问题的缘由是我只关闭了一个节点的cephx
,因此须要作的就是将集群内全部节点的cephx
所有关闭,而后集群就能够正常访问了,而且nfs-ganesha
也不会由于cephx
致使加载配置出错
[root@node1 build]# showmount -e Export list for node1: / (everyone) / (everyone)
[root@node1 mnt]# mount -t nfs4 192.168.1.1:/ /mnt/ceph/ root@node1 mnt]# ls ceph/* ceph/cephfs: test ceph/rgw: my-new-bucket
说明CephFS
和RGW
都已经正常对接。
若是,你所使用的admin
用户名下有不少的桶,那么这些桶都会以/mnt/rgw/xxbucket
的结构显示出来,若是你在/mnt/rgw/
下创建的一个目录,那么就至关于经过RGW
创建了一个桶,因此,你执行touch /mnt/rgw/123
是会报错的,由于不符合S3
的对象必须位于桶内的规定,简单点说,就是把/mnt/rgw/
和S3
的根目录一一对应便可。
一样,CephFS
内的内容都会显示在/mnt/cephfs/
目录下。能够开始愉快的玩耍了!!