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