一、NFS相关基本概念:
1 NFS
NFS就是Network File System的縮寫,最早之前是由SUN公司所發展出來的。他最大的功能就是可以透過网络,讓不同的機器、不同的作業系統、可以分享彼此的檔案
(share files)。所以,您也可以簡單的將他看做是一個檔案伺服器(file server)!這個 NFS 伺服器可以讓您的PC來將网络遠端的NFS主機分享的目錄,掛載到本地端的機器當中,在本地端的機器看起來,那個遠端主機的目錄就好像是自己的一個磁盘分区一樣(partition)。
2 RPC (Remote Procedure Call)
因為 NFS 支援的功能相當的多,而不同的功能都會使用不同的程式來啟動,每啟動一個功能就會啟用一些port來傳輸資料,因此,NFS 的功能所對應的port才沒有固定住,而是採用隨機取用一些未被使用的小於1024的端口來作為傳輸之用。但如此一來又造成用戶端想要連上伺服器時的困擾,
因為用戶端得要知道伺服器端的相關端口才能夠連線吧!
此時我們就得需要遠端程序呼叫(RPC)的服務啦!RPC最主要的功能就是在指定每個 NFS功能所對應的port number,並且回報給用戶端,讓用戶端可以連結到正確的端口上去。
那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當伺服器在啟動 NFS 時會隨機取用數個端口,並主動的向 RPC 註冊,因此 RPC 可以知道每個端口對應的 NFS 功能,RPC 又是固定使用 port 111 來監聽用戶端的需求並回報用戶端正確的端口的。
二、NFS 啟動的 RPC daemons
rpc.nfsd:這個 daemon 主要的功能就是在管理 Client 是否能夠登入主機的權限,其中還包含這個登入者的 ID 的判別!
rpc.mountd:這個 daemon 主要的功能,則是在管理 NFS 的檔案系統!當 Client 端順利的通過 rpc.nfsd 而登入主機之後,在他可以使用 NFS 伺服器提供的檔案之前,還會經過檔案使用權限 (就是那個 -rwxrwxrwx 與 owner, group 那幾個權限啦) 的認證程序!他會去讀 NFS 的設定檔 /etc/exports 來比對 Client 的權限,當通過這一關之後 Client 就可以取得使用 NFS 檔案的權限!
rpc.lockd (非必要):這個daemon可以用在管理檔案的鎖定 (lock) 用途。為何檔案需要『鎖定』呢? 因為既然分享的 NFS 檔案可以讓用戶端使用,那麼當多個用戶端同時嘗試寫入某個檔案時, 就可能對於該檔案造成一些問題!這個 rpc.lockd 則可以用來克服這個問題。但 rpc.lockd 必須要同時在用戶端與伺服器端都開啟才行喔!此外,rpc.lockd 也常與 rpc.statd 同時啟用。
rpc.statd (非必要):可以用來檢查檔案的一致性,與 rpc.lockd 有關!若發生因為用戶端同時使用同一檔案造成檔案可能有所損毀時,rpc.statd 可以用來檢測並嘗試回復該檔案。與 rpc.lockd 同樣的,這個功能必須要在伺服器端與用戶端都啟動才會生效。
三、NFS 的檔案存取權限
NFS 本身的服務並沒有進行身份登入的識別,所以說,當你在用戶端以某个用户名比如 benben(UID:1000)
的身份想要存取伺服器端的檔案系統時,伺服器端會以用戶端的使用者 UID 與 GID 等身份來嘗試讀取伺服器端的檔案系統。
3.1 NFS
server/NFS client 剛好有相同的帳號與群組
則此時使用者可以直接以 benben 的身份進行伺服器所提供的檔案系統之存取。
3.2 NFS server 的 1000 這個 UID 帳號對應為 haha
若 NFS 伺服器上的
/etc/passwd 裡面 UID 1000 的使用者名稱為 haha 時, 則用戶端的 benben 可以存取伺服器端的 haha 這個使用者的檔案喔!只因為兩者具有相同的 UID 而已。這就造成很大的問題了!因為沒有人可以保證用戶端的 UID 所對應的帳號會與伺服器端相同,那伺服器所提供的資料不就可能會被錯誤的使用者亂改?
3.3 NFS server 並沒有 501 這個 UID
另一個極端的情況是,在伺服器端並沒有 1000 這個
UID 的存在,則此時 benben 的身份在該目錄下會被壓縮成匿名者, 一般 NFS 的匿名者會以 UID 為 65534 為其使用者,早期的 Linux distributions 這個 65534 的帳號名稱通常是 nobody ,还有一些distributions則取名為 nfsnobody 。
3.4 如果使用者身份是 root
有個比較特殊的使用者,那就是每個 Linux 主機都有的
UID 為 0 的 root 。 想一想,如果用戶端可以用 root 的身份去存取伺服器端的檔案系統時,那伺服器端的資料哪有什麼保護性?所以在預設的情況下,root 的身份會被主動的壓縮成為匿名者。
總之,用戶端使用者能做的事情是與 UID 及其 GID 有關的,那當用戶端與伺服器端的 UID 及帳號的對應不一致時,可能就會造成檔案系統使用上的困擾,這個就是 NFS 檔案系統在使用上面的一個很重要的地方!
而在瞭解使用者帳號與 UID 及檔案系統的關係之後,要實際在用戶端以 NFS
取用伺服器端的檔案系統時,你還得需要具有:
- NFS 伺服器有開放可寫入的權限 (與 /etc/exports
設定有關);
- 實際的檔案權限具有可寫入 (w) 的權限。
當你滿足了:(1)使用者帳號,亦即 UID 的相關身份;(2)NFS 伺服器允許有寫入的權限; (3)檔案系統確實具有 w 的權限時,你才具有該檔案的可寫入權限。尤其是身份 (UID) 確認的環節部分,最容易搞錯啦!也因為如此,
所以 NFS 通常需要與 NIS 這一個可以確認用戶端與伺服器端身份一致的服務搭配使用,以避免身份的錯亂!
四、NFS Server 端的設定
4.1 套件的安装
CentOS:
NFS 主程式:nfs-utils
RPC
主程式:portmap
portmap
就如同剛剛提的到,我們的 NFS
其實可以被視為一個 RPC 程式,而要啟動任何一個 RPC 程式之前,我們都需要做好 port 的對應 (mapping) 的工作才行,這個工作其實就是『 portmap 』這個服務所負責的!也就是說, 在啟動任何一個 RPC server 之前,我們都需要啟動 portmap 才行!
nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 這兩個 NFS daemons 與其他相關 documents 與說明文件、執行檔等的套件!這個就是 NFS 的主要套件!
4.2 NFS 的套件結構
- /etc/exports
這個檔案就是 NFS 的主要設定檔了!不過,系統並沒有預設值,所以這個檔案『不一定會存在』,您可能必須要使用 vi 主動的建立起這個檔案!
- /usr/sbin/exportfs
這個是維護 NFS 分享資源的指令,我們可以利用這個指令重新分享/etc/exports 變更的目錄資源、將 NFS Server 分享的目錄卸載或重新分享等等,這個指令是 NFS 系統裡面相當重要的一個喔!
- /usr/sbin/showmount
這是另一個重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 則主要用在 Client 端。這個 showmount 可以用來察看 NFS 分享出來的目錄資源喔!
在 NFS 伺服器的登錄檔都放置到 /var/lib/nfs/ 目錄裡面,在該目錄下有兩 個比較重要的登錄檔,
一個是 etab,主要記錄了 NFS 所分享出來的目錄的 完整權限設定值;另一個 xtab 則記錄曾經連結到此 NFS 主機的相關用戶端 資料。
4.3 /etc/exports 設定檔的語法與參數
待续……