nfs客戶端掛載出錯 mount.nfs access denied by server while mounting

    在生產環境中一系統因架構變化後,把一模塊原有的單節點擴展成了兩個節點,前端採用用nginx做負載的架構,而這兩個節點需要一個公共的存儲來存放用戶上傳的圖片,用戶的併發不高,再因原有業務模塊是從nginx主機上剝離出來的,在原nginx主機上有“img”這個存儲圖片的目錄,所以考慮在nginx主機上安裝nfs服務,再在兩個節點上同點掛載“img”目錄實現集羣節點對圖片目錄的訪問。

    NFS服務的安裝比較簡單,但在上生產環境時還是應該在自己的測試環境先驗證,這裏把安裝過程記錄如下:

服務端配置

NFS服務端系統環境:

[root@nginx-01 ~]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
[root@nginx-01 ~]# uname -r
2.6.32-431.el6.x86_64

如果系統沒有安裝nfs服務,運行以下命令安裝:

[root@nginx-01 ~]# yum -y install nfs-utils rpcbind
[root@nginx-01 ~]# service rpcbind start
[root@nginx-01 ~]# service nfs start
[root@nginx-01 ~]# chkconfig nfs on

配置共享目錄:

[root@nginx-01 ~]# vim /etc/exports
/home/tomcat/img/ 192.168.207.128(insecure,rw,sync,anonuid=500,anongid=500)

#此文件的配置格式爲:<輸出目錄> [客戶端1 選項(訪問權限,用戶映射,其他)] [客戶端2 選項(訪問權限,用戶映射,其他)]

#註釋

insecure    當mount監聽端口大於1024時需要使用此參數

[root@nginx-01 ~]# ss -tnlp | grep mountd
LISTEN     0      128                       *:50288                    *:*      users:(("rpc.mountd",5354,8))
LISTEN     0      128                       *:33842                    *:*      users:(("rpc.mountd",5354,16))
LISTEN     0      128                      :::54325                   :::*      users:(("rpc.mountd",5354,14))
LISTEN     0      128                       *:43992                    *:*      users:(("rpc.mountd",5354,12))
LISTEN     0      128                      :::50657                   :::*      users:(("rpc.mountd",5354,10))
LISTEN     0      128                      :::33795                   :::*      users:(("rpc.mountd",5354,18))

rw   read-write,可讀寫;

sync:文件同時寫入硬盤和內存;

async:文件暫存於內存,而不是直接寫入內存;

no_root_squash:NFS客戶端連接服務端時如果使用的是root的話,那麼對服務端分享的目錄來說,也擁有root權限。顯然開啓這項是不安全的。

root_squash:NFS客戶端連接服務端時如果使用的是root的話,那麼對服務端分享的目錄來說,擁有匿名用戶權限,通常他將使用nobody或nfsnobody身份;

all_squash:不論NFS客戶端連接服務端時使用什麼用戶,對服務端分享的目錄來說都是擁有匿名用戶權限;

anonuid:匿名用戶的UID值,通常是nobody或nfsnobody,可以在此處自行設定;

anongid:匿名用戶的GID值。

重新加載/etc/exports的配置:

[root@nginx-01 ~]# exportfs -r

查看本機共享的目錄:

[root@nginx-01 ~]# showmount -e localhost
Export list for localhost:
/home/tomcat/img 192.168.207.128

客戶端配置

客戶端系統環境:

root@rabbit-0:~# cat /etc/issue
Debian GNU/Linux 8 \n \l
root@rabbit-0:~# uname -r
3.16.0-4-amd64

在客戶端只需要安裝nfs-client端即可,如果沒有安裝請使用以下命令進行安裝:

root@rabbit-0:~# aptitude -y install nfs-client

列出nfs服務端共享的目錄:

root@rabbit-0:~# showmount -e 192.168.207.129
Export list for 192.168.207.129:
/home/tomcat/img 192.168.207.128

因生產環境是需要把nfs服務器的tomcat用戶家目錄下的img目錄共享出來後讓現有的兩個節點的tomcat用戶來掛載到家目錄的img目錄下,所以需要先切換到tomcat用戶下創建img目錄,如下:

root@rabbit-0:~# su - tomcat -c "mkdir ~/img"
root@rabbit-0:~# ls /home/tomcat/img/ -ld
drwxr-xr-x 2 tomcat tomcat 4096 12月  4 15:23 /home/tomcat/img/

掛載nfs的共享目錄:

root@rabbit-0:~# mount -t nfs 192.168.207.129:/home/tomcat/img /home/tomcat/img -o proto=tcp -o nolock

mount.nfs: access denied by server while mounting 192.168.207.129:/home/tomcat/img

原因:在centos 6 x64的系統下使用的是NFSv4,在/var/log/messages中能看到nfs啓動時的日誌輸出:

Dec  4 15:21:04 nginx-01 rpc.mountd[2178]: Version 1.2.3 starting
Dec  4 15:21:04 nginx-01 kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
Dec  4 15:21:04 nginx-01 kernel: NFSD: starting 90-second grace period
Dec  4 15:21:58 nginx-01 kernel: svc: 192.168.207.128, port=748: unknown version (4 for prog 100003, nfsd)

使用NFSv4時,在nfs服務端做如下操作:

[root@nginx-01 ~]# vim /etc/sysconfig/nfs
# Optional arguments passed to rpc.nfsd. See rpc.nfsd(8)
# Turn off v2 and v3 protocol support
RPCNFSDARGS="-N 2 -N 3"
        ----->啓用
# Turn off v4 protocol support
RPCNFSDARGS="-N 4"     ---->啓用

重啓服務:

[root@nginx-01 ~]# service nfs restart

再在客戶端再次嘗試掛載:

root@rabbit-0:~# mount -t nfs 192.168.207.129:/home/tomcat/img /home/tomcat/img -o proto=tcp -o nolock
root@rabbit-0:~#

成功掛載。

root@rabbit-0:~# ls /home/tomcat/img/
    #之前有兩個文件存在
fstab  test

測試:直接用root用戶創建一個文件,但這個文件的權限還是500的,在服務端uid爲500的用戶是tomcat,這正在我需要的效果。

root@rabbit-0:~# touch /home/tomcat/img/nfs.txt
root@rabbit-0:~# ls -l /home/tomcat/img/nfs.txt
-rw-r--r-- 1 500 500 0 12月  4 15:24 /home/tomcat/img/nfs.txt

最後讓此目錄自動在主機重啓後自動掛載,我這裏直接寫入到/etc/rc.local裏:

root@rabbit-0:~# cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
mount -t nfs 192.168.207.129:/home/tomcat/img /home/tomcat/img -o proto=tcp -o nolock
exit 0

重啓測試一下能否成功掛載。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章