PS:哈哈,這篇的篇幅真的很是的長。要看完真的要有很強的耐心那。我本身寫也快寫吐了呢。css
[ATong學習linux]NFS原理詳解html
1、NFS介紹node
1)什麼是NFSlinux
它的主要功能是經過網絡讓不一樣的機器系統之間能夠彼此共享文件和目錄。NFS服務器能夠容許NFS客戶端將遠端NFS服務器端的共享目錄掛載到本地的NFS客戶端中。在本地的NFS客戶端的機器看來,NFS服務器端共享的目錄就好像本身的磁盤分區和目錄同樣。通常客戶端掛載到本地目錄的名字能夠隨便,但爲方便管理,咱們要和服務器端同樣比較好。windows
NFS通常用來存儲共享視頻,圖片等靜態數據。安全
《什麼是NFS》bash
就是經過網絡共享目錄,讓網絡上的其餘服務器可以掛載訪問共享目錄內的數據。(通常共享視頻,圖片等靜態數據)服務器
這個再往簡單點,就至關於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的端口是隨機獲取的。
----------------------------------------------------------------------------------------
2、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軟件包》
一、nfs-utils:NFS的主程序,包含rpc.nfsd rpc.mount兩個deamons
二、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...
一、nfsd(rpc.conf)
這個daemon的主要功能就是管理client端是否可以登入主機,其中還包含登入者的ID判別。
二、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
3、配置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而已。 |
提示:
一、另外能夠經過man exports查閱exports參數說明。
二、當咱們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這兩個文件就可以查看服務器上共享了什麼目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。
一、etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可使用,而且設定的參數爲什麼。
二、rmtab這個文件就是可以查看到共享目錄被掛載的狀況。
4、NFS配置實例
實例一、共享/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的開機自動掛載
有兩種方式實現開機自動掛載一、將mount命令寫在rc.local文件中。二、在/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優勢
一、簡單容易掌握
二、方便快速部署簡單維護容易
三、可靠—從軟件層面上看,數據可靠性高,經久耐用
NFS侷限
一、侷限性是存在單點故障,若是NFSserver宕機了全部客戶端都不能訪問共享目錄,#####咱們能夠經過rsync來進行數據的同步。或者是經過負載均衡的高可用方案。######
二、在高併發的場合,NFS效率性能有限(通常幾千萬如下pv的網站不是瓶頸,除非網站架構太差。)
三、服務器共享文件的客戶端認證是基於IP和主機名的安全性通常(但用於內網則問題不大)
四、NFS數據是明文的,對數據完整性不作驗證(通常是存放於內網,提供內網的服務器使用。因此安全性相對不是一個問題)
五、多機器掛載服務器時,鏈接管理維護麻煩。尤爲NFS服務端出問題後,全部客戶端都掛掉狀態(可以使用autofs自動掛載解決。)
生產應用場景
中小型網站(2000萬pv如下)線上應用,都有用武之地。門戶網站也會有其餘方面的應用,。由於門戶網站的併發量是超級的大。因此有更加會用專業的存儲來作這件事情。