經過ganesha-nfs導出Ceph爲NFS(Luminous)

<center>ganesha</center>node

原文地址:經過ganesha-nfs導出Ceph爲NFS(Luminous)c++

自從Jewel版本,nfs-ganesha開始支持ceph,而且把對接點選擇了radosGanesha支持兩種方式將Ceph導出爲NFS,一種經過RGW,一種經過CephFS,經過FSAL模塊 鏈接到RGW或者CephFS, 其中,FSAL_RGW調用librgw2NFS協議轉義爲S3協議再經過RGW存入到Ceph中,FSAL_CEPH 調用libcephfs1NFS轉義爲Cephfs協議再存入到Ceph 中。因此須要額外安裝這兩個包。git

本文就Luminous版本的ceph基於ganesha導出nfs部署,而且測試一下rgwcephfs的性能。@徐小胖已經就jewel版本的過程進行了大體的講解,我這邊主要分享一下我遇到他文章沒提到的和Luminous場景緻使的問題。github

參考連接:

環境聲明

  • os: centos7
  • ceph: luminous
  • nfs-gnesha: v2.5 stable(important)

安裝依賴

一些編譯須要的公共庫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,兩個我都試過,都會在make80%左右的時候報錯,應該是源碼版本和庫的版本有衝突致使的,這個問題耽誤我挺長時間的,後來猜測多是版本問題,嘗試了一下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的狀態,一開始檢查了一下環境發現ganeshav2.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同窗在1017號在v2.5的分支上提交了一個commit針對RGW版本作出了修改!具體參看commit詳情,而這位貢獻者幾乎同時也在ceph提交了相關代碼。這樣想一想就說得通了,我在搭建nfs-ganesha的時候剛好是在他提交以前的,因此我本地RGW本地版本是1.1.4是比要求版本1.1.3要高的,雖然不是徹底match,可是也基本符合了要求,而我這位同事臉就比較黑了。。。

那該怎麼解決這個問題呢?

有兩種解決方案:

  1. 手動編譯Luminous Ceph把最新的RGW包編譯出來,由於如今這個資源還沒被公開分享出來;
  2. 克隆這個改動以前的代碼

這麼看來第二種更爲簡單一些,咱們也是採用的這種方式,git clone v2.5 stable後,而後git checkout恰當的版本號便可。

總結:

其實直接clone實時的代碼這是不合理的,由於你不知道他何時會更新。正確的方式是咱們應該找到穩定的release版本,nfs-ganesha也有提供一系列的release,而咱們經過查看2.5 tree上面的commit信息,能夠知道RGW的改動是介於2.5.32.5.4之間的,因此咱們下載2.5.3較爲合適,下載地址在這裏

這邊還須要注意一個問題,這邊release包下載下來你會發現libntrirpc這個文件夾沒有內容,出現這個問題是由於libntrirpc對應的也是一個git倉庫,咱們須要去ntrirpc手動克隆,而後經過nfs-ganesha的目錄發現對ntrirpc的版本要求是fadcbde(這些都是上github能夠看到的),咱們須要作的就是在下載下來的ntrirpc目錄下切到fadcbde這個commit上,並把當前的內容拷貝到nfs-ganeshalibntrirpc目錄下。

實在搞不定的童鞋,我提供一個我克隆的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_CEPHON,以及-- USE_FSAL_RGWON

若是是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

這兩個文件就是配置將RGWCephFS配置爲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

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-monceph-osdceph-radosgwceph-mds 進程,再啓動ganesha-nfs,便可正常運行。

須要注意的是:

當你在當前節點上,關閉cephx後,你用ceph -s查看集羣狀態時,這時候會報錯說明因爲沒有auth認證致使沒法鏈接集羣,因此我當時試了好久,儘管nfs-ganesha已經運行了,可是mount都沒有成功export,查看log才發現原來在init配置的時候就失敗了,致使這個問題的緣由是我只關閉了一個節點的cephx,因此須要作的就是將集羣內全部節點的cephx所有關閉,而後集羣就能夠正常訪問了,而且nfs-ganesha也不會由於cephx致使加載配置出錯

Check Export

[root@node1 build]# showmount -e  
Export list for node1:  
/ (everyone)  
/ (everyone)

掛載 NFS

[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

說明CephFSRGW都已經正常對接。
若是,你所使用的admin用戶名下有不少的桶,那麼這些桶都會以/mnt/rgw/xxbucket的結構顯示出來,若是你在/mnt/rgw/下創建的一個目錄,那麼就至關於經過RGW創建了一個桶,因此,你執行touch /mnt/rgw/123是會報錯的,由於不符合S3的對象必須位於桶內的規定,簡單點說,就是把/mnt/rgw/S3的根目錄一一對應便可。

一樣,CephFS內的內容都會顯示在/mnt/cephfs/目錄下。能夠開始愉快的玩耍了!!

相關文章
相關標籤/搜索