1. 程式人生 > >搭建NFS網絡文件共享服務(幹貨)

搭建NFS網絡文件共享服務(幹貨)

NFS配置

先上幹貨:

以下是配置全過程(客戶端和服務端對比)
查看NFS軟件包
[root@server ~]# rpm -aq nfs-utils portmap rpcbind#這個命令比(yum grouplist)的更有效率

安裝
法一:[root@server ~]#yum groupinstall "NFS file server"
也可以使用
法二:[root@server ~]# yum install nfs-utils rpcbind -y來安裝


客戶端與服務端軟件對比
客戶端

 [root@client ~]# rpm -aq nfs-utils portmap rpcbind 
 rpcbind-0.2.0-13.el6_9.1.x86_64      
 nfs-utils-1.2.3-75.el6.x86_64  

服務端

[root@server ~]# rpm -aq nfs-utils portmap rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
nfs-utils-1.2.3-75.el6.x86_64

客戶端

[root@client ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]   
[root@client ~]# chkconfig  rpcbind on
[root@client ~]# chkconfig --list rpcbind
rpcbind         0:off   1:off   2:on    3:on    4:on    5:on    6:off

服務端

[root@server ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@server ~]# ps -ef |grep rpc
rpc       2959     1  0 12:24 ?        00:00:00 rpcbind
root      2966  1375  0 12:25 pts/1    00:00:00 grep --color=auto rpc
[root@server ~]# /etc/init.d/rpcbind status
rpcbind (pid  2959) is running...

[root@server ~]# rpcinfo -p localhost
     program vers proto   port  service
100000    4   tcp    111  portmapper
100000    3   tcp    111  portmapper
100000    2   tcp    111  portmapper
100000    4   udp    111  portmapper
100000    3   udp    111  portmapper
100000    2   udp    111  portmapper
[root@server ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
[root@server ~]# rpcinfo -p localhost     
 program vers proto   port  service
100000    4   tcp    111  portmapper
100000    3   tcp    111  portmapper
100000    2   tcp    111  portmapper
100000    4   udp    111  portmapper
100000    3   udp    111  portmapper
100000    2   udp    111  portmapper
100011    1   udp    875  rquotad
100011    2   udp    875  rquotad
100011    1   tcp    875  rquotad
100011    2   tcp    875  rquotad
100005    1   udp  62211  mountd
100005    1   tcp  16172  mountd
100005    2   udp  37947  mountd
100005    2   tcp  13732  mountd
100005    3   udp  46640  mountd
100005    3   tcp  38829  mountd
100003    2   tcp   2049  nfs
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100227    2   tcp   2049  nfs_acl
100227    3   tcp   2049  nfs_acl
100003    2   udp   2049  nfs
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs
100227    2   udp   2049  nfs_acl
100227    3   udp   2049  nfs_acl
100021    1   udp  39990  nlockmgr
100021    3   udp  39990  nlockmgr
100021    4   udp  39990  nlockmgr
100021    1   tcp   4795  nlockmgr
100021    3   tcp   4795  nlockmgr
100021    4   tcp   4795  nlockmgr

(如果 rpc服務沒開的情況下)

[root@server ~]# /etc/init.d/rpcbind stop #模擬關閉
Stopping rpcbind:                                          [  OK  ]
[root@server ~]# rpcinfo -p localhost    #則會報錯 
rpcinfo: can‘t contact portmapper: RPC: Remote system error - Connection refused 

服務端打開之後,開機自啟動設置;

[root@server ~]# chkconfig nfs on
[root@server ~]# chkconfig rpcbind on
[root@server ~]# chkconfig --list nfs #檢查
nfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@server ~]# chkconfig --list rpcbind #檢查
rpcbind         0:off   1:off   2:on    3:on    4:on    5:on    6:off

至此,已經完成基本服務的搭建了。


服務端NFS配置文件

[root@server ~]# mkdir /data
[root@server ~]# ll /etc/exports
-rw-r--r--. 1 root root 0 Jan 12  2010 /etc/exports
[root@server /]# cat /etc/exports 
####nfs data by nopsmile ####
/data 172.16.30.0/24(rw,sync)
[root@server /]# /etc/init.d/nfs reload
[root@server /]# showmount -e localhost
Export list for localhost:
/data 172.16.30.0/24

客戶端

[root@client ~]# showmount -e 172.16.30.190
Export list for 172.16.30.190:
/data 172.16.30.0/24
[root@client ~]# mount -t nfs 172.16.30.190:/data /mnt
[root@client ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             8.7G  1.5G  6.8G  18% /
tmpfs                 497M     0  497M   0% /dev/shm
/dev/sda1             194M   28M  157M  15% /boot
172.16.30.190:/data   8.7G  1.5G  6.8G  18% /mnt

如果永久生效 rc.local fstab裏面

[root@server /]# cat /var/lib/nfs/etab 
/data   172.16.30.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

以上配置完成。


概念補充

NFS網絡文件系統的使用很像windows系統的網絡共享、安全功能、網絡驅動器映射,這也和linux裏的samba服務類似。它是基於RPC協議/服務。
NFS的RPC服務最主要的功能就是記錄每個NFS功能所對應的端口號,並且在NFS客戶端請求時將該端口和功能對應的信息傳遞給請求數據的NFS客戶端,從而可以確保客戶端可以連接到正確的NFS端口上去,達到實現數據傳輸交互數據目的。

技術分享圖片

要部署NFS服務,需要安裝下面的軟件包:

  • nfs-utils:這個NFS服務主程序。(包括rpc.nfsa、rpc.mountd兩個daemons和相關文檔說明及執行命令文件等。)
  • portmap:Centos5.X下面RPC的主程序(Centos6.X下名字為rpcbind)
    NFS可以被視為一個RPC程序,在啟動任何一個RPC程序之前,需要做好端口和功能的對應映射工作,這個映射工作就是由portmap(或rpcbind)服務來完成的。因此,在提供NFS服務之前必須先啟動portmap(Centos6.4下為rpcbind)服務。

exports配置

/etc/exports文件配置格式為:

NFS共享目錄 NFS客戶端地址1(參1,參2……) NFS客戶端地址2(參1,參2……)
NFS共享目錄 NFS客戶端地址1(參1,參2……)
EXAMPLE
   # sample /etc/exports file
   /               master(rw) trusty(rw,no_root_squash)
   /projects       proj*.local.domain(rw)
   /usr            *.local.domain(ro) @trusted(rw)
   /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
   /pub            *(ro,insecure,all_squash)

其中上述各個列參數含義如下:
1、NFS共享目錄:為NFS服務端要共享的實際目錄,要用絕對路徑。如(/data/bbs)
註意項目的本地權限,如果需要讀寫共享,一定要讓本地目錄被NFS客戶端的用戶(nfsnobody)可以讀寫
2、NFS 客戶端地址:為NFS 服務端授權的可訪問共享目錄的NFS 客戶端地址,
可以為單獨的IP 地址或主機名、域名等,也可以為整個網段地址,還可以用“*”來匹所有客戶端服務器可以訪問,這裏所謂的客戶端一般來說是前端的業務服務器,例如:web 服務。如下:

  • 例子1:授權單一客戶端訪問NFS-->10.0.0.30(一般情況下,生產環境中此配置不多)
  • 例子2:授權整個網段可訪問NFS-->10.0.0.0/24(其中24等同於255.255.255.0 制定網段為生產換種最常見的配置,配置簡單,維護方便)
  • 例子3:授權整個網段訪問NFS-->10.0.0.*(制定網段的另外寫法(需要驗證))
  • 例子4:授權某個域名客戶端訪問NFS-->Nfs.test.cc(此方法生產環境一般不常用)
  • 例子5:授權某個域名客戶端訪問NFS-->*.test.cc(此方法生產環境一般不常用)

3、rw(表示可讀寫權限)、ro(表示只讀權限)、sync(請求或寫入數據時,數據同步寫入到NFSserver的硬盤後才會返回)、async、all_squash(在多個NFS客戶端同時讀寫NFSserver數據時,這個參數很有用)、anonuid(參數以anon*開頭指匿名用戶,通常為nobody或nfsnobody的UID值;自己設定UID必須在/etc/passwd中,在多個NFS Clients時,如國泰webserver共享一個NFS目錄時,通過這個參數,使得不同NFS Client寫入數據有相同的權限。即為配置匿名UID)、anongid(跟上面UID換成了GID)

配NFS生產重要技巧:

  1. 確保所有服務器對NFS共享目錄具備相同的權限
    • all_squash把所有客戶端都壓縮成匿名用戶。
    • 就是anonuid,anongid指定的uig和gid用戶。
  2. 所有的客戶端和服務端都需要有一個相同的uid和gid用戶,即nfsnobody(uid必須相同)
NFS的優點:

1、簡單 容易上手,容易掌握,數據是在文件系統之上。
2、方便 部署快速,維護簡單
3、可靠 從軟件層面上看,數據可靠性高,經久耐用,數據是在文件系統之上。
4、穩定

NFS的局限

1、 局限性是存在單點故障,如果nfs宕機了所有客戶端都將不可用、
2、 在高並發的場合,NFS效率\性能有限(一般幾千萬以下pV的網站不是瓶頸,除非網站架構太差,2千萬pv/r日)
3、 客戶端認證時基於ip和主機名的,安全性一般(用於內網則問題不大)
4、 NFS數據是明文的,對數據完整性不做驗證。
5、 多臺機器掛載NFS服務器時,連接管理維護麻煩,尤其NFS服務端出現問題,所有NFS客戶端都掛掉狀態(測試環境可使用autofs自動掛載解決)


(如有不足,請多指教)

搭建NFS網絡文件共享服務(幹貨)