NFS及RPC講解

NFS(Network File System)即網絡文件系統,由Sun公司開發,於1984年向外公佈。功能是經過網絡讓不一樣的機器、不一樣的操做系統可以彼此分享個別的數據,讓應用程序在客戶端經過網絡訪問位於服務器磁盤中的數據,是在類Unix系統間實現磁盤文件共享的一種方法。

NFS服務簡介linux

同時也是一種網絡協議,NFS依賴RPC才能工做。(RHEL5.0上是NFS V3而RHEL6.0上是NFS V4)編程

NFS 的基本原則是「允許不一樣的客戶端及服務端經過一組RPC分享相同的文件系統」,它是獨立於操做系統,允許不一樣硬件及操做系統的系統共同進行文件的分享。vim

NFS在文件傳送或信息傳送過程當中依賴於RPC協議。RPC,遠程過程調用 (Remote Procedure Call) 是能使客戶端執行其餘系統中程序的一種機制。NFS自己是沒有提供信息傳輸的協議和功能的,但NFS卻能讓咱們經過網絡進行資料的分享,這是由於NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。能夠這麼理解RPC和NFS的關係:NFS是一個文件系統,而RPC是負責負責信息的傳輸。安全

RPC協議介紹服務器

RPC(Remote Procedure Call)遠程過程調用,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。其工做在TCP/UDP的111端口。創建在Socket之上的,主要是簡化編程的工做在底層提供網絡之間的通訊。網絡

RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息的到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。app

Linux6中實現RPC協議的軟件是RPCbind程序包,進程名稱是portmapper。RPC並不提供任何具體的服務,要想提供具體的服務就必須在Linux上提供具體的軟件。而網絡文件系統(NFS)就是基於RPC協議工做的,如NFS客戶端——-Portmap客戶端——Portmap服務端——NFS服務端。如圖是RPC的工做原理:async

NFS及RPC講解NFS及RPC講解

NFS V4相關進程tcp

$ rpcinfo

mountd

負責客戶端來源認證的進程,認證成功後接受客戶端的掛載請求,工做在隨機端口,即時向RPC註冊。

nfs

負責文件讀寫,工做在TCP/UDP的2049端口。

quotad

負責限定客戶端在本地能使用多大磁盤空間,工做在隨機端口,即時向RPC註冊。

idmapd

負責用戶ID映射。

nlockmgr

NFS的服務器端鎖機制進程,當有一個客戶端進程要訪問服務器端處理文件以前就會先向NFS註冊加鎖,以避免同時兩個客戶端進程同時處理一個文件致使文件崩潰;一個進程處理完成以後就會通知NFS釋放鎖。

NIS服務介紹ide

NIS(network information service)網絡信息服務,也是SUN公司開發的統一認證服務器,而且SUN也有商業版的NIS+。NIS自己十分不安全,也沒法完成安全用戶認證,它只可以幫助用戶認證而且可以把帳號密碼集中存放起來,相似於Windows的AD域。在使用中更多的是使用NIS結合kerberos來完成安全認證或只使用kerberos完成安全認證。而在大規模NFS環境中會用到LDAP協議,它可以實現大規模的安全統一認證,而且可以基於SSL,還可以實現多主模型,高可能集羣等等。而Windows的AD域就是使用的LADP協議。

何時會須要統一認證服務器呢,就須要先了解NFS的權限問題?

NFS服務器端目前只能基於主機認證客戶端的來源,而不能基於用戶名進行驗證。那麼在安全性上就大大減弱了。若是NFS客戶端掛載服務器端以後以tom的用戶建立一個文件而在NFS服務器端沒有tom用戶那麼這個文件就會顯示tom的ID號,剛好此ID號正好是NFS服務器端的Jerry用戶那麼此文件的屬主就會是jerry了。所以因爲root用戶的UID都是0,因此默認NFS客戶端Root都被映射爲來賓帳號,否則客戶端均可以以本地Root的權限來操做NFS服務器了。

爲了解決這個問題,就可使用NIS集中式認證。也就是說另外再找一臺服務器作NIS認證,那麼當NFS客戶端登錄時必需要先到認證服務器確認用戶名和密碼。登錄成功後建立文件時就會以當前用戶爲準,而NFS服務器端解析此文件的用戶ID時就會到認證服務器去請求解析。這樣一來就不會出現文件權限的詭異了。

NFS實踐

NFS及RPC講解NFS及RPC講解

安裝rpcbind

屬於RPC的服務器端,默認已安裝。

$ rpm -q rpcbind
rpcbind-0.2.0-11.el6.x86_64

安裝nfs-utils

nfs-utils是NFS的服務器端管理工具(NFS是內核模塊),不光服務端須要,客戶端也須要安裝,否則沒法掛載成功。

$ yum install nfs-utils

# CentOS 6啓動方式;
$ service nfs restart
$ chkconfig nfs on

# CentOS 7啓動方式;
$ systemctl enable nfs.service
$ systemctl start nfs.service

編輯NFS配置文件

$ cat /etc/sysconfig/nfs
# mound進程設置固定端口;
MOUNTD_PORT=892

# quotad進程設置固定端口;
RQUOTAD_PORT=875

# lockd進程設置固定端口;
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769

PS:以上進程都是RPC提供的,在啓動時要向RPC註冊監聽在某端口上,RPC會從未使用的端口中隨機挑選一個給此進程,而設置固定端口以避免隨機端口占用到服務端口。

導出NFS共享目錄

# 建立用戶;
$ useradd -u 1000 test

# 建立共享目錄;
$ mkdir /share

# 給共享目錄設置test用戶權限;
$ setfacl -m u:test:rwx /share

$ cat /etc/exports
/share       172.168.0.0/16(rw,async)

NFS服務的配置文件爲/etc/exports,這個文件是NFS的主要配置文件,不過系統並無默認值,因此這個文件不必定會存在,可能要使用vim手動創建,而後在文件裏面寫入配置內容。

/etc/exports文件內容格式,以下:

< 輸出目錄> [客戶端1 選項(訪問權限,用戶映射,其餘)] [客戶端2 選項(訪問權限,用戶映射,其餘)]
輸出目錄:輸出目錄是指NFS系統中須要共享給客戶機使用的目錄,如/share。

客戶端:客戶端是指網絡中能夠訪問這個NFS輸出目錄的計算機,如172.168.10.0/16。

選項:選項用來設置輸出目錄的訪問權限、用戶映射等。

A)訪問權限

ro:設置輸出目錄只讀。

rw:設置輸出目錄讀寫。

B)用戶映射

root_squash:將root用戶映射爲來賓帳號(nfsnoboydy用戶),默認啓用。

no_root_squash:不映射客戶端root帳號爲來賓帳號,也就意味着客戶端root具備服務端root的用戶權限。

all_squash:將遠程訪問的全部普通用戶及所屬組都映射爲匿名用戶或用戶組(nfsnobody)。

no_all_squash:與all_squash取反(默認設置);

anonuid=501:指定映射的帳號UID。

anongid=501:指定映射的帳號GID。

C)其餘

secure:限制客戶端只能從小於1024的tcp/ip端口鏈接nfs服務器(默認設置)。

insecure:容許客戶端從大於1024的tcp/ip端口鏈接服務器。

sync:將數據同步寫入內存緩衝區與磁盤中,效率低,但能夠保證數據的一致性。

async:將數據先保存在內存緩衝區中,必要時才寫入磁盤,默認使用。

wdelay:檢查是否有相關的寫操做,若是有則將這些寫操做一塊兒執行,這樣能夠提升效率(默認設置)。

no_wdelay:如有寫操做則當即執行,應與sync配合使用。

subtree:若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置)。

no_subtree:即便輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣能夠提升效率。

NFS客戶端掛載共享目錄

客戶端首先也要安裝nfs-utils,否則沒法識別nfs文件系統。

$ yum install nfs-utils

而後掛載共享目錄。

$ mount -t nfs -o soft 172.168.10.100:/share /mnt

這裏若是使用root用戶來建立文件,是沒有權限建立的,一是由於root在此被映射爲nfsnobody了,二是由於/share只開放給了test用戶。

$ touch /mnt/test.txt
touch: cannot touch `/mnt/test.txt': Permission denied

建立用戶

$ useradd -u 1000 test

切換到test用戶

$ su - test
$ touch /mnt/test.txt 
$ ll /mnt/ 
-rw-rw-r--. 1 test test 0 Mar 31  2015 test.txt

建立測試文件,若是NFS服務器端不給/share設置test容許寫入,那麼在客戶端上的test用戶就沒有寫入權限,由於在客戶端只是執行命令而真正要建立文件仍是服務器端以本地test用戶的權限來建立文件。另外若是兩個服務器上的test用戶ID號不一樣也不能建立文件。

$ cat /etc/fstab
172.168.10.100: /share  /mnt   nfs   defaults,_rnetdev  0 0

_rnetdev表示系統啓動時若是掛載不到NFS就跳過,默認掛載不到系統啓動不了。

NFS命令

服務器端相關命令

# 查看RPC相關進程;
$ rpcinfo

# 查看導出的文件系統;
$ exportfs

# 從新導出全部文件系統;
$ exportfs -a -r

# 取消導出全部文件系統;
$ exportfs -a -u

# 查看NFS服務器全部被掛載的文件系統;
$ showmount -a 172.168.10.100

客戶端相關命令
查看NFS服務器導出的全部文件系統;

$ showmount -e 172.168.10.100
NFS有不少默認的參數,打開/var/lib/nfs/etab查看分享出來的/share完整權限設定值。

$ cat /var/lib/nfs/etab
/share192.168.60.0/24(rw,async,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,
no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)

NFS故障處理

NFS客戶端卡死問題

在客戶端df -h的時候系統直接就卡住了,umount -f /mnt提示device is busy,而且嘗試訪問掛載目錄、ctrl+c也不能強行退出。形成這種現象的緣由是nfs服務器/網絡掛了,NFS客戶端還存在,nfs客戶端掛載默認採用hard-mount選項,而不是soft-mount。他們的區別是:

soft-mount: 當客戶端加載NFS不成功時,重試retrans設定的次數,若是retrans次都不成功,則放棄此操做,返回錯誤信息 「Connect time out」

hard-mount: 當客戶端加載NFS不成功時,一直重試,直到NFS服務器有響應。因此就會出現客戶端卡死問題。

hard-mount是系統的缺省值,在選定hard-mount時,最好同時選intr , 容許中斷系統的調用請求,避免引發系統的掛起。當NFS服務器不能響應NFS客戶端的hard-mount請求時,NFS客戶端會顯示」NFS server hostname not responding, still trying」。

下面列出mount關於nfs相關的參數:

-a:把/etc/fstab中列出的路徑所有掛載。

-t:須要mount的類型,如nfs等。

-r:將mount的路徑定爲read only。

-v mount:過程的每個操做都有message傳回到屏幕上。

-o rsize=n:在NFS服務器讀取文件時NFS使用的字節數,默認值是4096個字節。

-o wsize=n:向NFS服務器寫文件時NFS使用的字節數,默認值是4096個字節。

-o timeo=n:從超時後到第1次從新傳送佔用的1/7秒的數目,默認值是7/7秒。

-o retry=n:在放棄後臺mount操做以前能夠嘗試的次數,默認值是7000次。

-o soft:使用軟掛載的方式掛載系統,若Client的請求得不到迴應,則從新請求並傳回錯誤信息。

-o hard:使用硬掛載的方式掛載系統,該值是默認值,重複請求直到NFS服務器迴應。

-o intr:容許NFS中斷文件操做和向調用它的程序返回值,默認不容許文件操做被中斷。

fg:一直在提示符下執行重複掛載。

bg:若是第1次掛載文件系統失敗,繼續在後臺嘗試執行掛載,默認值是失敗後不在後臺處理。

tcp:對文件系統的掛載使用TCP,而不是默認的UDP。

如:mount -t nfs -o soft -o intr -o retry=10 192.168.1.2:/home/nfs /mnt

NFS客戶端沒法啓動

形成NFS客戶端沒法啓動的緣由也是因爲nfs服務器/網絡掛了,客戶端在系統啓動時一直去鏈接NFS服務端,可是一直鏈接不上,就一直卡死在哪裏啓動不了。一樣解決方式使用soft-mount方式掛載NFS。

相關文章
相關標籤/搜索