NFS (Network File System) 即網絡文件系統。一種使用於分散式文件系統的協定,功能是通過網絡讓不同的機器、不同的操作系統能夠彼此分享個別的數據,讓應用程序在客戶端通過網絡訪問位於服務器磁盤中的數據,是在類Unix系統間實現磁盤文件共享的一種方法。
NFS 的基本原則是“容許不同的客戶端及服務端通過一組RPC分享相同的文件系統”,它是獨立於操作系統,容許不同硬件及操作系統的系統共同進行文件的分享。
NFS在文件傳送或信息傳送過程中依賴於RPC協議。RPC,遠程過程調用 (Remote Procedure Call) 是能使客戶端執行其他系統中程序的一種機制。NFS本身是沒有提供信息傳輸的協議和功能的,但NFS卻能讓我們通過網絡進行資料的分享,這是因為NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。可以說NFS本身就是使用RPC的一個程序。或者說NFS也是一個RPC SERVER。所以只要用到NFS的地方都要啟動RPC服務,不論是NFS SERVER或者NFS CLIENT。這樣SERVER和CLIENT才能通過RPC來實現PROGRAM PORT的對應。可以這么理解RPC和NFS的關系:NFS是一個文件系統,而RPC是負責負責信息的傳輸。
當服務器在啟動NFS時會隨機選用數個端口,並主動地向RPC注冊。因此RPC可以知道每個端口對應的NFS功能。然后RPC固定使用端口111來監聽客戶端的請求並回報客戶端正確的端口,所以可以讓NFS的啟動更為容易。注意,啟動NFS之前,要先啟動RPC;否則NFS會無法向RPC注冊。另外,重新啟動RPC時原本注冊的數據會不見,因此RPC重新啟動后它管理的所有程序都需要重新啟動以重新向RPC注冊。
當客戶端有NFS文件要存取請求時,它如何向服務器端要求數據?
(1)客戶端會向服務器端的RPC(port 111)發出NFS文件存取功能的詢問請求。
(2)服務器端找到對應的已注冊的NFS daemon端口后會回報給客戶端。
(3)客戶端了解正確的端口后,就可以直接與NFS守護進程來聯機。
其中,NFS服務器設定分享出來的/share/portalone(可以是其他目錄)這個目錄后,一般將該目錄掛在磁陣(磁盤陣列——將多個硬盤整合在一起當做一個存儲硬盤)上,其他的客戶端就可以將這個目錄掛載到自己系統上的/home/portalone/pnfs掛載點(掛載點可以自定),只要在PC1系統中進入/home/portalone/pnfs目錄內,就可以看到NFS服務器系統內的share/portalone目錄下的所有數據(要有相應的權限),share/portalone就好像自己PC中的一個分區(但不占用磁盤空間)。用戶可以使用cp、cd、 mv、rm等磁盤或文件相關的指令進行操作。雖然NFS有屬於自己的協議和端口號,但是在傳送數據或其他相關信息時,NFS使用的是遠程過程調用(Remote Procedure Call,RPC)協議來協助NFS本身的運作。RPC即遠程進程調用。當使用某些服務來進行遠程聯機的時候,主機的IP地址、服務的端口號及對應到的服務PID等信息都需要管理與對應,管理端口的對應與服務相關性的工作就是RPC的任務。
NFS本身的服務並沒有提供數據傳遞的協議,因此,NFS使用RPC來實現網絡傳輸功能。NFS本身就是一個使用RPC的程序,換句話說,NFS是RPC服務器。當然,不但運行NFS的服務器需要啟動RPC的服務,要掛載NFS文件系統的客戶端,也需要同步啟動RPC,這樣服務器端與客戶端才能由RPC的協議進程序端口的對應,Linux系統默認時啟動這一服務。
NFS的安裝是非常簡單的,只需要兩個軟件包即可,而且在通常情況下,是作為系統的默認包安裝的。
- nfs-utils-* :包括基本的NFS命令與監控程序
- portmap-* :支持安全NFS RPC服務的連接
配置文件每行分為兩段:
vi /etc/exports
第一段為共享的目錄,使用絕對路徑;
第二段為客戶端地址及權限。
地址可以使用完整IP或網段,例如10.0.0.8或10.0.0.0/24,10.0.0.0/255.255.255.0當然也可以地址可以使用主機名,DNS解析的和本地/etc/hosts解析的都行,支持通配符,例如:*.chengyongxu.com
權限有:
rw:read-write,可讀寫注意,僅僅這里設置成讀寫客戶端還是不能正常寫入,還要正確地設置共享目錄的權限
ro:read-only,只讀;
sync:文件同時寫入硬盤和內存;
async:文件暫存於內存,而不是直接寫入內存;
no_root_squash:NFS客戶端連接服務端時如果使用的是root的話,那么對服務端分享的目錄來說,也擁有root權限。顯然開啟這項是不安全的。
root_squash:NFS客戶端連接服務端時如果使用的是root的話,那么對服務端分享的目錄來說,擁有匿名用戶權限,通常他將使用nobody或nfsnobody身份;
all_squash:不論NFS客戶端連接服務端時使用什么用戶,對服務端分享的目錄來說都是擁有匿名用戶權限;
anonuid:匿名用戶的UID值,通常是nobody或nfsnobody,可以在此處自行設定;
anongid:匿名用戶的GID值。
我用的是(類似白名單):
vi /etc/exports
/share/portalone 192.168.11.*(rw)
2、設置NFS服務器的自動啟動狀態
對於實際的應用系統,每次啟動LINUX系統后都手工啟動nfs服務器是不現實的,需要設置系統在指定的運行級別自動啟動portmap和nfs服務。
# chkconfig --list portmap
# chkconfig --list nfs
3、設置portmap和nfs服務在系統運行級別3和5自動啟動。
# chkconfig --level 35 portmap on
# chkconfig --level 35 nfs on
NFS系統守護進程
- nfsd:它是基本的NFS守護進程,主要功能是管理客戶端是否能夠登錄服務器;
- mountd:它是RPC安裝守護進程,主要功能是管理NFS的文件系統。當客戶端順利通過nfsd登錄NFS服務器后,在使用NFS服務所提供的文件前,還必須通過文件使用權限的驗證。它會讀取NFS的配置文件/etc/exports來對比客戶端權限。
- portmap:主要功能是進行端口映射工作。當客戶端嘗試連接並使用RPC服務器提供的服務(如NFS服務)時,portmap會將所管理的與服務對應的端口提供給客戶端,從而使客戶可以通過該端口向服務器請求服務。
NFS服務器的啟動與停止
在對exports文件進行了正確的配置后,就可以啟動NFS服務器了。
service rpcbind start
service nfs start
重啟portmap 和nfs 服務
service portmap restart
service nfs restart
exportfs
這樣一來,NFS服務器就搭建好了,如果需要一個客戶端來共享他的目錄,需要在客戶端執行這樣的命令:
mount 192.168.11.210:/share/portalone /home/portalone/pnfs
就相當於把192.168.11.210(NFS服務器)的share/portalone掛載到 /home/portalone/pnfs目錄上,實現了文件共享。
取消mount: umount /share/portalone