NFS及RPC講解


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

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

NFS 的基本原則是“容許不同的客戶端及服務端通過一組RPC分享相同的文件系統”,它是獨立於操作系統,容許不同硬件及操作系統的系統共同進行文件的分享。

NFS在文件傳送或信息傳送過程中依賴於RPC協議。RPC,遠程過程調用 (Remote Procedure Call) 是能使客戶端執行其他系統中程序的一種機制。NFS本身是沒有提供信息傳輸的協議和功能的,但NFS卻能讓我們通過網絡進行資料的分享,這是因為NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。可以這么理解RPC和NFS的關系:NFS是一個文件系統,而RPC是負責負責信息的傳輸。

RPC協議介紹

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

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

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

NFS及RPC講解NFS及RPC講解

NFS V4相關進程
$ rpcinfo

mountd

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

nfs

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

quotad

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

idmapd

負責用戶ID映射。

nlockmgr

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

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。

 

本文轉自:https://www.linuxprobe.com/nfs-rpc.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM