1. 程式人生 > >nfs-rpcbind-portmap掛載nfs-network file system

nfs-rpcbind-portmap掛載nfs-network file system

AC redhat 簡述 系統默認 掛載 高可用方案 -c hab 名稱

NFS原理詳解

PS:哈哈,這篇的篇幅真的非常的長。要看完真的要有很強的耐心那。我自己寫也快寫吐了呢。

[ATong學習linux]NFS原理詳解

一、NFS介紹

1)什麽是NFS

它的主要功能是通過網絡讓不同的機器系統之間可以彼此共享文件和目錄。NFS服務器可以允許NFS客戶端將遠端NFS服務器端的共享目錄掛載到本地的NFS客戶端中。在本地的NFS客戶端的機器看來,NFS服務器端共享的目錄就好像自己的磁盤分區和目錄一樣。一般客戶端掛載到本地目錄的名字可以隨便,但為方便管理,我們要和服務器端一樣比較好。

NFS一般用來存儲共享視頻,圖片等靜態數據。

《什麽是NFS》

就是通過網絡共享目錄,讓網絡上的其他服務器能夠掛載訪問共享目錄內的數據。(一般共享視頻,圖片等靜態數據)

這個再往簡單點,就相當於windows裏面共享文件,然後其他主機把這個共享文件映射成了本地盤使用一樣。接下來我們會學習兩部分:NFS原理(共享原理)、服務端如何架NFS(怎麽共享)、客戶端怎麽掛載(怎麽映射網盤)

掛載結構圖

技術分享圖片

2)NFS掛載原理介紹

如上圖,當我們在nfs服務器設置好一個共享目錄/data後,其他的有權訪問NFS服務器的NFS客戶端就可以將這個目錄掛載到本地。並且能夠看到服務端/data的所有數據。因為掛載在本地的/data目錄,其實就是服務器端的/data目錄。如果服務器端配置的客戶端只讀,那麽客戶端就只能夠只讀。如果配置讀寫,客戶端就能夠進行讀寫。掛載後,NFS客戶端查看磁盤信息命令:#df –h

NFS是通過網絡來進行服務端和客戶端之間的數據傳輸。兩者之間要傳輸數據就要有想對應的網絡端口來進行傳輸。NFS服務器到底使用什麽網絡端口來傳輸數據的,NFS服務器端其實是隨機選擇端口來進行數據傳輸。那NFS客戶端又是如何知道NFS服務器端到底使用的是哪個端口呢?其實NFS服務器時通過遠程過程調用(remote procedure call 簡稱RPC)協議/服務來實現的。也就是說RPC服務會統一管理NFS的端口,客戶端和服務端通過RPC來先溝通NFS使用了哪些端口,之後再利用這些端口(小於1024)來進行數據的傳輸。

PS:哦,原來是RPC管理服務端的NFS端口分配,客戶端要傳數據,那客戶端的RPC會先跟服務端的RPC去要服務器的端口,要到端口後再建立連接,然後傳輸數據。

《rpc與nfs

pc(portmap)就是用來統一管理NFS端口的服務,並且統一對外的端口是111。NFS服務端需要先啟動rpc,再啟動NFS,這樣NFS才能夠到RPC去註冊端口信息。客戶端的RPC可以通過向服務端的RPC請求獲取服務端的NFS端口信息。當獲取到了NFS端口信息後,就會以實際端口進行數據的傳輸。(由於NFS端口為隨機的。)

《RPC和NFS如何通訊》

因為NFS有很多功能,不同的功能需要使用不同的端口。因此NFS無法固定端口。而RPC會記錄NFS端口的信息,這樣我們就能夠通過RPC實現服務端和客戶端的RPC來溝通端口信息。

那RPC和NFS之間又是如何之間相互通訊的?

首先當NFS啟動後,就會隨機的使用一些端口,然後NFS就會向RPC去註冊這些端口。RPC就會記錄下這些端口。並且RPC會開機111端口,等待客戶端RPC的請求,如果客戶端有請求,那服務端的RPC就會將記錄的NFS端口信息告知客戶端。

提示:在啟動NFS SERVER之前,首先要啟動RPC服務(即portmap服務,下同)否則NFS SERVER就無法向RPC服務區註冊,另外,如果RPC服務重新啟動,原來已經註冊好的NFS端口數據就會全部丟失。因此此時RPC服務管理的NFS程序也要重新啟動以重新向RPC註冊。特別註意:一般修改NFS配置文檔後,是不需要重啟NFS的,直接在命令執行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。

PS:這裏有個啟動順序的點,先給大家講清楚。因為NFS要想RPC註冊端口信息。所以RPC一定要先於NFS早啟動。我給大家比喻一個左手疊右手的遊戲,此時就是一定要確保NFS的手掌(左)在RPC手掌(右)的上面。正常順序是要RPC先疊上去,然後NFS再疊上去。如果RPC重啟了,就相當於手掌抽出來了,然後重新疊上去。這樣RPC就在NFS上面了,所以不行。此時我們的NFS就需要再重新啟動一次。這樣NFS抽出來然後再疊上去之後,NFS就在RPC上面了。如果NFS修改了配置,就直接reload就好了

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

1)首先服務器端啟動RPC服務,並開啟111端口

2)啟動NFS服務,並向RPC註冊端口信息

3)客戶端啟動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口

4)服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。

5)客戶端通過獲取的NFS端口來建立和服務端的NFS連接並進行數據的傳輸。

技術分享圖片

------------------------------------小結-------------------------------------------------

NFS的原理結構其實還是挺簡單啊哦,NFS就是網絡共享目錄,就是共享文件.服務端共享,客戶端掛載使用。掛載流程原理,就是上面提到的5個流程。並且為什麽是這個流程也講了。因為NFS要向RPC去註冊端口信息。因為NFS的端口是隨機獲取的。

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

二、NFS部署

客戶端

直接安裝下portmap軟件和NFS軟件,具體怎麽按照參照服務器端。

服務器端

1)查看系統系信息

#uname -r查看系統內核版本

[root@CT5_6-32-220-NFS01 ~]# cat/etc/redhat-release

CentOS release 5.6 (Final)

[root@CT5_6-32-220-NFS01 ~]# uname -r

2.6.18-238.el5

要養成一個習慣,就是先查看系統版本和內核參數。同一個軟件在不同版本,內核之間是有差異的,所以部署的方法也不一樣,不要因為這個而造成不必要的錯誤。在做應用遷移之前也要對環境系統做一個完整的登記,並且新環境中的一些參數要和舊的環境一模一樣避免錯誤。

#uname -a查看操作系統信息

[root@CT56-32-220-NFS01 ~]# uname -a

Linux CT56-32-220-NFS01 2.6.18-238.el5 #1 SMP ThuJan 13 16:24:47 EST 2011 i686 i686 i386 GNU/Linux

2)NFS軟件安裝

要部署NFS服務,必須安裝下面兩個軟件包:Nfs-utils:NFS主程序、Portmap:RPC主程序

NFS服務器端和client端都需要安裝這兩個軟件。

《NFS軟件包》

1、nfs-utils:NFS的主程序,包含rpc.nfsd rpc.mount兩個deamons

2、portmap:RPC主程序,可以將NFS視為RPC下的一個子程序

2.1)查看NFS軟件包

[root@CT5_6-32-220-NFS01 ~]# rpm -qa | egrep "nfs|portmap" ####可以看到系統默認已經安裝了。

portmap-4.0-65.2.2.1

nfs-utils-lib-1.0.8-7.6.el5

nfs-utils-1.0.9-50.el5

如果沒有安裝的話,可以使用yum Install nfs-utils portmap安裝包名稱來安裝。

3)NFS啟動

因為NFS及其輔助程序都是基於RPC協議(使用RPC的111端口來進行請求的監聽)所以首先要確保系統中運行了portmap服務。客戶端和服務端都要啟動portmap服務,客戶端不用啟動nfs服務,而服務端需要啟動nfs服務。

portmap啟動命令:

#/etc/init.d/portmap start

[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/portmapstart

Starting portmap: [ OK ] ##服務已經正常啟動了

#netstat–lnt來查看系統中啟用的端口

[root@CT56-32-220-NFS01 ~]# netstat -lnt

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN ###可以看到多了一個111端口,這個端口就是RPC的監聽端口。

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:823 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN

提示:如果portmap服務沒有啟動,我們通過rpcinfo –p(rpc informationRPC信息)Localhost檢查時,會報錯。

[root@CT56-32-220-NFS01 ~]# rpcinfo -p ##正常的顯示信息

programvers proto port

100000 2 tcp 111 portmapper

100000 2 udp 111 portmapper

100024 1 udp 820 status

[root@CT56-32-220-NFS01 ~]# rpcinfo –p ##出錯的信息

rpcinfo: can‘t contact portmapper: RPC: Remotesystem error - Connection refused

Rpfinfo 就是用來查看在rpc註冊的端口信息。如果nfs系統服務啟動後,就會像rpc去註冊信息,此時就能夠差查看到註冊了哪些信息。

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

NFS啟動命令:

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

#/etc/init.d/nfs start

#/etc/init.d/nfs status

[root@CT56-32-220-NFS01 ~]# /etc/init.d/nfs status ####我們這裏查看nfs的狀態,這裏卻顯示了3個程序的狀態,那是因為NFS包含了mountd掛載,quotad配額的管理機制的程序。

rpc.mountd is stopped-->管理client端是否能夠登入的問題

nfsd is stopped###這個是主程序->管理client端能夠取得的權限

rpc.rquotad is stopped

說明:從NFS服務啟動的信息中我們可以看到NFS默認需要啟動的進程有rpc,mountd,nfsd,rpc,rquotad,rpc,idmapd。NFS服務器啟動時最少需要兩個daemons,一個管理client端是否能夠登入的問題,另一個管理client端能夠取得的權限。如果還需要管理quota的話,NFS還要加載rpc.rquotad程序。

[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/nfs status

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

nfsd (pid 12917 12916 12915 12914 12913 12912 12911 12910) isrunning...

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

1、nfsd(rpc.conf)

這個daemon的主要功能就是管理client端是否能夠登入主機,其中還包含登入者的ID判別。

2、rpc.mount

這個daemon主要功能則是管理NFS的文件系統。當client端順利通過rpc.nfsd登入主機後,在它可以使用NFS服務器提供規定文件之前,還會經過文件使用權限的認證程序。它會去讀取NFS的配置文件/etc/exports來對比客戶端的權限,當通過這一關之後,client端也就取得使用NFS文件的權限。這就是為什麽單單在/etc/exports中設置NFS的權限是不夠的。


NFS啟動&信息查看

/etc/init.d/portmap start

rpcinfo –p

/etc/init.d/nfs status

/etc/init.d/nfs start

RPC主程序的是三個進程

rpc.mountd #nfs掛載程序

nfsd nfs #主程序

rpc.rqutod #配額

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

配置NFS開機啟動

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

#chkconfig nfs on

#chkconfig protmap on

(客戶端只需要portmap自啟動就可以了)

[root@CT5_6-32-220-NFS01 ~]# chkconfig portmapon

[root@CT5_6-32-220-NFS01 ~]# chkconfig nfs on

[root@CT5_6-32-220-NFS01 ~]# chkconfig --list | egrep "nfs|port" ####註意|兩邊不能加上空格要不會查詢不到。

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

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

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

三、配置NFS服務

NFS配置文件的路徑

#/etc/exports 默認這個裏面的內容是空的,這個就是nfs的配置文件。

格式:NFS共享目錄 客戶端地址1(參1,參2只讀還是可寫) 客戶端地址2(參1,參2)

參數選項說明:

共享目錄:存在於我們本機上的目錄,我們想共享給網絡上的其他主機使用。如我要共享/tmp/data目錄,那麽此選項可以就直接寫/tmp/data目錄。

客戶端地址1(參數1,參數2):客戶端地址能夠設置一個網絡,也可以設置單個主機。參數:如讀寫權限rw,同步更新sync,壓縮來訪賬號all_squash,壓縮後的匿名賬號anonuid=uid,anongid=gid等等

客戶端地址選項說明:

客戶端地址

具體地址例子

說明

授權單一客戶端訪問NFS

10.0.0.30

一般情況下,生產環境中此配置不多

授權整個網段可訪問NFS

10.0.0.0/24

其中的/24表示掩碼為255.255.255.0.在生產環境中最常見的配置。

授權整個網段

10.0.0.*

指定網段的另外寫法(需要驗證)

生產環境常見配置實例:

常用格式說明

要共享的目錄客戶端ip地址或IP段(參1,參2)黃色區域是沒有空格的

配置實例1

/tmp/share 10.0.0.0/24(rw,sync)

###紅色部門不能有空格 sync表示同步更新到磁盤,同步將內存內的文件寫入到磁盤空間,保證數據不丟失,但會影響性能。

配置實例2

/home/ryan 10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000)

###生產環境中常用的一種配置,適合多客戶端共享一個NFS目錄。All_squash 也就是說不管客戶端是以什麽樣的身份來進行訪問的,都會被壓縮成為all_squash後面所接的用戶和群組身份。這邊用anonuid、anongid編號來標示。

配置實例3

/home/atong 10.0.0.0/24(ro)

NFS權限設置

NFS配置權限設置,即/etc/exports文件配置格式中小括號()裏的參數集。

參數命令

參數用途

rw

***

表示可讀寫

ro

Read-only表示只能讀權限

Sync

***

請求或者寫入數據時,數據同步寫入到NFS server的硬盤中後才會返回

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為2000,那麽客戶端也一定要存在2000這個賬號才可以

anonuid

anonuid就是匿名的uid和gid。說明客戶端以什麽權限來訪問服務端,在默認情況下是nfsnobody。Uid65534.

anongid

同anongid,就是把uid換成gid而已。

提示:

1、另外可以通過man exports查閱exports參數說明。

2、當我們nfs配置好之後,我們可以通過cat /var/lib/nfs/etab來查看,nfs配置的參數。並且這個目錄很重要。/var/lib/nfs/rmtab從這個文件中我們可以看到,有哪些客戶端掛載了nfs共享目錄。這個兩個文件是比較重要的。

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

服務器共享配置格式:

1)基本格式:共享目錄 ip/24(共享屬性) ->註意無空格

2)共享權限設置:

rw讀寫屬性

sync文件實際寫入磁盤後才返回

all_squash:所有訪問用戶均被壓縮成後續接的用戶。

anonuid:默認壓縮的用戶

anongid:默認壓縮的用戶組

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

客戶端以什麽身份來訪問?

客戶端訪問服務端默認是使用nfsnobody這個用戶來進行訪問的。uid和gid為65534。服務器默認共享時,也是加上了all_squash這個參數。並制定anonuid為65534(也就是nfsnobayd用戶)。當然如果系統中nfsnobody是其他的uid,那麽就有可能造成訪問權限出現問題。所以最好我們可以通過一設置一個用戶來訪問,統一UID、GID。

掛載情況怎樣呢?

有兩個重要的文件,能夠解決這個疑問。/var/lib/nfs/etab、/var/lib/nfs/rmtab這兩個文件就能夠查看服務器上共享了什麽目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。

1、etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可以使用,並且設定的參數為何。

2、rmtab這個文件就是能夠查看到共享目錄被掛載的情況。

四、NFS配置實例

實例1、共享/atong 目錄給10.0.0.0/24這個網段。

服務器端操作:

1)檢查,啟動portmap

[root@CT5_6-32-220-NFS01 /]# /etc/init.d/portmapstatus

portmap (pid 2506) is running...

root@CT5_6-32-220-NFS01 /]# rpcinfo-p

-bash: rpcinfo-p: command not found

[root@CT5_6-32-220-NFS01 /]# rpcinfo –p ###查看RPC記錄的信息。哇,這麽多不過可以看到有nfs rquotad,mount這些信息說明nfs有來註冊信息。

programvers proto port

100000 2 tcp 111 portmapper

100000 2 udp 111 portmapper

100024 1 udp 601 status

100024 1 tcp 604 status

100011 1 udp 773 rquotad rquotad

100011 2 udp 773 rquotad

100011 1 tcp 776 rquotad

100011 2 tcp 776 rquotad

100003 2 udp 2049 nfs

100003 3 udp 2049 nfs

100003 4 udp 2049 nfs

100005 1 tcp 803 mountd

100005 2 udp 800 mountd

100005 2 tcp 803 mountd

100005 3 udp 800 mountd

100005 3 tcp 803 mountd

2)查看NFS的運行狀態

[root@CT5_6-32-220-NFS01 /]# /etc/init.d/nfs status

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

nfsd (pid 12917 12916 12915 12914 12913 12912 1291112910) is running...

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

3)創建目錄

[root@CT5_6-32-220-NFS01 /]# mkdir atong

[root@CT5_6-32-220-NFS01 /]# ls -d atong

atong

[root@CT5_6-32-220-NFS01 /]# ll -d atong

drwxr-xr-x 2 root root 4096 May 27 17:22 oldbo ####註意現在共享的目錄的權限為只有root才有寫權限。

4)配置/etc/exports(NFS配置文件)

修改完配置之後要重新reload一下。/etc/init.d/nfs reload

[root@CT5_6-32-220-NFS01 /]# cat /etc/exports

[root@CT5_6-32-220-NFS01 /]# cat /etc/exports

/atong 192.168.40.0/22(rw.sync)

[root@CT5_6-32-220-NFS01 /]# /etc/init.d/nfs reload

exportfs: /etc/exports:1: unknown keyword "rw.sync"###roload的時候提示錯誤,重新編寫了一下配置文件,就又正確了。以後要養成好的編寫配置要備份的習慣。

[root@CT5_6-32-220-NFS01 /]# vi /etc/exports

/atong 192.168.41.0/22(rw,sync)

[root@CT5_6-32-220-NFS01 /]# /etc/init.d/nfs reload 重新reload就成功了。

到此NFS已經算是共享了目錄,及設置了相應的權限。

客戶端操作:

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

現在我們的服務器端在配置文件上已經設置了共享,並在配置文件中設置了權限rw。但其實服務器端的目錄文件的rwxr-xr-x權限是還沒有開放的。這個跟我們的windows共享也是很像的,不僅要共享權限有,目錄本地安全權限也要有。現在就是讓客戶端來進行掛載就可以了。

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

1)查看portmap是否正常啟動

[root@CT56-32-220-NFS01 ~]# /etc/init.d/portmap status

portmap (pid 2725) is running...

2)查看服務器端的共享信息。

Showmount –e192.168.1.1 來查看服務端給我們提供的有哪些共享。

[root@CT56-32-220-NFS01 ~]# showmount -e 192.168.41.220

Export list for 192.168.41.220:

/atong 192.168.41.0/22 ----》看到已經有這個共享了。

3)在客戶端掛載服務器共享出來的目錄。

#mount -t nfs 192.168.1.1:/atong /mnt(本地目錄)我們可以自己新建一個要掛載的目錄。

[root@CT56-32-220-NFS01 ~]# mount -t nfs 192.168.41.220:/atong /atong

#mount 命令格式如下:

####mount -t 類型 device localedir(本地目錄)

#以上這個命令device=192.168.41.220:/atong

[root@CT56-32-220-NFS01 ~]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1655612 5708704 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

192.168.41.220:/atong 7765152 1655296 5709024 23% /atong

[root@CT56-32-220-NFS01 ~]# touch /atong/test.txt

touch: cannot touch `/atong/test.txt‘: Permissiondenied---》發現沒有現在是沒有權限的,因為我們服務器的本地的rwx權限沒有開啟來。

[root@CT56-32-220-NFS01 ~]# ll /atong/

total 4

-rw-r--r-- 1 root root 0 May 28 08:14 test1

drwxr-xr-x 2 root root 4096 May 28 08:15 test-dir1

##### 在服務器端創建了目錄,要過段時間才能同步到客戶端。額,這樣的情況有辦法解決沒有?

4)查看掛載和共享的文件是否一致。

#df 來查看一下我們系統中的文件系統情況。

[root@CT56-32-220-NFS01~]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda3 7765136 1655612 5708704 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

192.168.41.220:/atong 7765152 1655296 5709024 23% /atong

檢查客戶端中掛載的內容是否和服務端的目錄一樣。

5)在客戶端執行寫操作。

權限說明:當我們在/etc/exports中給了NFS rw權限。但為什麽客戶端還是寫不了。因為如果我們僅在NFS配置文件中配置了rw權限。只表明了網絡端的主機能夠有權限去服務器端去寫文件,但還需要通過服務器端的本地目錄的權限。那麽也就是說客戶端需要通過兩層的權限來控制的。NFS配置文件—>共享目錄文件的權限。並且客戶端往服務端去寫文件,的用戶身份是nfsnobody、nfsnobody UID=65534。

《錯誤提示》

[atong@LiWenTong ~]$/etc/init.d/portmap stauts --->portmap沒有啟動

Networking not configured – exiting

客戶端NFS掛載參數

我們客戶端掛載NFS也可以設置很多參數的,就跟windows映射盤一樣,也是可以設置參數的。客戶端掛載可以設置:不可執行、讀寫權限、斷開後RPC呼叫方式、讀寫區塊大小等。一般來說當nfs服務器提供的只是普通數據(圖片html,css,jss,視頻等)應該不需要執行suid,exec等權限,由於是共享目錄不存在設備所以也不存在掛載設備dev,因此在客戶端掛載的時候,可以加上給你這幾個命令掛載。

#mount –t nfs -o nosuid,noexec,nodev,rw 192.168.1.1:/share /local/mnt

可使用掛載參數表:

參數

參數意義

系統默認值

suid

nosuid

允許設置suid

不允許在共享文件系統中設置suid

Suid

rw

ro

讀寫權限,或者是只讀。

dev

nodev

解釋設備上的設備

不解釋字符或塊特殊文件系統上的設備

exec

noexec

不允許在共享文件系統中直接執行任何二進制文件。

user

nouser

允許用戶去掛載和卸載這個共享目錄。並且這個選項也意味著noexec, nosuid, and nodev這個選項,除非後面有覆蓋指定。

auto

noauto

另外還有一些NFS掛載的額外參數可用。如果NFS是用在高速運行的環境中的話,那麽建議加上這些參數,這樣當這臺NFS服務器因為某些原因離線,NFS客戶端可以繼續在後臺重復呼叫,直到NFS服務器再度連上線為止。

針對一些高並發的情況,還有一些可以進行優化的參數:

參數

參數功能

默認參數

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

命令格式如下:mount –t nfs –o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.1:/share /local/dir

NFS客戶端如何掛載才最佳

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

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

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

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

掛載完成後客戶端的常見操作

1)掛載後重啟設備後的反應。

[root@CT56-32-221-NFS02 ~]# mount -t nfs192.168.41.220:/atong /atong/

[root@CT56-32-221-NFS02 ~]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1634308 5730008 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

192.168.41.220:/atong 7765152 1655296 5709024 23% /atong

[root@CT56-32-221-NFS02 ~]# ll /atong/####當我們掛載了服務器端的共享目錄到本地目錄之後,原本地目錄的內容會被替換成為遠端服務器的內容。

total 4

-rw-r--r-- 1 root root 0 May 28 08:14 test1

drwxr-xr-x 2 root root 4096 May 28 08:15 test-dir1

[root@CT56-32-221-NFS02 ~]# umount /atong

[root@CT56-32-221-NFS02 ~]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1634308 5730008 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

[root@CT56-32-221-NFS02 ~]# ll /atong/ ####當我們將掛載的目錄重新卸載之後,原目錄的內容就又都能夠看見了。

total 0

-rw-r--r-- 1 root root 0 May 28 08:27 test1

-rw-r--r-- 1 root root 0 May 28 08:28 test2

2)如何設置開機自動掛載

特別說明:我們重新啟動客戶端之後,我們要重新去掛載nfs,我們可以有兩種方式來實現。

<1>通過把mount–t nfs 192.168.1.1:/atong /mnt這條命令寫到/etc/rc.local中,讓它開機就執行。

<2>在/etc/fstab(系統開機啟動分區加載項)添加我們的NFS配置:

10.0.0.161:/atong /atong/video nfs defaults 1 1 。

但在生產環境中,對於共享的NFS目錄,一般不會配置到/etc/fstab裏。因為在客戶端主機重啟時如果由於網絡等原因連接不上nfs server時,就會導致客戶機無法啟動的厄運發生。一般是通過把mount -t nfs 10.10.10.1:/atong /local/dir命令放到rc.local中來實現開機自動掛載NFS。

nfs的開機自動掛載

有兩種方式實現開機自動掛載1、將mount命令寫在rc.local文件中。2、在/etc/fstab中寫入具體的配置系想你。

但這裏建議采用第一種,如果因為網絡原因沒有連接到NFSserver那麽第二中有可能會導致系統無法啟動的故障。

3)卸載掛載點

<1>正常卸載

#umount /local/dir 正常的卸載命令來卸載。

<2>umoutn提示busy錯誤

如何卸載nfs掛載點通過umount /local/dir來進行卸載。如果本地中有用戶還在這個掛載點中,那麽會提示這個掛載點繁忙busy。我們需要先讓本地退出這個掛載點,然後再重新進行卸載。而如果有其他用戶在使用,同樣也是需要用戶退出之後這個掛載目錄才能進行卸載。

或者進行強制卸載:umount –lf /local/dir 來進行強制卸載。

簡述一次完整的NFS掛載過程

1)確認portmap、nfs已經啟動。並且是nfs比portmap後啟動的。

通過chkconfig來配置開機啟動,portmap的默認開啟順序一也是比nfs來得早。

2)vi /etc/export 配置nfs服務的共享目錄及權限。

#/etc/init.d/nfs reload 重新加載

確認服務器端要共享的目錄已經存在,並且權限正確。

3)客戶端的portmap的啟動,並加入開機自啟動中。通過showmount來查看服務器端是否已經提供了共享的NFS目錄。通過rpfinfo命令來查看服務器端的rpc信息。當本地端要掛載的時候也要確認本地掛載的目錄,沒有別占用。

3.1)當客戶端不能夠寫入的時候,需要去判斷服務器端的/etc/exports中權限是否正確,服務端共享的目錄的本地目錄權限是否正確。如果不正確,那麽我們可以通過把目錄的屬主改成nfsnobody以達到讓客戶端能夠寫入的權限。當重客戶端寫完之後,可以查看一下寫入之後的檔案的所有者和權限。可以發現只要是從客戶端去創建的文檔,文件的屬主和用戶組都是nfsnobody。如果加上all_squash之後。

(但要確定是所有的客戶端具有同一個uidnfsnobody。當我們的系統都是32位的時候,可以確定匿名用戶的uid都是65534.而64位的操作系統,那麽就是一串其他的數字。)

3.2)所有系統都是64位系統時。我們要共享時,可以在我們服務器端做一個修改:在all_squash,anonuid=2000,anongid=2000

3.3)不必查看系統時32還是64位

在網絡中的所有機器上創建一個新的用戶及用戶組。然後配置/etc/exports all_squash,anonuid=1207,anongid=1207

4)配置客戶端的默認開機啟動掛載。

將mount –t nfs 192.68..1.1:/share/dir /local/dir 命令寫入rc.local中。

------------------------------後續自我小結-----------------------------------------------

NFS就是網絡共享文件系統,道理很簡單那,就是服務器共享文件,客戶端掛載服務端共享的文件。共享文件,需要配置/etc/exports,添加相應的共享目錄及共享的目標網絡及權限配置,開啟共享文件的本地權限。然後客戶端進行有參數的掛載,設置讀寫權限rw,nodev,noexec,nouser,hard,intr,rsize,wsize等掛載參數。然後就是開始掛載使用。

在啟動順序上我們要註意portmap一定要先於NFS啟動,客戶端的NFS開機掛載最好是將命令加載/etc/rc.local裏面。

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

常見問題補充:

1)服務器端網絡故障或者是網絡斷開時。

當把服務器的網絡斷開後,客戶端df查看本地分區信息的時候一直在等待中,有時會卡死。

[root@CT56-32-221-NFS02 atong]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1635964 5728352 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

…一直在等待中……

[root@CT56-32-222-NFS03 ~]# cd /atong

…一直等待中….連我們原本/atong的目錄都進不去因為現在是掛載的。

[root@CT56-32-221-NFS02 ~]# umount /atong ###通過umount /atong也不能進行卸載。

umount.nfs: 192.168.41.220:/atong: not found /mounted or server not reachable

[root@CT56-32-221-NFS02 ~]# umount -lf /atong ####通過-lf進行強制卸載,就能夠進行卸載了。

[root@CT56-32-221-NFS02 ~]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1635976 5728340 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

當服務器網絡恢復正常後,df就可以查看到信息了。

[root@CT56-32-222-NFS03 ~]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1636016 5728300 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

192.168.41.220:/atong 7765152 1655360 5708992 23% /atong

2)修改服務器NFS配置,停用共享,不reload nfs服務。

[root@CT56-32-221-NFS02 ~]# showmount -e 192.168.41.220

Export list for 192.168.41.220:

/atong 192.168.41.0/22

[root@CT56-32-222-NFS03 atong]# touch nfs4

[root@CT56-32-222-NFS03 atong]# ll

total 4

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 13:24 nfs2

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs3

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs4

###只要沒有reload就沒有任何的影響,因為服務器的RPC還是記住了NFS原有舊的信息。所以客戶端不會受影響。

[root@CT56-32-221-NFS02 ~]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1635976 5728340 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

df: `/atong‘:Permission denied

###當服務器修改完配置重新reload之後,原本掛載的目錄就會出現權限限制。原因就是reload之後會重新加載配置文件,就會重新按照新的配置文件來生效。重新配置,重新reload之後,客戶端就又能夠重新進行掛載了。

3)客戶端網絡中斷

客戶端網絡中斷的話,那麽所有的連接就完全斷開的,就不必多多說了。之後網絡恢復後,就又可以使用了。

4)客戶端portmap服務被停止

[root@CT56-32-222-NFS03 atong]# /etc/init.d/portmapstatus

portmap (pid 2726) is running...

[root@CT56-32-222-NFS03 atong]# /etc/init.d/portmapstop

Stopping portmap: [ OK ]

[root@CT56-32-222-NFS03 atong]# ll

total 4

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 13:24 nfs2

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs3

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs4

-rwxrwxrwx 1 root root 0 May 28 08:14 test1

drwxrwxrwx 2 root root 4096 May 28 08:15 test-dir1

[root@CT56-32-222-NFS03 atong]# touch nfs5

[root@CT56-32-222-NFS03 atong]# ll --》能正常使用

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:39 nfs5

[root@CT56-32-222-NFS03 /]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1636016 5728300 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

192.168.41.220:/atong 7765152 1655360 5708992 23% /atong

[root@CT56-32-222-NFS03 /]# showmount -e 192.168.41.220

Export list for 192.168.41.220: ---》能查看原有NFS服務器的掛載信息

/atong 192.168.41.0/22

#####客戶端的portmap被停止後,原掛載的nfs仍然能夠進行工作。並且能和服務器進行同步。

[root@CT56-32-222-NFS03 /]# umount /atong

[root@CT56-32-222-NFS03 /]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1636020 5728296 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

[root@CT56-32-222-NFS03 /]# showmount -e 192.168.41.220

Export list for 192.168.41.220:

/atong 192.168.41.0/22

[root@CT56-32-222-NFS03 /]# mount -t nfs 192.168.41.220:/atong /atong

mount.nfs:Input/output error

####卸載原有的掛載之後,重新掛載就會出現掛載不了的錯誤。恢復portmap啟動後就又可以使用了。

5)當服務器端的NFS進程被停止後。

服務器端終止NFS進程

[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/nfs stop

Shutting down NFS mountd: [ OK ]

Shutting down NFS daemon: [ OK ]

Shutting down NFS quotas: [ OK ]

Shutting down NFS services: [ OK ]

[root@CT5_6-32-220-NFS01 ~]# cat /var/lib/nfs/etab

[root@CT5_6-32-220-NFS01 ~]# cat /var/lib/nfs/rmtab

192.168.41.221:/atong:0x00000003

192.168.41.222:/atong:0x00000002

[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/nfs status

rpc.mountd is stopped

nfsd is stopped

rpc.rquotad is stopped

###客戶端立馬就會出現連接不上,因為NFS才是切切相關需要時刻運行的進程。###

[root@CT56-32-222-NFS03 /]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1636028 5728288 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0%

###服務器端重新啟動NFS之後,客戶端就能夠重新掛載。

[root@CT56-32-221-NFS02 ~]# mount -t nfs 192.168.41.220:/atong /atong

[root@CT56-32-221-NFS02 ~]# df

Filesystem 1K-blocks Used Available Use%Mounted on

/dev/sda3 7765136 1634396 5729920 23% /

/dev/sda1 101086 11601 84266 13% /boot

tmpfs 62532 0 62532 0% /dev/shm

192.168.41.220:/atong 7765152 1655360 5708992 23% /oldbo

《NFS的三個進程》

nfsd這個就是nfs的主程序,如果這個被停了,那就表示nfs完全的癱掉不能工作,當然就連接不上了

rpc.mountd 這個屬於管理共享的掛載機制

rpc.quotad 管理共享配額

6)服務器端的portmap被停止。

------理論推導----------------

其實我們故障問題演示進行到這裏已經大概可以知道其實用原理推一下就知道,表現會是什麽。然後可以再用實驗去驗證我們的推論是否正確。

服務器的portmap是關系到NFS的端口註冊,而客戶端只要跟服務器簡歷起來NFS的連接之後就不會再去詢問portmap NFS的端口信息。那現在portmap停掉了,客戶端舊的NFS不會被影響。但是如果要再建立掛載就不行咯。而服務器要創建新的共享目錄也是不能夠成功的,因為新的NFS共享就要去portmap註冊信息。好咯推導完後,以下就來驗證咯:

插播:其實我們應該要學會的就是這樣,理論推導現象的能力。以後要進行故障排除是很重要的能力。至少我自己在網絡方面這麽久就是這樣做的。

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

服務器端停止portmap服務後,原有的nfs共享目錄,操作正常。

[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/portmapstop

Stopping portmap: [ OK ]

[root@CT5_6-32-220-NFS01 ~]# cd /atong/

[root@CT5_6-32-220-NFS01 atong]# ll

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 13:24 nfs2

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs3

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs4

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:39 nfs5

###新的客戶端就不能查看掛載信息,也不能掛載

[root@CT56-32-222-NFS03 ~]# showmount -e192.168.41.220

mount clntudp_create: RPC: Port mapper failure -RPC: Unable to receive

##原有舊的掛載沒問題,但想重新查詢掛載信息也是失敗的。似乎是NFS端口信息溝通過1次就能夠記得住。而如果需要重新掛載新的共享或者去查詢共享,就必須去想服務器的portmap重新去請求,而此時服務器的111端口已經被停掉了。所以更本就無法去請求到新的端口對應數據。

[root@CT56-32-221-NFS02 atong]# showmount -e 192.168.41.220

mount clntudp_create: RPC: Port mapper failure -RPC: Unable to receive

7)服務端portmap重啟或NFS先於portmap之前啟動

------理論推導---------------------------------------------------------------------------

哈哈,再推導一次。portmap重啟,原本的註冊信息沒有了。而且NFS沒有重啟,所以portmap裏面的信息是空的。但是原本舊的NFS掛載已經有了,而且進行建立起來就不會受到影響咯。但是有新的掛載就不行咯。而且服務器要建立一個新的NFS共享也是不行,如果是修改了配置之後reload一下,那是可以創建新的共享的,因為這樣就相當於重新去portmap註冊信息咯。

哈哈,其實這個都是我在寫博文的時候,馬上推的還得看實驗是否正的就是如此呢。

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

[root@CT56-32-221-NFS02 atong]# touch sdfasd

[root@CT56-32-221-NFS02 atong]# ll

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 13:24 nfs2

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs3

-rw-r--r-- 1 nfsnobody nfsnobody 0 May28 14:05 nfs4

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:39 nfs5

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 15:01 nfs6

-rw-r--r-- 1 root root 0 May 28 15:02 nfs7

-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 16:00 sdfasd

-rwxrwxrwx 1 root root 0 May 28 08:14 test1

drwxrwxrwx 2 root root 4096 May 28 08:15 test-dir1

[root@CT56-32-221-NFS02 atong]# showmount -e 192.168.41.220

mountclntudp_create: RPC: Program not registered

#####客戶端原有的共享掛載不會受到影響。但如果要重新掛載或者任何需要與portmap進行通訊的操作,都會提示RPC沒有註冊信息。

[root@CT5_6-32-220-NFS01 atong]# rpcinfo -p --》查看portmap信息,是全新的!符合推導。

programvers proto port

100000 2 tcp 111 portmapper

100000 2 udp 111 portmappe

###此時的portmap只記錄了111這個端口信息。

[root@CT5_6-32-220-NFS01 atong]# /etc/init.d/nfs restart 重新註冊信息

Shutting down NFS mountd: [ OK ]

Shutting down NFS daemon: [ OK ]

Shutting down NFS quotas: [ OK ]

Shutting down NFS services: [ OK ]

Starting NFS services: [ OK ]

Starting NFS quotas: [ OK ]

Starting NFS daemon: [ OK ]

Starting NFS mountd: [ OK ]

[root@CT5_6-32-220-NFS01 atong]# rpcinfo -p

programvers proto port

100000 2 tcp 111 portmapper

100000 2 udp 111 portmapper

100011 1 udp 660 rquotad

100011 2 udp 660 rquotad

100011 1 tcp 663 rquotad

100011 2 tcp 663 rq

###服務器端NFS重新啟動完之後就能夠註冊信息了。

-----------------------------------小結--------------------------------------------------

1)portmap故障

服務端portmap故障:原有已掛載的不會受到任何影響。所有客戶端如果是要掛載本服務器的共享,或者是重新執行已經掛載本服務器的共享的操作(卸載,重新掛載)均會出現錯誤。因為此時還需要去向portmap去請求端口信息。新的掛載或服務端新的共享均出錯。

客戶端portmap故障:原有已掛載的不會受到任何影響。本客戶端如果要重新掛載,卸載任何服務器的共享均會報錯。新的掛載出錯.

2)服務端NFS故障

服務器NFS故障:NFS是提供掛載的主程序,如果出現故障,那麽掛載本服務器的共享的客戶端均會出現故障。主程序都出錯了,結果可想而知嘛。就像車子發動機都不動了,還怎麽開。

3)網絡故障

網絡故障:網絡是提供網絡服務的最基礎條件,如果出現故障,那麽基於網絡以上的服務都會出現故障。

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

NFS優點

1、簡單容易掌握

2、方便快速部署簡單維護容易

3、可靠—從軟件層面上看,數據可靠性高,經久耐用

NFS局限

1、局限性是存在單點故障,如果NFSserver宕機了所有客戶端都不能訪問共享目錄,#####我們可以通過rsync來進行數據的同步。或者是通過負載均衡的高可用方案。######

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

3、服務器共享文件的客戶端認證是基於IP和主機名的安全性一般(但用於內網則問題不大)

4、NFS數據是明文的,對數據完整性不做驗證(一般是存放於內網,提供內網的服務器使用。所以安全性相對不是一個問題)

5、多機器掛載服務器時,連接管理維護麻煩。尤其NFS服務端出問題後,所有客戶端都掛掉狀態(可使用autofs自動掛載解決。)

生產應用場景

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

nfs-rpcbind-portmap掛載nfs-network file system