當前位置:
首頁 > 知識 > NFS及RPC講解

NFS及RPC講解

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 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實踐

安裝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。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 尤沐西子 的精彩文章:

linux需要你的不懈努力

TAG:尤沐西子 |