<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/
目錄下。能夠開始愉快的玩耍了!!