Linux網絡文件系統NFS

2021-03-02 嵌入式Linux中文站


NFS介紹什麼是NFS?

NFS是Network File System的縮寫,即網絡文件系統。它的主要功能是通過網絡(一般是區域網)讓不同的主機系統之間可以共享文件或目錄。NFS客戶端(一般為應用伺服器,例如web)可以通過掛載(mount)的方式將NFS服務端共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從NFS客戶端的機器本地看,NFS服務端共享的目錄就好像是客戶自己的磁碟分區或者目錄一樣,而實際上確是遠端的NFS服務端的目錄。

NFS網絡文件系統類似windows系統的網絡共享、安全功能、網絡驅動器映射,這也和linux系統裡的samba服務類似。應用於網際網路中小型集群架構後端作為數據共享,如果是大型網站,那麼有可能還會用到更複雜的分布式文件系統,例如Moosefs(mfs)、glusterfs、FastDFS。

NFS在企業中的應用場景

在企業集群架構的工作場景中,NFS網絡文件系統一般被用來存儲共享視頻、圖片、附件等靜態資源文件。一般是把網站用戶上傳的文件都放在NFS共享裡,例如,BBS產品的圖片、附件、頭像,注意網站BBS程序不要放在NFS共享裡,然後前端所有的節點訪問存儲服務之一,特別是中小網站公司應用頻率更高。

NFS流程圖

NFS原理圖

NFS的RPC服務,在CentOS5.x下名稱為portmap,在CentOS6.x下名稱為rpcbind。

NFS服務端部署環境準備NFS服務部署伺服器準備

伺服器系統

角色

ip

CentOS 6.6 x86_64

NFS服務端(nfs-server)

自定義

CentOS 6.6 x86_64

NFS客戶端(nfs-client1)

自定義

CentOS 6.6 x86_64

NFS客戶端(nfs-client2)

自定義

NFS SERVER端設置NFS軟體列表

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

nfs-utils:這個NFS服務主程序包括rpc.nfsd、rpc.mountd兩個daemons和相關文檔說明及執行命令文件等。

rpcbind:CentOS 6.x下面RPC的主程序(CentOS 5.x下面的portmap)

NFS可以被視為一個RPC程序,在啟動任何一個RPC程序之前,需要做好埠映射工作,這個映射工作就是由rpcbind服務來完成的。因此,必須先啟動rpcbind服務。

CentOS 6.6默認沒有安裝NFS軟體包(CentOS 5默認已經安裝)。

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

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

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

nfs-utils-1.2.3-70.el6_8.2.x86_64 #這個包在5.8為portmap

rpcbind-0.2.0-12.el6.x86_64

出現兩個軟體包,表示NFS服務端軟體安裝完畢。

啟動NFS相關服務

[root@nfs-server ~]# /etc/init.d/rpcbind status #查看rpcbind服務

rpcbind is stopped

[root@nfs-server ~]# /etc/init.d/rpcbind start #啟動rpcbind服務

Starting rpcbind: [ OK ]

[root@nfs-server ~]# /etc/init.d/rpcbind status

rpcbind (pid 26101) is running...

[root@nfs-server ~]# lsof -i:111 #rpcbind服務埠111

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 26101 rpc 6u IPv4 28829 0t0 UDP *:sunrpc

rpcbind 26101 rpc 8u IPv4 28832 0t0 TCP *:sunrpc (LISTEN)

rpcbind 26101 rpc 9u IPv6 28834 0t0 UDP *:sunrpc

rpcbind 26101 rpc 11u IPv6 28837 0t0 TCP *:sunrpc (LISTEN)

[root@nfs-server ~]# netstat -lntup|grep rpcbind

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 26101/rpcbind

tcp 0 0 :::111 :::* LISTEN 26101/rpcbind

udp 0 0 0.0.0.0:836 0.0.0.0:* 26101/rpcbind

udp 0 0 0.0.0.0:111 0.0.0.0:* 26101/rpcbind

udp 0 0 :::836 :::* 26101/rpcbind

udp 0 0 :::111 :::* 26101/rpcbind

[root@nfs-server ~]# chkconfig --list|grep rpcbind

rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

[root@nfs-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@nfs-server ~]# /etc/init.d/nfs status #查看nfs服務

rpc.svcgssd is stopped

rpc.mountd is stopped

nfsd is stopped

rpc.rquotad is stopped

[root@nfs-server ~]# /etc/init.d/nfs start #啟動nfs服務

Starting NFS services: [ OK ]

Starting NFS quotas: [ OK ]

Starting NFS mountd: [ OK ]

Starting NFS daemon: [ OK ]

Starting RPC idmapd: [ OK ]

[root@nfs-server ~]# /etc/init.d/nfs status

rpc.svcgssd is stopped

rpc.mountd (pid 26225) is running...

nfsd (pid 26241 26240 26239 26238 26237 26236 26235 26234) is running...

rpc.rquotad (pid 26220) is running...

[root@nfs-server ~]# netstat -lntup|grep 2049 #nfs服務埠2049

tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -

tcp 0 0 :::2049 :::* LISTEN -

udp 0 0 0.0.0.0:2049 0.0.0.0:* -

udp 0 0 :::2049 :::* -

[root@nfs-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 56844 mountd

    100005 1 tcp 49326 mountd

    100005 2 udp 47287 mountd

    100005 2 tcp 47817 mountd

    100005 3 udp 56317 mountd

    100005 3 tcp 47741 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 45085 nlockmgr

    100021 3 udp 45085 nlockmgr

    100021 4 udp 45085 nlockmgr

    100021 1 tcp 42582 nlockmgr

    100021 3 tcp 42582 nlockmgr

    100021 4 tcp 42582 nlockmgr

[root@nfs-server ~]# chkconfig --list nfs

nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off

[root@nfs-server ~]# chkconfig nfs on #nfs添加開機自啟動

[root@nfs-server ~]# chkconfig --list nfs

nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off

[root@nfs-server ~]# less /etc/init.d/rpcbind

#! /bin/sh

#

# rpcbind Start/Stop RPCbind

#

# chkconfig: 2345 13 87 #開機啟動順序

[root@nfs-server ~]# less /etc/init.d/nfs

#!/bin/sh

#

# nfs This shell script takes care of starting and stopping

# the NFS services.

#

# chkconfig: - 30 60 #開機啟動順序

工作中推薦使用/etc/rc.local進行服務的啟動,不推薦使用chkconfig,目的是為了方便管理。

[root@nfs-server ~]# ps -ef|egrep "rpc|nfs"

rpc 26101 1 0 09:45 ? 00:00:00 rpcbind

root 26211 2 0 09:52 ? 00:00:00 [rpciod/0]

root 26220 1 0 09:52 ? 00:00:00 rpc.rquotad #磁碟配額進程

root 26225 1 0 09:52 ? 00:00:00 rpc.mountd #權限管理驗證

root 26232 2 0 09:52 ? 00:00:00 [nfsd4]

root 26233 2 0 09:52 ? 00:00:00 [nfsd4_callbacks]

root 26234 2 0 09:52 ? 00:00:00 [nfsd] #NFS主進程

root 26235 2 0 09:52 ? 00:00:00 [nfsd]

root 26236 2 0 09:52 ? 00:00:00 [nfsd]

root 26237 2 0 09:52 ? 00:00:00 [nfsd]

root 26238 2 0 09:52 ? 00:00:00 [nfsd]

root 26239 2 0 09:52 ? 00:00:00 [nfsd]

root 26240 2 0 09:52 ? 00:00:00 [nfsd]

root 26241 2 0 09:52 ? 00:00:00 [nfsd]

root 26268 1 0 09:52 ? 00:00:00 rpc.idmapd

root 26418 1023 0 10:41 pts/0 00:00:00 egrep rpc|nfs

配置NFS服務端

NFS服務的默認配置文件路徑為:/etc/exports,並且默認是空的。

[root@nfs-server ~]# ls -l /etc/exports

-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports

exports配置文件格式

/etc/exports文件配置格式

NFS 共享目錄    NFS客戶端地址1(參數1,參數2,參數3…) 客戶端地址1(參數1,參數2,參數3…)

NFS 共享目錄    NFS客戶端地址(參數1,參數2…)

[root@nfs-server ~]# cat /etc/exports

/data 192.168.31.*(rw,sync)

[root@nfs-server ~]# /etc/init.d/nfs reload

exportfs: Failed to stat /data: No such file or directory #/data目錄不存在

 

[root@nfs-server ~]# mkdir /data

[root@nfs-server ~]# /etc/init.d/nfs reload #exports -r

 

[root@nfs-server ~]# showmount -e 127.0.0.1

Export list for 127.0.0.1:

/data 192.168.31.* #共享目錄

 

[root@nfs-server ~]# mount -t nfs 192.168.31.129:/data /mnt #掛載

[root@nfs-server ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 7.1G 1.5G 5.3G 21% /

tmpfs 497M 0 497M 0% /dev/shm

/dev/sda1 190M 27M 153M 15% /boot

192.168.31.129:/data 7.1G 1.5G 5.3G 21% /mnt #掛載成功

 

[root@nfs-server ~]# touch /data/oldboy.txt

[root@nfs-server ~]# ls /mnt

oldboy.txt

[root@nfs-server ~]# touch /mnt/test.txt

touch: cannot touch `/mnt/test.txt': Permission denied #無權限

客戶端配置

啟動rpcbind

[root@web-lamp01 ~]# /etc/init.d/rpcbind start

Starting rpcbind: [ OK ]

[root@web-lamp01 ~]# /etc/init.d/rpcbind status

rpcbind (pid 26272) is running...

[root@web-lamp01 ~]# cat /etc/rc.local

#啟動rpcbind

/etc/init.d/rpcbind start

 

[root@web-lamp01 ~]# showmount -e 192.168.31.129

Export list for 192.168.31.129:

/data 192.168.31.*

[root@web-lamp01 ~]# mount -t nfs 192.168.31.129:/data /mnt

[root@web-lamp01 ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 7.1G 1.5G 5.3G 21% /

tmpfs 497M 0 497M 0% /dev/shm

/dev/sda1 190M 27M 153M 16% /boot

192.168.31.129:/data 7.1G 1.5G 5.3G 21% /mnt

[root@web-lamp01 ~]# ls /mnt

oldboy.txt

 

在服務端刪除/data中的文件/oldboy.txt,然後在客戶端進行查看,文件已經不存在。

無法寫入是因為權限的問題,解決辦法如下。

[root@nfs-server ~]# cat /var/lib/nfs/etab

/data 192.168.31.*(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的由65534進行管理

[root@nfs-server ~]# cat /etc/exports

/data 192.168.31.*(rw,sync)

[root@nfs-server ~]# ls -ld /data

drwxr-xr-x 2 root root 4096 Jan 19 11:36 /data #/data的屬主是root

[root@nfs-server ~]# grep 65534 /etc/passwd #查看65534的用戶名

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

[root@nfs-server ~]# chown -R nfsnobody /data #更改/data屬主

[root@nfs-server ~]# ls -ld /data

drwxr-xr-x 2 nfsnobody root 4096 Jan 19 11:36 /data

 

[root@nfs-server ~]# cd /mnt

[root@nfs-server mnt]# pwd

/mnt

[root@nfs-server mnt]# ls

[root@nfs-server mnt]# touch test.txt #服務端創建

[root@nfs-server mnt]# ls

test.txt

 

[root@web-lamp01 mnt]# touch test2.txt #客戶端創建

[root@web-lamp01 mnt]# ls

test2.txt test.txt

 

客戶端設置開機自動掛載

[root@web-lamp01 mnt]# cat /etc/rc.local

#!/bin/sh

#

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don't

# want to do the full Sys V style init stuff.

 

touch /var/lock/subsys/local

 

#啟動rpcbind

/etc/init.d/rpcbind start

#掛載nfs /data

/bin/mount -t nfs 192.168.31.129:/data /mnt

同樣配置另外一臺客戶端。

故障排查

1、首先確認NFS服務端配置和服務是否正常。

[root@nfs-server ~]# showmount -e localhost

Export list for localhost:

/data 192.168.31.*

最好服務端自己掛載自己看看是否成功。

[root@nfs-server ~]# mount -t nfs 192.168.31.129:/data /mnt

[root@nfs-server ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 7.1G 1.4G 5.4G 21% /

tmpfs 497M 0 497M 0% /dev/shm

/dev/sda1 190M 27M 153M 15% /boot

192.168.31.129:/data 7.1G 1.4G 5.4G 21% /mnt

這一步主要是檢查服務端的NFS服務是不是正常的。

2、確認NFS客戶端showmount是否正常。

[root@web-lamp01 ~]# showmount -e 192.168.31.129

Export list for 192.168.31.129:

/data 192.168.31.*

如果有問題進行下面排查。

1)ping NFS服務端IP檢查

[root@web-lamp01 ~]# ping 192.168.31.129

PING 192.168.31.129 (192.168.31.129) 56(84) bytes of data.

64 bytes from 192.168.31.129: icmp_seq=1 ttl=64 time=1.40 ms

64 bytes from 192.168.31.129: icmp_seq=2 ttl=64 time=0.392 ms

2)telnet NFS服務端IP埠檢查

[root@web-lamp01 ~]# telnet 192.168.31.129 111

Trying 192.168.31.129...

Connected to 192.168.31.129.

Escape character is '^]'.

如果出現No route to host很有可能是服務端防火牆引起。

此外,還需要注意服務端RPC服務啟動順序問題。

/etc/init.d/rpcbind start

rpcinfo -p localhost

/etc/init.d/nfs start

rpcinfo -p localhost

NFS配置參數權限NFS配置文件權限參數說明

NFS伺服器端的權限設置,即/etc/exports文件配置格式中小括號的參數。

[root@nfs-server ~]# cat /etc/exports

/data 192.168.31.*(rw,sync)

參數名稱

參數用途

rw

read-write,表示可讀寫權限*

ro

read-only,表示只讀權限

sync

請求或寫入數據時,數據同步寫入到NFS Server的硬碟後才返回。數據安全不會丟,缺點,性能下降。

async

請求或寫入數據是,先返回請求,再將數據寫入到內存緩存和硬碟中,即異步寫入數據。此參數可以提升NFS性能,但是會降低數據的安全。因此,一般情況下建議不用,如果NFS處於瓶頸狀態,並且運行數據丟失的話可以打開此參數提升NFS性能。寫入時數據會先寫到內存緩衝區,等硬碟有空檔再寫入磁碟,這樣可以提升寫入效率,風險若伺服器宕機或不正常關機,會損失緩衝區中未寫入磁碟的數據(解決辦法:伺服器主板電池或加UPS不間斷電源)。(電商秒殺是異步)

no_root_squash

訪問NFS Server共享目錄的用戶如果是root的話,它對該共享目錄具有root權限。這個配置原本為無盤客戶端準備的。用戶應避免使用。

root_squash

對於訪問NFS Server共享目錄的用戶如果是root的話,則它的權限將被壓縮成匿名用戶,同時它的UID和GID通常會變成nfsnobody帳號身份

all_squash

不管訪問NFS Server共享目錄的用戶身份如何,它的權限都被壓縮成匿名用戶,同時它的UID和GID都會變成nfsnobody帳號身份。在早期多個NFS客戶端同時讀寫NFS Server數據時,這個參數很有用。*

anonuid

參數以anon*開頭即值anonymous匿名用戶,這個用戶的UID設置值通常為nfsnobody的UID值,當然我們也可以自行設置這個UID值。但是,UID必須存在於/etc/passwd中。在多個NFS Clients時,如多臺web server共享一個NFS目錄時,通過這個參數可以使得不同的NFS Clients寫入的數據對所有NFS Clients保持同樣的用戶權限,即為配置的匿名UID對應用戶權限,這個參數很有用。*

anongid

同anonuid,區別是把uid(用戶id)換成gid(組id)。

推薦使用配置。

[root@nfs-server ~]# cat /etc/exports

/data 192.168.31.0/24(rw,sync,all_squash)

[root@nfs-server ~]# exportfs -rv

exporting 192.168.31.0/24:/data

NFS服務總結使得NFS Client端可寫的服務端配置條件

當多個NFS客戶端以NFS方式寫入修改伺服器端的文件系統時,需要具有以下權限:

1、NFS伺服器/etc/exports設置需要開放可寫入的權限,即服務端的共享權限。

2、NFS伺服器實際要共享的NFS目錄權限具有可寫入w的權限,即服務端本地目錄的安全權限。

3、每臺機器都對應存在和nfs默認配置UID的相同UID65534的nfsnobody用戶(確保所有客戶端的訪問權限統一,否則每個機器需要同時建立相同UID的用戶,並覆蓋NFS的默認配置)。

當滿足三個條件,多個NFS客戶端才能具有互相寫入,互相修改其他主機寫入文件的權限。

NFS服務重要文件說明

/etc/exports

NFS服務主配置文件,配置NFS具體共享服務的地點,默認內容為空,以行為單位。

[root@nfs-server ~]# cat /etc/exports

/data 192.168.31.0/24(rw,sync,all_squash)

/usr/sbin/exportfs

NFS服務的管理命令。例如,可以加載NFS配置生效,還可以直接配置NFS共享目錄,即無需配置/etc/exports實現共享。

[root@nfs-server ~]# exportfs –rv #加載配置生效,等價於重啟/etc/init.d/nfs reload

exporting 192.168.31.0/24:/data

exportfs不但可以加載配置生效,也可以通過命令直接共享目錄。越過/etc/exports,但重啟失效。

/usr/sbin/showmount

常用在客戶端,查看NFS配置及掛載結果的命令。配置nfsserver,分別在服務端以及客戶端查看掛載情況。

/var/lib/nfs/etab

NFS配置文件的完整參數設定的文件(有很多沒有配置但是默認就有的NFS參數)。

[root@nfs-server ~]# cat /var/lib/nfs/etab

/data 192.168.31.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,all_squash)

/proc/mounts

客戶端掛載參數

[root@web-lamp01 ~]# 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=496952k,nr_inodes=124238,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/sda3 / 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.31.129:/data/ /mnt 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.31.130,minorversion=0,local_lock=none,addr=192.168.31.129 0 0

NFS客戶端mount掛載命令    

NFS客戶端掛載的命令

掛載命令

掛載的格式類型

NFS伺服器提供的共享目錄

NFS客戶端要掛載的目錄

mount

-t nfs

192.168.31.129:/data

/mnt(必須存在)

完整掛載命令為:mount -t nfs 192.168.31.129:/data /mnt

執行掛載的過程

[root@web-lamp01 ~]# showmount -e 192.168.31.129 #掛載前先檢查有權限需要掛載的信息是否能夠掛載

Export list for 192.168.31.129:

/data 192.168.31.0/24 #可以清晰的看到共享了/data目錄

[root@web-lamp01 ~]# mount -t nfs 192.168.31.129:/data /mnt #執行掛載命令

[root@web-lamp01 ~]# df –h #查看掛載後的結果

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 7.1G 1.4G 5.4G 21% /

tmpfs 497M 0 497M 0% /dev/shm

/dev/sda1 190M 27M 153M 16% /boot

192.168.31.129:/data 7.1G 1.4G 5.4G 21% /mnt

[root@web-lamp01 ~]# mount #查看掛載後的結果

/dev/sda3 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.31.129:/data on /mnt type nfs (rw,vers=4,addr=192.168.31.129,clientaddr=192.168.31.130)

[root@web-lamp01 ~]# grep mnt /proc/mounts #查看掛載後的結果

192.168.31.129:/data/ /mnt 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.31.130,minorversion=0,local_lock=none,addr=192.168.31.129 0 0

NFS客戶端mount掛載深入NFS客戶端mount掛載參數說明

在NFS服務端可以通過cat /var/lib/nfs/etab查看NFS服務端配置的參數細節。

在NFS客戶端可以通過cat /proc/mounts查看mount的掛載參數細節。

NFS Client mount掛載參數列表

參數

參數功能

默認參數

fg

bg

當在客戶端執行掛載時,可選擇是前臺fg還是在後臺bg執行。若在前臺執行,則mount會持續嘗試掛載,直到成功或掛載時間超時為止,若在後臺執行,則mount會在後臺持續多次進行mount,而不會影響到前臺的其它程序操作。如果網絡聯機不穩定,或是伺服器常常需要開關機,建議使用bg比較好。

fg

soft

hard

當NFS Client以soft掛載Server後,若網絡或Server出現問題,造成Client和Server無法傳輸資料時,Client會一直嘗試到timeout後顯示錯誤並且停止嘗試。若使用soft mount的話,可能會在timeout出現時造成資料丟失,一般不建議使用。

若用hard模式掛載硬碟時,剛好和soft相反,此時Client會一直嘗試連線到Server,若Server有回應就繼續剛才的操作,若沒有回應NFS Client會一直嘗試,此時無法umount或kill,所以常常會配合intr使用。

hard

intr

當使用hard掛載的資源timeout後,若有指定intr參數,可以在timeout後把它中斷掉,這避免出問題時系統整個被NFS鎖死。

rsize

wsize

讀出(rsize)與寫入(wrize)的區塊大小(block size),這個設置值可以影響客戶端與服務端傳輸數據的緩衝存儲量,一般來說,如果在區域網內(LAN),並且客戶端與服務端都具有足夠的內存,這個值可以設置大一點(65535bytes),提升緩衝區塊將可提升NFS文件系統的傳輸能力。但設置的值也不能太大,最好是實現網絡能夠傳輸的最大值為限。

CentOS 5:默認1024

CentOS 6:默認131072

proto=udp

使用UDP協議來傳輸資料,在LAN中會有比較好的性能。若要跨越Internet的話,使用proto=tcp多傳輸的數據會有比較好的糾錯能力

proto=tcp

man nfs查看上述信息。

優化:

[root@web-lamp01 ~]# mount -t nfs -o bg,hard,intr,rsize=131072,wsize=131072 192.168.31.129:/data /mnt

下面是mount -o參數對應的選項列表

參數

參數意義

默認值

suid

nosuid

當掛載的文件系統上有任何SUID的程序時,只要使用nosuid就能夠取消設置SUID的功能。

suid

rw

ro

可以指定文件系統是只讀ro或可寫rw

rw

dev

nodev

是否可以保留裝置文件的特殊功能,一般來說只有/dev才有特殊的裝置,因此可以選擇nodev

dev

exec

noexec

是否具有執行文件的權限,如果想要掛載的僅僅是普通資源數據區(例如圖片、附件),可以選擇noexec

exec

user

nouser

是否允許用戶進行文件的掛載與卸載功能,如果要保護文件系統,最好不要提供用戶選擇掛載與卸載

nouser

auto

noauto

這個auto指的是"mount -a"時會不會被掛載的項目,如果不需要這個分區隨時被掛載,可設置為noauto

auto

NFS客戶端mount掛載優化

在企業工作場景,一般來說,NFS伺服器共享的只是普通靜態數據(圖片、附件、視頻),不需要執行suid、exec等權限,掛載的這類文件系統只能作為數據存取之用,無法執行程序,對於客戶端來講增加了安全性。例如,很多木馬篡改站點文件都是由上傳入口上傳的程序到存儲目錄,然後執行的。

因此在掛載的時候用下面的命令很有必要。

mount安全掛載參數

mount -t nfs -o nosuid,noexec,nodev,rw 192.168.31.129:/data /mnt

通過mount -o指定掛載參數和在/etc/fstab裡指定掛載參數效果是一樣的。

mount掛載性能優化參數選項

1、禁止更新目錄及文件時間戳掛載

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

2、安全加優化的掛載方式

mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.31.129:/data /mnt

3、默認的掛載方式(推薦)

mount -t nfs 192.168.31.129:/data /mnt

如果是本地文件系統

mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0

NFS服務內核優化

優化選項說明:

1、/proc/sys/net/core/rmem_default

該文件指定了接收套接字緩衝區大小的缺失值(以字節為單位),預設設置:124928。

2、/proc/sys/net/core/rmem_max

該文件指定了接收套接字緩衝區大小的最大值(以字節為單位),預設設置:124928。

3、/proc/sys/net/core/wmem_default

該文件指定了發送套接字緩衝區大小的缺失值(以字節為單位),預設設置:124928。

4、/proc/sys/net/core/wmem_max

該文件指定了發送套接字緩衝區大小的最大值(以字節為單位),預設設置:124928。

上述文件對應的具體內核優化命令:

cat >>/etc/sysctl.conf<<EOF

net.core.wmem_default=8388608

net.core.wmem_max=16777216

net.core.rmem_datault=8388608

net.core.rmem_max=16777216

EOF

sysctl -p

企業場景NFS共享存儲優化小結

1、硬體:sas、ssd硬碟,買多塊,raid0、raid10。網卡吞吐量要大,至少千兆

2、NFS伺服器端配置:/data

192.168.31.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)

3、NFS客戶端掛載:rsize、wsize、noatime、nodirtime、nosuid、noexec、soft(hard、intr)

mount -t nfs -o nosuid,noexec,nodev,noatime,rsize=131072,wsize=131072 192.168.31.129:/data /mnt

mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072 192.168.31.129:/data /mnt

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

4、有關NFS服務的所有伺服器內核優化

cat >>/etc/sysctl.conf<<EOF

net.core.wmem_default=8388608

net.core.wmem_max=16777216

net.core.rmem_datault=8388608

net.core.rmem_max=16777216

EOF

sysctl -p

5、如果卸載的時候提示:umount:/mnt:device is busy,需要退出掛載目錄後進行卸載,或是NFS Server宕機了,需要強制卸載mount -lf /mnt。

6、大型網站NFS網絡文件系統替代軟體,分布式文件系統Moosefs(mfs)、glusterfs、FastDFS。

NFS系統應用優缺點說明

作用:

NFS服務可以讓不同的客戶端掛載使用同一目錄,作為共享存儲使用,這樣可以保證不同節點客戶端數據的一致性,在集群架構環境中經常會用到。如果windows+linux可以用samba。

優點:

1、簡單,容易上手,容易掌握。

2、NFS文件系統內數據是在文件系統之上的,即數據能看見。

3、方便,部署快速,維護簡單,可控且滿足需求。

4、可靠,從軟體層面上看,數據可靠性高,經久耐用。數據是在文件系統之上的

5、穩定。

局限:

1、局限性是存在單點故障,如果nfs server宕機了所有客戶端都不能訪問共享目錄

可以通過負載均衡及高可用方案彌補。

2、在大數據高並發的場合,NFS效率、性能有限(一般幾千萬pv的網站不是瓶頸,除非網站架構太差,2千萬pv/日)。

3、客戶端認證是基於ip和主機名的,權限是根據ID識別,安全性一般(用於內外則問題不大)。

4、NFS數據是明文的,NFS本身對數據完整性不作驗證。

5、多臺客戶機器掛載一個NFS伺服器時,連接管理維護麻煩(耦合度高)。尤其NFS服務出現問題後,所有NFS客戶端都掛掉狀態(測試環境可以使用autofs自動掛載解決)。

6、大中小型網站(2千萬PV以下)線上應用,都有用武之地。

showmount命令說明

短格式

長格式

用途及實例結果

-e

--exports

顯示NFS伺服器輸出的目錄列表

[root@web-lamp01 ~]# showmount -e 192.168.31.129

Export list for 192.168.31.129:

/data 192.168.31.0/24

-d

--directories

顯示NFS伺服器中提供共享的目錄

-a

--all

以ip:/die格式顯示NFS伺服器的ip和可被掛載的目錄

相關焦點

  • Linux系統NFS網絡文件系統
    Linux系統NFS網絡文件系統NFS(network file system)
  • linux 下nfs文件系統搭建
    今天為大家分享nfs文件系統一,nfs是什麼摘自百科,網絡文件系統,英文Network File System(NFS),是由SUN公司研製的UNIX表示層協議(presentation layer protocol),能使使用者訪問網絡上別處的文件就像在使用自己的計算機一樣。
  • NFS, linux系統間文件共享
    #nfs 安裝cd /opt/software/nfs # 安裝nfsrpm -ivh *.rpm --force --nodeps # 創建共享文件夾mkdir -p /home/files/nfs_share # nfs 啟動# 為rpcbind
  • linux NFS 遠程伺服器共享目錄
    NFS是文件系統。在網絡存儲方面我們應該有所了解。那麼針對NFS伺服器的安裝和設置我們來詳細介紹一下。首先讓我們看一下NFS伺服器的安裝步驟。
  • Linux 系統實戰之 部署 NFS 伺服器
    NFS是Network File System的縮寫,即網絡文件系統,是一種使用於分散式文件系統的協定。功能是通過網絡讓不同的機器、不同的作業系統能夠彼此分享個別的數據,讓應用程式在客戶端通過網絡訪問位於伺服器磁碟中的數據,是在類Unix系統間實現磁碟文件共享的一種方法。
  • Linux NFS服務的初步了解
    NFS簡介NFS(Network File System)即網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS伺服器上的文件,就像訪問本地文件一樣。
  • k8s-持久化存儲-NFS文件系統
    echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports*星號表示可以由任意的客戶端掛載共享目錄。/nfs/data/作為共享目錄。
  • Windows上面掛載NFS共享
    導讀眾所周知,nfs和smb是Linux伺服器上的文件共享協議,smb使用的是samba協議和windows的文件共享使用的是一種協議,也就是說smb是跨平臺的文件共享協議,而NFS個人認為是Linux系統或者類uinx系統的文件共享協議。
  • NFS文件共享伺服器
    NFS文件共享伺服器1、NFS的簡述 NFS是network file system的縮寫,最大的特點就是可以通過網絡讓不同的機器和不同的系統實現文件共享
  • linux | NFS的簡單使用
    簡介NFS(Network File System)即網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源
  • NFS伺服器的安裝配置
    今天來講一下NFS網絡文件伺服器的安裝和配置。NFS是linux系統進行文件共享的一種網絡協議,NFS客戶端通過掛載NFS文件系統的方式來訪問NFS伺服器中輸出的共享目錄1、NFS伺服器需要yum -y install nfs-utils rpcbind這個軟體包,現在來安裝一下兩個軟體包yum -y install nfs-utils rpcbind
  • 【Linux公開課】NFS伺服器
    那麼如何更快、更便捷地傳輸文件,將影響到開發工作的效率。NFS無疑是最好的選擇。通過NFS服務,主機將用戶指定的目錄通過網絡共享給目標機(和windows的文件網絡共享類似)。目標機可以直接運行存放於Linux主機共享目錄下的程序。這樣調試程序時十分方便。 NFS即網絡文件系統(Network File-System),可以通過網絡讓不同機器、不同系統之間可以實現文件共享。
  • 嵌入式Linux內核,文件系統的製作
    開發板的內核和根文件系統。> 5,使用tftp下載到開發板運行即可   根文件系統的製作: 根文件系統是Linux啟動時使用的第一個文件系統,就像PC機上的文件目錄 6,)在busybox根目錄下make ARCH=arm CROSS_COMPILE=arm-linux- /*等.等*/make install //執行的是busybox這個可執行文件/*rootfs/bin/目錄下多了好多文件*/ 13,至此根文件系統製作完成
  • 【必看】Ftp伺服器、 Samba伺服器、NFS伺服器的區別
    簡單的說一下個個伺服器的配置       NFS是SUN Microsystem公司開發的網絡文件系統,它是一種基於遠程過程調用(RPC)的分布式文件系統架構。接上步,改變文件目錄 # cd/mnt/nfs就方便地實現了對nfs伺服器目錄/tmp的遠程訪問。       6、卸載NFS文件系統。在客戶端執行命令 # umount/mnt/nfs 就卸下了第4步掛接的NFS文件系統。
  • centos7配置nfs共享存儲服務
    nfs 是一種網絡文件系統,需要依賴rpc進行過程調度注意nfs只驗證
  • 企業級共享存儲系統 NFS 全面講解
    NFS是Network File System的縮寫,即網絡文件系統,是一種使用於分散式文件系統的協定。功能是通過網絡讓不同的機器、不同的作業系統能夠彼此分享個別的數據,讓應用程式在客戶端通過網絡訪問位於伺服器磁碟中的數據,是在類Unix系統間實現磁碟文件共享的一種方法。
  • Linux下搭建NFS文件共享伺服器
    5、啟用nfs服務(/etc/init.d/nfs start){後}注意:a、rw與sync的分隔符是逗號不是點b、rpc先啟動nfs後啟動,順序不對會導致伺服器報錯8、檢查rpcbind服務和nfs服務是否啟動(/etc/init.d/rpcbind
  • 關於 Linux中NFS的一些筆記
    ——中島敦《山月記》NFSNFS(Network File System, 網絡文件系統),用來為客戶機提供共享使用的文件夾;將NFS伺服器分享的目錄,掛載到本地機器當中,本地NFS的客戶端應用可以讀寫位於遠端NFS伺服器上的文件,在客戶端端看起來,就像訪問本地文件一樣。
  • 把你的樹莓派家庭實驗室變成一個網絡文件系統 | Linux 中國
    無論你的家庭實驗室是由普通計算機、多餘的企業伺服器,還是樹莓派或其他單板計算機(SBC)組成,共享文件系統都是一種有用的資產,而網絡文件系統(NFS)伺服器是創建共享文件系統的好方法。我之前寫過關於建立「家庭私有雲」的文章,這是一個由樹莓派或其他 SBC 組成的家庭實驗室,也許還有其他一些消費類硬體或臺式 PC。NFS 伺服器是這些組件之間共享數據的理想方式。
  • NFS網絡環境的搭建
    NFS(Network File System),即網絡文件系統,它可以幫助我們很方便的在伺服器和客戶端之間共享文件。嵌入式開發中,我們經常需要在PC主機編譯程序,然後在開發板上面運行程序,NFS網絡文件系統可以幫助我們很好實現這個過程。