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 本身的服務並沒有進行身份登入的識別,所以說,當你在用戶端以某个用户名比如 benben(UID:1000) 的身份想要存取伺服器端的檔案系統時,伺服器端會以用戶端的使用者 UID 與 GID 等身份來嘗試讀取伺服器端的檔案系統。
3.1 NFS
server/NFS client 剛好有相同的帳號與群組
若 NFS 伺服器上的
/etc/passwd 裡面 UID 1000 的使用者名稱為 haha 時, 則用戶端的 benben 可以存取伺服器端的 haha 這個使用者的檔案喔!只因為兩者具有相同的 UID 而已。這就造成很大的問題了!因為沒有人可以保證用戶端的 UID 所對應的帳號會與伺服器端相同,那伺服器所提供的資料不就可能會被錯誤的使用者亂改?
另一個極端的情況是,在伺服器端並沒有 1000 這個 UID 的存在,則此時 benben 的身份在該目錄下會被壓縮成匿名者, 一般 NFS 的匿名者會以 UID 為 65534 為其使用者,早期的 Linux distributions 這個 65534 的帳號名稱通常是 nobody ,还有一些distributions則取名為 nfsnobody 。
有個比較特殊的使用者,那就是每個 Linux 主機都有的 UID 為 0 的 root 。 想一想,如果用戶端可以用 root 的身份去存取伺服器端的檔案系統時,那伺服器端的資料哪有什麼保護性?所以在預設的情況下,root 的身份會被主動的壓縮成為匿名者。
總之,用戶端使用者能做的事情是與 UID 及其 GID 有關的,那當用戶端與伺服器端的 UID 及帳號的對應不一致時,可能就會造成檔案系統使用上的困擾,這個就是 NFS 檔案系統在使用上面的一個很重要的地方! 而在瞭解使用者帳號與 UID 及檔案系統的關係之後,要實際在用戶端以 NFS 取用伺服器端的檔案系統時,你還得需要具有:
- NFS 伺服器有開放可寫入的權限 (與 /etc/exports 設定有關);
- 實際的檔案權限具有可寫入 (w) 的權限。
就如同剛剛提的到,我們的 NFS 其實可以被視為一個 RPC 程式,而要啟動任何一個 RPC 程式之前,我們都需要做好 port 的對應 (mapping) 的工作才行,這個工作其實就是『 portmap 』這個服務所負責的!也就是說, 在啟動任何一個 RPC server 之前,我們都需要啟動 portmap 才行!
- /etc/exports
這個檔案就是 NFS 的主要設定檔了!不過,系統並沒有預設值,所以這個檔案『不一定會存在』,您可能必須要使用 vi 主動的建立起這個檔案!
- /usr/sbin/exportfs
這個是維護 NFS 分享資源的指令,我們可以利用這個指令重新分享/etc/exports 變更的目錄資源、將 NFS Server 分享的目錄卸載或重新分享等等,這個指令是 NFS 系統裡面相當重要的一個喔!
- /usr/sbin/showmount
這是另一個重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 則主要用在 Client 端。這個 showmount 可以用來察看 NFS 分享出來的目錄資源喔!
- /var/lib/nfs/*tab
4.3 /etc/exports 設定檔的語法與參數
待续……

