CentOS7 搭建企業級NFS網絡文件服務器


NFS簡介:


NFS(Network File System)即網絡文件系統,最先是由Sun Microsystems在內部做爲實驗完成開發,是第一個構建於IP協議之上的網絡文件系統,主要功能是經過TCP/IP在不一樣主機系統之間共享資源(文件或目錄)。
NFS客戶端能夠經過掛載的方式將NFS服務器共享的數據目錄掛載到本地,本地NFS的客戶端應用能夠透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件同樣。
NFS網絡文件系統有點相似Samba服務。samba主要用於在windows和unix之間共享資源,資源包括文件、打印機等等。而NFS通常用於Unix系統之間的資源共享,固然也能夠共享到Windows。css

爲何使用NFS:


硬件存儲自己就很貴的,而隨着公司業務的不斷髮展,網站併發繼續加大時,硬件存儲的擴展升級成本高,成幾何倍的增加,這對於中小型企業來講是一筆不菲的開銷。 
因此通常中小型網站就會選擇NFS進行數據共享,若是大型網站頗有可能會用到更復雜的分佈式文件系統,例如:MFS(Moosefs)、GlusterFS、FastDFS 等
NFS系統經歷了近30年的發展, 已是一個很是穩定、可移植、可擴展、高性能 的企業級應用,因此在中小型企業中使用的比較普遍。html

NFS的原理:

在NFS服務器上設置好一個共享目錄/data/server後,具備訪問權限的NFS客戶端均可以將/data/server這個共享目錄掛載到本地的某個掛載點,這個掛載點能夠本身隨意指定。
客戶端正確掛載完成後,就能夠經過NFS客戶端掛載點所在的目錄查看NFS服務器共享出來的/data/server目錄下的全部數據。在客戶端查看時,這個共享目錄就至關於客戶端本地磁盤上的目錄,幾乎感受不到有何區別。
根據NFS服務器端設置的權限以及/data/server共享目錄的本地系統權限,只要在指定的NFS客戶端掛載共享目錄, 就能夠將數據輕鬆的存取到NFS服務器上的/data/server共享目錄中。node

image


NFS是經過TCP/IP來進行服務端和客戶端之間的數據傳輸,二者之間要傳輸數據就要有相對應的端口來進行傳輸。
可是這裏有一個問題,就是NFS的端口是不固定的,由於NFS有不少的功能,而不一樣的功能都會使用不一樣的端口,NFS服務在啓動時會隨機選擇端口,因此NFS服務器沒法固定端口。linux

既然NFS服務器的端口不固定,NFS客戶端又怎麼知道服務器端使用的是那個端口呢 ?
因此就須要經過RPC服務來幫忙(Remote Procedure Call,遠程過程調用)簡稱RPC
當NFS啓動後,就會隨機的使用一些端口,而後NFS就會向RPC去註冊這些端口,RPC就會記錄下這些端口,而且RPC會開起111端口,若是客戶端有請求,那服務端的RPC就會將記錄的NFS端口信息告知客戶端。
也就是說RPC的主要功能就是記錄NFS功能所對應的端口號,而且在NFS客戶端請求時將對應的端口信息返給NFS客戶端,從而確保客戶端能夠鏈接到正確的NFS端口,才能實現數據傳輸/數據交互的目的。vim

在啓動NFS以前,首先要啓動RPC服務,不然NFS就沒法向RPC註冊了。另外,若是RPC服務從新其從,原來註冊好的NFS端口就會丟失,所以NFS服務也須要重啓以從新向RPC註冊端口信息。
要特別注意的是,修改了NFS的配置文件以後是不須要重啓的,執行命令 /etc/init.d/nfs reload 或者 exportfs -rv 便可使NFS服務的配置文件/etc/exportfs生效。
不管是NFS客戶端仍是NFS服務器端,都須要先啓動RPC服務。
NFS客戶端無需啓動NFS,可是須要啓動RPC服務。windows


客戶端NFS和服務端NFS通信過程


1)首先服務器端啓動RPC服務並開啓111端口
2)啓動NFS服務並向RPC註冊端口信息
3)客戶端向服務端的RPC請求服務端的NFS端口
4)服務端的RPC服務反饋NFS端口信息給客戶端。
5)客戶端經過獲取到的NFS端口來創建和服務端的NFS鏈接並進行數據的傳輸。centos

image




NFS服務器端部署

我這裏服務器端系統是 CentOS7,客戶端是CentOS6。安全

關閉防火牆
[root@localhost ~]# systemctl stop firewalld.service   #關閉防火牆
[root@localhost ~]# systemctl disable firewalld.service  #禁止防火牆開機啓動性能優化

關閉SELinuxbash

[root@localhost ~]# setenforce 0  #臨時關閉
#修改配置文件 vim /etc/selinux/config
SELINUX=disabled

服務端須要的軟件包 nfs-utils rpcbind

nfs-utils  是NFS服務的主程序包

rpcbind 是RPC服務的程序包


centos6和centos7默認沒有安裝nfs(centos5已經默認安裝了), 因此須要咱們手動安裝。可使用  yum -y install nfs-utils rpcbind 命令安裝。
採用yum方式安裝, 只須要安裝 nfs-utils,yum會自動安裝rpcbind。

1.查看系統系信息


[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

2.檢查系統是否安裝了nfs


[root@localhost ~]# rpm -qa nfs-utils rpcbind

3.安裝nfs


[root@localhost ~]# yum -y install nfs-utils rpcbind

[root@localhost ~]# rpm -qa nfs-utils rpcbind  #若是出現nfs和rpc開頭的兩個軟件包,表示nfs已經安裝好了
rpcbind-0.2.0-47.el7.x86_64
nfs-utils-1.3.0-0.61.el7.x86_64

4.啓動rpc服務


在啓動nfs服務前, 要先啓動rpc
[root@localhost ~]# systemctl  start  rpcbind   #啓動rpc
[root@localhost ~]# systemctl  enable  rpcbind  #將加入開機啓動那個

查看是否啓動成功
[root@localhost ~]# systemctl  status  rpcbind #查看rpc運行狀態

[root@localhost ~]# systemctl  list-unit-files  | grep  rpcbind   # 查看rpc是否加入開機啓動

image


[root@localhost ~]# rpcinfo  -p  localhost    #查看nfs服務向rpc註冊的端口信息,由於nfs還沒啓動,因此沒有太多的端口。

[root@localhost ~]# 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

5.啓動nfs服務


[root@localhost ~]# systemctl start  nfs  #啓動nfs
[root@localhost ~]# systemctl  enable nfs  #將nfs加入開機啓動

查看是否啓動成功
[root@localhost ~]# systemctl  status nfs  #查看服務運行狀態
[root@localhost ~]# systemctl list-unit-files | grep nfs.service  #查看是否將nfs服務加入開機運行

image


[root@localhost ~]# rpcinfo  -p  localhost    #查看nfs服務向rpc註冊的端口信息,和剛纔沒啓動nfs的時相比較,如今監聽了更多的端口。

[root@localhost ~]# 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
     100024    1   udp  37652  status
     100024    1   tcp  45595  status
     100005    1   udp  20048  mountd
     100005    1   tcp  20048  mountd
     100005    2   udp  20048  mountd
     100005    2   tcp  20048  mountd
     100005    3   udp  20048  mountd
     100005    3   tcp  20048  mountd
     100003    3   tcp   2049  nfs
     100003    4   tcp   2049  nfs
     100227    3   tcp   2049  nfs_acl
     100003    3   udp   2049  nfs
     100003    4   udp   2049  nfs
     100227    3   udp   2049  nfs_acl
     100021    1   udp  58685  nlockmgr
     100021    3   udp  58685  nlockmgr
     100021    4   udp  58685  nlockmgr
     100021    1   tcp  41537  nlockmgr
     100021    3   tcp  41537  nlockmgr
     100021    4   tcp  41537  nlockmgr


NFS服務的主要任務是共享文件系統數據,而文件系統數據的共享離不開權限問題。

因此NFS服務器啓動時最少須要兩個不一樣的進程,一個是管理nfs客戶端是否可以登入的rpc.nfsd主進程,另外一個用於管理nfs客戶端是否可以取得對應權限的rpc.mountd進程。
若是還須要管理磁盤配額,則nfs還須要加載rpc.rquotad進程。

[root@localhost ~]# ps -ef | grep rpc 
rpc       11095      1  0 02:26 ?        00:00:00 /sbin/rpcbind -w
rpcuser   11160      1  0 02:59 ?        00:00:00 /usr/sbin/rpc.statd
root      11170      2  0 02:59 ?        00:00:00 [rpciod]
root      11174      1  0 02:59 ?        00:00:00 /usr/sbin/rpc.idmapd
root      11180      1  0 02:59 ?        00:00:00 /usr/sbin/rpc.mountd
root      11812  10857  0 03:28 pts/2    00:00:00 grep --color=auto rpc
[root@localhost ~]# ps -ef | grep nfs
root      11185      2  0 02:59 ?        00:00:00 [nfsd4_callbacks]
root      11191      2  0 02:59 ?        00:00:00 [nfsd]
root      11192      2  0 02:59 ?        00:00:00 [nfsd]
root      11193      2  0 02:59 ?        00:00:00 [nfsd]
root      11194      2  0 02:59 ?        00:00:00 [nfsd]
root      11195      2  0 02:59 ?        00:00:00 [nfsd]
root      11196      2  0 02:59 ?        00:00:00 [nfsd]
root      11197      2  0 02:59 ?        00:00:00 [nfsd]
root      11198      2  0 02:59 ?        00:00:00 [nfsd]
root      11814  10857  0 03:30 pts/2    00:00:00 grep --color=auto nfs

NFS 服務的配置文件


NFS服務的默認配置文件路徑 /etc/exportfs 而且默認是空的,須要用戶自行配置。
/etc/exportfs 文件配置的格式:
NFS共享目錄   NFS客戶端地址1 (參數1,參數2,只讀仍是可寫)   NFS客戶端地址2 (參數1,參數2,......)

參數說明:
         NFS共享目錄:是服務器端的本地目錄,是咱們想要共享給網絡上其餘主機使用的目錄。假如我要共享的是/data/server目錄,那麼此選項能夠就直接寫/data/server
         NFS客戶端地址:客戶端地址可以設置一個網段,也能夠設置爲單個主機,
         參數:如讀寫權限(rw,同步更新sync,壓縮來訪帳戶all_squash,壓縮後的匿名帳號anonuid=uid,anongid=gid等等..)
        

生產環境常見配置實例:


配置實例1: /data/server  192.168.1.11(rw,sync) 
###括號前不能有空格 rw表示可讀寫,sync表示同步更新到磁盤,同步將內存內的文件寫入到磁盤空間,保證數據不丟失,但會影響性能。

配置實例2:/data/server  192.168.1.11/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
###生產環境中經常使用的一種配置,適合多客戶端共享一個NFS目錄。all_squash 也就是說無論客戶端是以什麼樣的身份來進行訪問的,都會被壓縮成爲all_squash後面所接的用戶和羣組身份。這邊用anonuid、anongid編號來表示。

配置實例3:/data/server 192.168.1.11/24(ro) 
###表示只能讀權限


NFS權限設置


NFS配置權限設置,即/etc/exports文件配置格式中小括號()裏的參數集。
rw  表示可讀寫
ro  Read-only表示只能讀權限
sync 寫入數據時數據同步寫入到NFS server的硬盤中後纔會返回,數據安全不會丟失。
async 寫入數據時先寫到內存緩衝區,直到硬盤有空檔時纔會再寫到磁盤,這樣能夠提高寫入效率,可是若是服務器宕機,緩衝區的數據沒來得及寫入到磁盤,這些數據將會丟失。
no_root_squas 訪問nfs server共享目錄的用戶若是是root的話,它對該目錄具備root權限。這個配置本來爲無盤用戶準備的。(正常狀況應避免使用!)
root_squash   對於訪問NFS server共享目錄的用戶,若是是root的話會被壓縮成爲nobody用戶身份。

all_squash  無論訪問nfs server共享目錄的用戶身份如何包括root,它的權限都將被壓縮成爲匿名用戶,同時他們的udi和gid都會變成nobody或nfsnobody帳戶的uid,gid。在多個nfs客戶端同時讀寫nfs server數據時,這個參數頗有用***能夠確保你們寫入的數據的權限是同樣的。
但不一樣系統有可能匿名用戶的uid,gid不一樣。由於此處咱們須要服務端和客戶端之間的用戶是同樣的。好比說:服務端指定匿名用戶的UID爲65534,那麼客戶端也必定要存在65534這個帳號才能夠

anonuid  anonuid就是匿名的uid和gid。說明客戶端以什麼權限來訪問服務端,在默認狀況下是nfsnobody。uid65534.
anongid  同anongid,就是把uid換成gid而已。

客戶端來訪問的用戶
客戶端訪問服務端默認是使用nfsnobody這個用戶來進行訪問的。uid和gid爲65534。服務器默認共享時,也是加上了all_squash這個參數。
並制定anonuid爲65534(也就是nfsnobayd用戶)。固然若是系統中nfsnobody是其餘的uid,那麼就有可能形成訪問權限出現問題。
因此最好咱們能夠經過一設置一個用戶來訪問,統一UID、GID。


查看客戶端掛載狀況
有兩個重要的文件/var/lib/nfs/etab、/var/lib/nfs/rmtab這兩個文件就可以查看服務器上共享了什麼目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。
一、/var/lib/nfs/etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可使用,而且設定的參數爲什麼。
二、/var/lib/nfs/rmtab這個文件就是可以查看到共享目錄被掛載的狀況。


NFS配置實例


實例:共享/data/server目錄給192.168.1.11

[root@localhost ~]# mkdir -p  /data/server   #建立共享目錄
[root@localhost ~]# ll -d  /data/server
drwxr-xr-x 2 root root 6 Mar 13 15:12 /data/server/   #注意如今共享的目錄的權限爲只有root纔有寫權限。
[root@localhost ~]# chown nfsnobody.nfsnobody /data/server/ #更改目錄所屬主和所屬組。
[root@localhost ~]# ll -d /data/server
drwxr-xr-x 2 nfsnobody nfsnobody 6 Mar 13 15:12 /data/server/  #如今nfsnobody用戶有讀寫權限了。

添加NFS配置文件

[root@localhost ~]# cat /etc/exports
# Shared /data/server directory to 192.168.1.11 
/data/server 192.168.1.11(rw,sync)
[root@localhost ~]# systemctl  reload nfs  #從新加載nfs
[root@localhost ~]# showmount -e localhost  #服務器本地確認是否共享正常
Export list for localhost:
/data/server 192.168.1.11

權限說明:在配置文件中設置了權限rw。只代表了網絡端的主機可以有權限去服務器端去寫文件,但還須要經過服務器端的本地目錄的權限。
而且客戶端往服務端去寫文件的用戶身份是nfsnobody、nfsnobody UID=65534。那麼也就是說客戶端須要經過兩層的權限來控制的。NFS配置文件—>共享目錄文件的權限。



查看NFS服務的版本

服務器端 nfsstat  -s | grep Server

[root@localhost server]# nfsstat  -s | grep Server
Server rpc stats:
Server nfs v4:
Server nfs v4 operations:



如今就是讓客戶端來進行掛載就能夠了。

--------------------------------------------------------

NFS客戶端

我這裏客戶端是CentOS6
NFS客戶端只須要啓動rpc服務便可。

關閉防火牆
[root@localhost ~]# /etc/init.d/iptables  stop  #關閉防火牆
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]

[root@localhost ~]# chkconfig  iptables off   #禁止防火牆開機啓動


關閉SELinu
[root@localhost ~]# setenforce 0  #臨時關閉
#修改配置文件 vim /etc/selinux/config
SELINUX=disabled

1.查看系統系信息


[root@localhost ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

2.檢查系統是否安裝了rpc


[root@localhost ~]# rpm -qa nfs-utils rpcbind

3.安裝rpc

[root@localhost ~]# yum -y install nfs-utils rpcbind
[root@localhost ~]# rpm -qa nfs-utils rpcbind  #若是出現nfs和rpc開頭的兩個軟件包,表示nfs已經安裝好了
nfs-utils-1.2.3-78.el6_10.1.x86_64
rpcbind-0.2.0-16.el6.x86_64

4.啓動rpc服務


在啓動nfs服務前, 要先啓動rpc

[root@localhost ~]# /etc/init.d/rpcbind  start    #啓動rpc
Starting rpcbind:             [  OK  ]

[root@localhost ~]# chkconfig rpcbind on              #將rpc加入開機啓動那個

[root@localhost ~]# chkconfig  --list | grep rpcbind  #查看rpc是否加入開機啓動
rpcbind            0:off    1:off    2:on    3:on    4:on    5:on    6:off

查看是否啓動成功 

[root@localhost ~]# /etc/init.d/rpcbind  status 
rpcbind (pid  2310) is running...
[root@localhost ~]# netstat  -anput | grep rpc
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2310/rpcbind        
tcp        0      0 :::111                      :::*                        LISTEN      2310/rpcbind        
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               2310/rpcbind        
udp        0      0 0.0.0.0:789                 0.0.0.0:*                               2310/rpcbind        
udp        0      0 :::111                      :::*                                    2310/rpcbind        
udp        0      0 :::789                      :::*                                    2310/rpcbind

 

[root@localhost ~]# rpcinfo  -p  localhost  #查看nfs服務想rpc註冊的端口信息,客戶端只啓動rpc服務便可。

[root@localhost ~]# 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

NFS客戶端掛載

查看服務器端的共享信息

[root@localhost ~]# showmount  -e 192.168.1.21
Export list for 192.168.1.21:
/data/server 192.168.1.11

掛載服務器共享出來的目錄

[root@localhost ~]# mkdir   /data/client  # 要先建立掛載點
[root@localhost ~]# mount -t nfs  192.168.1.21:/data/server  /data/client  #把共享目錄掛載到本地

#mount 命令格式以下:
mount -t  類型   device   localedir(本地目錄)
以上這個命令device=192.168.1.21:/data/server   類型爲nfs

查看磁盤狀況

[root@localhost ~]# df -TH
Filesystem           Type   Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                      ext4    19G  831M   17G   5% /
tmpfs                tmpfs  523M     0  523M   0% /dev/shm
/dev/sda1            ext4   500M   29M  445M   7% /boot
192.168.1.21:/data/server
                      nfs     19G  1.2G   18G   7% /data/client

查看掛載狀況

[root@localhost client]# mount -l
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.1.21:/data/server on /data/client type nfs (rw,vers=4,addr=192.168.1.21,clientaddr=192.168.1.11)

查看更詳細的掛載信息 cat /proc/mounts

[root@localhost client]# cat /proc/mounts  
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=499224k,nr_inodes=124806,mode=755 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
/dev/mapper/VolGroup-lv_root / ext4 rw,relatime,barrier=1,data=ordered 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /boot ext4 rw,relatime,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
192.168.1.21:/data/server /data/client nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.11,minorversion=0,local_lock=none,addr=192.168.1.21 0 0


測試
1.在nfs服務器端, 進入/data/server共享目錄, 建立test-nfs.txt文件

[root@localhost server]# pwd
/data/server
[root@localhost server]#  touch test-nfs.txt

2.在nfs客戶端,進入/data/client掛載目錄,建立test-nfs222.txt文件

[root@localhost client]# pwd
/data/client
[root@localhost client]# touch test-nfs222.txt
[root@localhost client]# ls 
test-nfs222.txt  test-nfs.txt
[root@localhost client]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 14  2019 test-nfs222.txt
-rw-r--r-- 1 root      root      0 Mar 14  2019 test-nfs.txt

test-nfs.txt 是在服務器端以root建立的,因此權限是root。
test-nfs222.txt 是在客戶端以root建立的,可是文件的權限被壓縮成nfsnobody用戶了。

[root@localhost server]# cat /etc/exports
# Shared /data/server directory to 192.168.1.11 
/data/server 192.168.1.11(rw,sync)
[root@localhost server]# showmount  -e localhost
Export list for localhost:
/data/server 192.168.1.11
[root@localhost server]# cat /var/lib/nfs/etab 
/data/server    192.168.1.11(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)

從/var/lib/nfs/etab 這個文件中咱們能夠看到, 在共享的時候即便咱們只指定了rw和rsync這兩參數, nfs也會默認有不少參數。其中就有all_squash,這個參數在客戶端的做用就是無論你用什麼用戶建立的文件,都會被強制壓縮成nfsnobody。



客戶端NFS掛載參數


    
咱們客戶端掛載NFS也能夠設置不少參數的,-o 後面的參數。
客戶端掛載能夠設置:不可執行、讀寫權限、斷開後RPC呼叫方式、讀寫區塊大小等。
通常來講當nfs服務器提供的只是普通數據(圖片html,css,jss,視頻等)應該不須要執行suid,exec等權限,
因爲是共享目錄不存在設備因此也不存在掛載設備dev,所以在客戶端掛載的時候,能夠加上給你這幾個命令掛載。

mount -t  nfs -o  nosuid,noexec,nodev,rw 192.168.1.21:/data/server  /data/client

可以使用掛載參數:


suid  容許設置suid
nosuid  不容許在共享文件系統中設置suid ,默認是suid

rw  讀寫權限
ro  只讀

dev   保留設備文件的特殊功能
nodev  不保留(通常來講只有/dev纔會有特殊的設備文件,所以能夠選在nodev),默認是dev

exec    容許執行任何二進制文件
noexec  不容許在共享文件系統中直接執行任何二進制文件,默認是exec

user  容許用戶擁有文件的掛載與卸載的功能
nouser  不容許用戶擁有文件的掛載與卸載功能(若是要保護文件系統,最好不要爲用戶提供掛載與卸載的功能),默認是nouser

auto   這個auto指的是"mount -a"時會不會自動掛載的項目,
noauto  不自動掛載,默認是auto


針對一些高併發的狀況,還有一些能夠進行優化的參數:


fg
bg   
當執行掛載時,該掛載行爲是在前臺(fg)仍是在後臺(bg)執行。若在前臺執行,則mount會持續嘗試連接,直到成功或time  out爲止。
若爲在後臺執行,則mount會在後臺持續屢次進行mount,而不會影響到前臺的程序操做。
若是網絡聯機不穩定,或是服務器經常須要開關機。建議使用bg比較穩當。默認爲fg


soft
hard
使用掛載時會使用RPC呼叫。若是是hard的狀況,那麼當二者之間有任何一臺主機離線,那RPC會持續呼叫,直到對方恢復聯機爲止。
而soft,只是在RPC time out後重復呼叫。而非持續呼叫。所以系統的延遲會不這麼明顯,若是服務器常常開開關關的話,建議使用soft。
在生產環境中推薦使用hard,intr這樣的方式來掛載。默認爲hard

intr
當使用hard方式掛載時,若加上intr參數,則RPC的持續呼叫是能夠被中斷的

rsize
wsize
讀出(rsize)和寫入(wsize)的區塊大小。這個設置值能夠影響客戶端與服務器端傳輸數據的緩衝存儲容量。
通常來講,若是在局域網內(LAN),而且客戶端與服務器都具備足夠的內存,這個值能夠設置大一點,好比說32768,提高緩衝區塊將可提高NFS文件系統的傳輸能力。
但設置的值也不要太大,最好是實現網絡可以傳輸的最大值爲限。默認rsize=1024,wsize=1024

proto=udp
使用UDP協議來傳輸數據,在內網中會有較好的性能,可是在Internet的話,使用proto=tpc傳輸的數據會有較好的糾錯能力。默認是proto=tcp



NFS客戶端如何掛載才最佳


命令格式以下:

mount –t nfs –o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768  192.168.1.21:/data/server   /data/client

1)  noexec,nosuid,nodev,由於共享存放的是簡單資料,不須要suid位不須要執行,沒有設備文件。

2)  hard,intr,bg 當NFS連接斷了以後會一直去監測服務端的NFS服務直到恢復以後從新鏈接。

3)  rsize=32768 wsize=32768 調優NFS傳輸的區塊大小。

4)  基本參數:rw 讀寫權限。


如何設置開機自動掛載


1.經過把 mount –t  nfs 192.168.1.21:/data/server   /data/client 這條命令寫到/etc/rc.local中,讓它開機就執行。

2.在/etc/fstab(系統開機啓動分區加載項)添加咱們的NFS配置:
192.168.1.21:/data/serve      /data/client   nfs  defaults  1  1

但在生產環境中,對於共享的NFS目錄,通常不會配置到/etc/fstab裏。
由於在客戶端主機重啓時若是因爲網絡等緣由鏈接不上nfs server時,就會致使客戶機沒法啓動的厄運發生。
有兩種方式實現開機自動掛載,但這裏建議採用第一種,若是由於網絡緣由沒有鏈接到NFSserver那麼第二中有可能會致使系統沒法啓動的故障。


若是卸載時提示:"umount.nfs: /data/client: device is busy",須要退出掛載目錄再進行卸載,若是NFS 服務器宕機了,則須要強制卸載,可執行命令:umount -lf /data/client
強制卸載:umount –lf  /data/client

NFS客戶端掛載優化:

1.有關係統安全掛載參數選項


在企業工做場景,通常來講,NFS服務器共享的只是普通靜態數據(圖片、附件、視煩),不須要執行suid、exec等權限,
掛載的這個文件系統只能做爲數據存取之用,沒法執行程序,對於客戶端來說增長了安全性,例如:不少***篡改站點文件都是由上傳入口上傳的程序到存儲目錄,而後執行的。
所以在掛載的時候,用下面的命令頗有必要

mount -t nfs -o nosuid, noexec ,node, rw 10.0.0.7:/data  /mnt


經過 mount -o 指定掛載參數與在 /etc/fstab裏指定掛載參數的效果是同樣的。網絡文件系統和本地的文件系統效果也是同樣的。

2.mount掛載性能優化參數選項


下面介紹幾個在企業生產環境下,NFS性能優化掛載的例子

1)禁止更新目錄及文件時間戳掛載,命令以下:

mount -t nfs -o noatime,nodiratime 10.0.0.7:/data  /mnt

2)安全加優化的掛載方式以下

mount -t nfs -o nosud,noexec,node,noatime,noduratime,intr,rsize=131072,wsize=131072  10.0.0.7:/data  /mnt

3)默認的掛載方式以下

mount -t nfs 10.0.0.7:/data  /mnt

WSIZE和RSIZE的大小最好是1024的倍數,對於NFSv2來講,8192是RSIZE和 WSIZE的最大數值,若是使用的是NFSv3,則能夠嘗試設置32768,若是是NFSv4能夠到65536或更大。

若是在客戶端掛載時使用了這兩個參數,可讓客戶端在讀取和寫入數據時,一次性讀寫更多的數據包,這能夠提高訪問性能和效率。
除此以外,還有 noatime,mxtiratimc 性能優化選項,
這兩個選項是說在讀寫磁盤的時候不更新文件和目錄的時間戮(即不更新文件系統中文件對應 inode 信息),這樣就能夠減小和磁盤系統的交互,提高讀取和寫入磁盤的效率,
由於磁盤是機械的,每次讀寫都會消耗磁盤I/O,而更新文件時間戳對於工做數據必要性不大,最大問題是增長了訪問磁I/O的次數,拖慢系統性能。

如下是NFS網絡文件系統優化掛載的參數建議:
在CentOS6 x86_64服努器端和客戶端環境下,可以使用以下命令參數:
m

mount-t nf -o noatimc,nodiratime,nosuid,noexec,nodev,rsize=131072,wsize=131072  10.0.0.7:/data  /mnt

通過實際測試,CentOS6 x86_64默認的掛載參數性能仍是不錯的。

 mount -t nfs 10.0.0.7:/data  /mnt

注意:非性能的參數越多,速度可能會越慢。根據具體的業務須要以及實際測試效果選擇掛載參數。

3.NFS內核優化建議


/proc/sys/net/core/rmem_default:該文件指定了接收套接宇緩衝區大小的默認值(以宇節爲單位),默認設置:124928,
/proc/sys/net/core/rmem_max:該文件指定了接收套接字緩衝區大小的最大值(以宇節爲單位),默認設置:124928,

/proc/sys/net/core/wmem_default:該文件指定了發送套接字綬衝區大小的默認值(以字節單位),默認設置:124928
/proc/sys/net/core/wmem_max:該文件指定了發送套接字簧沖區大小的最大值(以字節單位),默認設置:124928

4.企業生產場景NFS共享存儲優化小結


硬件:sas/ssd磁盤,買多塊, raid0/raid10。網卡吞吐量要大,至少幹兆(多塊bond)。

NFS服務端配置:/data 10.0.0.7(rw,sync,all_squash,anonuid=65534,anongid=65534)

NFS客戶端掛載優化配置命令:

mount -t nfs -o nosuid,noexec,nodev,noatmme,nodiratime,rsize=131072,wsize=131072 10.0.0.7:/data /mnt   #兼顧安全性能



大型網站NFS網絡文件系統的替代軟件爲 分佈式文件系統Moosefs(mfs)、GlusterFS、FastDFS。


NFS優缺點

NFS優勢:


一、簡單容易掌握
二、方便快速部署簡單維護容易
三、從軟件層面上看,數據可靠性高,穩定性強。

NFS侷限:


一、侷限性是存在單點故障,若是NFSserver宕機了全部客戶端都不能訪問共享目錄,#####咱們能夠經過rsync來進行數據的同步。或者是經過負載均衡的高可用方案。######
二、在高併發的場合,NFS效率性能有限(通常幾千萬如下pv的網站不是瓶頸,除非網站架構太差。)
三、服務器共享文件的客戶端認證是基於IP和主機名的安全性通常(但用於內網則問題不大)
四、NFS數據是明文的,對數據完整性不作驗證(通常是存放於內網,提供內網的服務器使用。因此安全性相對不是一個問題)
五、多機器掛載服務器時,鏈接管理維護麻煩。尤爲NFS服務端出問題後,全部客戶端都掛掉狀態(可以使用autofs自動掛載解決。)

生產應用場景


    中小型網站(2000萬pv如下)線上應用,都有用武之地。門戶網站也會有其餘方面的應用,
    由於門戶網站的併發量是超級的大。因此有更加會用專業的存儲來作這件事情。


-------------------------------完結-----------------------------------

參考書籍:《跟老男孩學linux運維 Web集羣實戰》

參考博文:https://blog.51cto.com/atong/1343950

相關文章
相關標籤/搜索