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


NFS簡介:


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

爲什麼使用NFS:


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

NFS的原理:

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

image


NFS是通過TCP/IP來進行服務端和客戶端之間的數據傳輸,兩者之間要傳輸數據就要有相對應的端口來進行傳輸。
但是這裏有一個問題,就是NFS的端口是不固定的,因爲NFS有很多的功能,而不同的功能都會使用不同的端口,NFS服務在啓動時會隨機選擇端口,所以NFS服務器無法固定端口。

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

在啓動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服務。


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


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

image




NFS服務器端部署

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

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

關閉SELinux

[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這兩個文件就能夠查看服務器上共享了什麼目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。
1、/var/lib/nfs/etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可以使用,並且設定的參數爲何。
2、/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服務的版本

服務器端

[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服努器端和客戶端環境下,可使用如下命令參數:
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,anguid=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優點:


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

NFS侷限:


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

生產應用場景


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


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

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

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

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