** 本文的實驗環(huán)境為 CentOS6.9 **
NFS 是Network File System的縮寫,即網(wǎng)絡(luò)文件系統(tǒng)。功能是通過網(wǎng)絡(luò)讓不同的機(jī)器、不同的操作系統(tǒng)能夠彼此分享文件,讓應(yīng)用程序在客戶端通過網(wǎng)絡(luò)訪問位于服務(wù)器磁盤中的數(shù)據(jù),是在類Unix系統(tǒng)間實現(xiàn)磁盤文件共享的一種方法。
NFS使用RPC協(xié)議進(jìn)行通信,也就是說NFS系統(tǒng)只是一組RPC程序。RPC是遠(yuǎn)程過程調(diào)用 (Remote Procedure Call) 的英文縮寫,它是能使客戶端執(zhí)行其他系統(tǒng)中程序的一種機(jī)制。NFS可以看作是一個RPC Server,主要功能是管理需要分享的目錄和文件。它不負(fù)責(zé)通信和信息傳輸,而是把這部分工作交給RPC協(xié)議來完成。即NFS在文件傳送或信息傳送過程中依賴于RPC協(xié)議。所以只要用到NFS的地方都要啟動RPC服務(wù),不論是NFS SERVER或者NFS CLIENT。這樣SERVER和CLIENT才能通過RPC來實現(xiàn)PROGRAM PORT的對應(yīng)。可以這么理解RPC和NFS的關(guān)系:NFS是一個文件系統(tǒng),而RPC是負(fù)責(zé)負(fù)責(zé)信息的傳輸。
NFS 的基本原則是“容許不同的客戶端及服務(wù)端通過一組RPC分享相同的文件系統(tǒng)”,它是獨(dú)立于操作系統(tǒng),容許不同硬件及操作系統(tǒng)的系統(tǒng)共同進(jìn)行文件的分享。
需要安裝的軟件
啟用NFS服務(wù)器,只需要安裝兩個軟件包nfs-utils 和rpcbind(前身為portmap軟件包)。由于nfs-utils軟件包依賴rpcbind軟件,所以使用yum安裝時只需要yum install -y nfs-utils
一條命令就搞定了。
nfs-utils軟件包中包含了NFS系統(tǒng)中所需要的程序。
rpcbind軟件包是提供RPC服務(wù)器的。
NFS 服務(wù)端進(jìn)程簡介
NFS Server總過需要啟動至少兩個進(jìn)程(rpc.nfsd和rpc.mountd),一個管理Client是否可以登入的問題,另一個管理登入主機(jī)后的用戶是否能夠使用的檔案權(quán)限。nfsd這個進(jìn)程主要在管理客戶端是否能夠登入主機(jī)的權(quán)限,mountd這個進(jìn)程則在管理NFS的檔案系統(tǒng),當(dāng)客戶端順利通過nfsd后,登入到主機(jī)之后,在他使用可以NFS Server分享的檔案之前,還會經(jīng)過檔案使用權(quán)限的認(rèn)證程序!只有通過這一關(guān)之后,Client才能夠使用NFS服務(wù)所分享的檔案。
當(dāng)客戶端嘗試使用RPC Server所提供的服務(wù)時,由于Client需要取得一個可以連接的端口(port)才能夠使用RPC Server所提供的服務(wù),因此,客戶端首先去請求rpcbind,然后,rpcbind將自己管理的端口映射告知客戶端,好讓客戶端可以連接上服務(wù),因此:啟動NFS之前,一定要先啟動rpcbind。示例如下:
service rpcbind start
service nfs start
要使用NFS功能,首先需要rpcbind,將端口告知客戶端;其次需要nfs-utils,提供nfsd進(jìn)程和mountd這兩個NFS進(jìn)程。
對配置文件 /etc/exports 的說明
/etc/exports 中記錄的是NFS服務(wù)端對目錄分享的配置信息。配置信息格式如下:
## $share_path $host($permission)
/var/test *(rw)
配置信息中 $share_path 是要分享出去的目錄,$host 是允許訪問的主機(jī),$permission 是分享出去的權(quán)限。對于“要分享出去的目錄”沒有什么好說明的,下面分小節(jié)對$host和$permission進(jìn)行說明。
針對NFS中幾個主要文件的說明
- /etc/exports NFS服務(wù)端對分享目錄的配置文件
- etc/exports.d NFS服務(wù)端對分享目錄配置文件的擴(kuò)展目錄,值得注意的是:只有擴(kuò)展名為.exports的文件會被NFS讀取并應(yīng)用,其他文件都會被忽略。
- /var/lib/nfs/etab NFS對外分享目錄的主配置文件,它是由exportfs命令維護(hù)的,其信息與NFS內(nèi)核中的配置信息保持同步。注:請不要手動編輯該文件。
- /var/lib/nfs/rmtab 客戶端訪問的目錄列表,由NFS系統(tǒng)維護(hù),請不要手動編輯。
允許訪問的主機(jī)
設(shè)置允許訪問的主機(jī)有多種方式:
- 指定主機(jī)ip,如:192.168.31.49
- 指定一個子網(wǎng)中的主機(jī)能都訪問:192.168.0.0/24 或者 192.168.0.1/255.255.255.0
- 指定主機(jī)的域名:www.ibestcode.com
- 指定一個域內(nèi)的所有主機(jī)都能訪問:*.ibestcode.com
- 指定所有主機(jī)都能訪問:*
- 更詳細(xì)的內(nèi)容還是查 man 手冊吧。上面寫的并不完整。
分享目錄的權(quán)限
配置信息中的$permission可以是以下內(nèi)容中的一種或多種,需要注意的是有些權(quán)限在邏輯上是互斥的。
- rw:可讀可寫的權(quán)限
- ro:只讀的權(quán)限
- no_root_squash:登入分享目錄的使用者如果是root的話,那么對于這個分享的目錄來說,他就具有root的權(quán)限!這一項不安全,不建議使用!
- root_squash:登入分享目錄的使用者如果是root的話,那么這個使用者的權(quán)限將被壓縮成匿名使用者,通常他的UID與GID都會變成nobody那個系統(tǒng)賬號的身份。
- all_squash:不論登入分享目錄的使用者是什么身份,都會被壓縮成匿名使用者。
- anonuid:可以自行設(shè)定使用者UID的值!也就是使用者登錄到分享目錄中,身份成為UID這個使用者,必須在/etc/passwd中存在這個UID。
- anongid:可以自行設(shè)定使用者GID的值!也就是使用者登錄到分享目錄中,身份成為GID這個使用者,必須在/etc/group中存在這個GID。
- sync:數(shù)據(jù)同步寫入到內(nèi)存與硬盤當(dāng)中
- async:數(shù)據(jù)會先暫存于內(nèi)存當(dāng)中,而非直接寫入硬盤
- 還有其他很多內(nèi)容,可以查 man 手冊獲取。
服務(wù)器端對分享目錄的管理命令
服務(wù)器端的配置文件 /etc/exports 改變后,不需要重啟nfs服務(wù),只需要使用exportfs命令重新描述一遍/etc/exports 就可使新的配置生效。
exportfs 指令
這個指令是用來維護(hù) NFS 文件系統(tǒng)中的配置表的。有以下可用選項:
- -a : 掛載或卸載/etc/exports配置文件中的全部配置。
- -r : 從/etc/exports重新掛載所有配置,根據(jù)/etc/exports 和 /etc/exports.d下的文件重置/var/lib/nfs/etab。這個選項會根據(jù)“/etc/exports” 和 “/etc/exports.d 下的文件”的內(nèi)容刪除/var/lib/nfs/etab中實體,并同時從NFS內(nèi)核中刪除這此實體,使他們不再生效。
- -u: 卸載一個或一組目錄:
exportfs -u 192.168.31.0/24:/root/tmp
- -i: 忽略/etc/exports 和/etc/exports.d 下文件配置文件中的所有配置,只使用默認(rèn)選項和命令行中給出的選項對NFS中的配置表進(jìn)行更新。
- -0: 掛載一個目錄,分享給其他主機(jī)訪問:
exportfs -o rw 192.168.31.0/24:/root/tmp
- -v: 顯示命令執(zhí)行過程中的詳細(xì)信息
- 了解更多更詳細(xì)內(nèi)容請參見 man 手冊。
showmount 指令
這個指令用于在服務(wù)器端查看NFS文件系統(tǒng)分享的目錄信息和客戶端掛載的情況。
- -a , --all : 顯示所有客戶端已經(jīng)掛載的目錄,格式為:host:dir。
- -e , --exports : 顯示當(dāng)前主機(jī)分享出去的所有目錄。
- -d , --directories : 列出指定目錄被客戶端掛載的情況。
- -v , --version : 顯示程序的版本信息
- -h , --help : 顯示幫助信息
客戶端掛載和卸載目錄
客戶端掛載目錄使用 mount 指令: mount -t nfs $host:$sdir $ddir
客戶端卸載目錄使用umount指令:umount $ddir
關(guān)于mount和umount命令的詳細(xì)信息不在本文的介紹范圍,如有需求可以去查man手冊。
客戶端如需要設(shè)置開機(jī)自動掛載NFS。則需要在/etc/fstab 中加入如下配置。
$host:$sdir $ddir nfs defaults 0 0
有關(guān)/etc/fstab配置文件的詳細(xì)信息也不在此文的介紹范圍,你同樣可以查man手冊了解詳情。指令如下:
man fstab
其他內(nèi)容
關(guān)于如何在NFS服務(wù)器上設(shè)置開機(jī)自動啟動nfs服務(wù),也請自行man手冊吧,指令如下:
man chkconfig
當(dāng)有客戶端鏈接了NFS時,由于使用了RPC協(xié)議,NFS服務(wù)器端關(guān)機(jī)時可能會導(dǎo)致一些意想不到的錯誤發(fā)生。在NFS關(guān)機(jī)前可以先關(guān)閉nfs和rpcbind這兩個服務(wù),在關(guān)閉服務(wù)時服務(wù)器會與客戶協(xié)商,可以避免不必要的錯誤發(fā)生。
此外,本文沒有考慮開啟iptables 和 selinux 的情況。如果你在開發(fā)這兩個服務(wù)時部署nfs,還需要使用iptables 在服務(wù)器上打通nfs需要的端口,以及對分享出去的目錄配置selinux策略。