一、NFS服務概述
NFS(Network File System),即網絡文件系統,是使不同計算機之間能夠通過網絡進行文件共享的一種網絡協議,多用於Linux/Unix網絡系統中。
一台NFS服務器就如同一台文件服務器,只要將其文件系統共享出來,NFS客戶端就可以將它掛載到本地系統中,從而可以像使用本地文件系統中的文件一樣使用那些遠程文件系統中的文件。
雖然NFS可以在網絡中進行文件共享,但是NFS協議本身並沒有提供數據傳輸的功能,它必須借助於遠程過程調用(RPC)協議來實現數據的傳輸。RPC定義了一種進程間通過網絡進行交互通信的機制,它允許客戶端進程通過網絡向遠程服務器上的服務進程請求服務,而不需要了解底層通信協議的細節。
使用NFS服務,至少需要啟動以下3個系統守護進程:
(1)rpc.nfsd:它是基本的NFS守護進程,主要功能是管理客戶端是否能夠登入服務器。
(2)rpc.mountd:它是RPC安裝守護進程,主要功能是管理NFS的文件系統。當客戶端順利地通過rpc.nfsd登錄NFS服務器后,在使用NFS服務器所提供的文件前,還必須通過文件使用權限的驗證,rpc.mountd會讀取NFS的配置文件/etc/exports來對比客戶端的權限。
(3)portmap:主要功能是進行端口映射工作。當客戶端嘗試連接並使用RPC服務器提供的服務(如NFS服務)時,portmap會將所管理的與服務對應的端口號提供給客戶端,從而使客戶端可以通過該端口向服務器請求服務。
值得注意的是,雖然portmap只用於RPC,但它對於NFS服務來說是必不可少的。portmap沒有運行,NFS客戶端就無法查找從NFS服務器中共享的目錄。
二、NFS服務的安裝
目前幾乎所有的Linux發行版都默認安裝了NFS服務,Red Hat也不例外。只要安裝默認配置安裝完Red Hat Enterprise Linux,NFS服務就會被安裝在系統上。由於啟動NFS服務時需要nfs-utils和portmap這兩個軟件包,因此在配置使用NFS之前,可使用下面的命令來檢查系統中是否已經安裝了這兩個包:
[root@localhost ~]# rpm -q nfs-utils portmap nfs-utils-1.0.9-24.el5 portmap-4.0-65.2.2.1
可見,系統中已經安裝了NFS服務和portmap服務。
技巧:要檢查NFS服務是否正常運行,可以使用rpcinfo -p命令。如果NFS服務運行正常,就可在該命令執行結果中看到關於portmapper等守護進程的條目。
三、NFS服務的配置
NFS服務的配置方法相對比較簡單,只需在NFS的配置文件/etc/exports中進行設置,然后啟動NFS服務即可。
1、exports文件的格式
在exports文件中,可以定義NFS系統的輸出目錄(即共享目錄)、訪問權限和允許訪問的主機等參數。該文件默認為空。
exports文件中的每一行提供了一個共享目錄的設置,其格式為:
<輸出目錄> [客戶端1(選項1,選項2,...)] [客戶端2(選項1,選項2,...)]
其中,輸出目錄是必選參數,其他參數都是可選的。
值得注意的是,格式中的輸出目錄和客戶端之間、客戶端與客戶端之間都使用空格分隔,但是客戶端和選項之間不能有空格(客戶端緊跟着左括號,左括號緊跟着選項),選項與選項之間也不能有空格(前一個選項緊跟着逗號,逗號緊跟着下一個選項)。
(1)輸出目錄是指NFS系統中需要共享給客戶端使用的目錄。
(2)客戶端是指網絡中可以訪問這個NFS輸出目錄的計算機。客戶端的指定非常靈活,可以是單個主機的IP地址或域名,也可以是某個子網或域中的主機等。
客戶端常見的指定方式如下:
192.168.16.20:指定IP地址的主機。
192.168.16.0/24(或192.168.16.*):指定子網中所有的主機。
pcl.gdvcp.net:指定域名的主機。
*.gdvcp.net:指定域中的所有主機。
*(或缺省):所有主機。
(3)選項用來設置輸出目錄的訪問權限、用戶映射等。exports文件中的選項一般可以分為以下3類:
1)訪問權限選項:
ro:設置輸出目錄為只讀
rw:設置輸出目錄為可讀寫
2)用戶映射選項:
在默認情況下,當客戶端訪問NFS服務器時,若遠程訪問的用戶是root用戶,則NFS服務器會將它映射成一個本地的匿名用戶(該用戶賬戶為nfsnobody),
並將它所屬的用戶組也映射成匿名用戶組(該用戶組賬戶也為nfsnobody),這樣有助於提高系統的安全性。用戶映射選項可以對此進行調整:
all_squash:將遠程訪問的所有普通用戶及所屬用戶組都映射為匿名用戶或用戶組(一般均為nfsnobody)。
no_all_squash:不將遠程訪問的所有普通用戶及所屬用戶組都映射為匿名用戶或用戶組(默認設置)。
root_squash:將root用戶及所屬用戶組都映射為匿名用戶或用戶組(默認設置)。
no_root_squash:不將root用戶及所屬用戶組都映射為匿名用戶或用戶組。
anonuid=xxx:將遠程訪問的所有用戶都映射為匿名用戶,並指定該匿名用戶賬戶為本地用戶賬戶(UID=xxx)。
anongid=xxx:將遠程訪問的所有用戶組都映射為匿名用戶組賬戶,並指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx)。
3)其他選項:
secure:限制客戶端只能從小於1024的TCP/IP端口連接NFS服務器(默認設置)。
insecure:允許客戶端從大於1024的TCP/IP端口連接NFS服務器。
sync:將數據同步寫入內存緩沖區與磁盤中,雖然這樣做效率較低,但可以保證數據的一致性。
async:將數據先保存在內存緩沖區中,必要時才寫入磁盤。
wdelay:檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可提高效率(默認設置)。
no_wdelay:若有寫操作則立即執行,應與sync配合使用。
subtree_check:所輸出目錄是一個子目錄,則NFS服務器將檢查其父目錄的權限(默認設置)。
no_subtree_check:即使輸出目錄是一個子目錄,NFS服務器也不檢查其父目錄的權限,這樣做可以提高效率。
2、NFS服務配置實例
下面首先給出NFS主配置文件/etc/exports的一個應用實例,然后對有關設置進行說明。
[root@localhost ~]# cat /etc/exports /nfs/public 192.168.16.0/24(rw,async) *(ro) /nfs/liu 192.168.16.20(rw,sync) /nfs/root *.gdvcp.net(ro,no_root_squash) /nfs/users *.gdvcp.net(rw,insecure,all_squash,sync,no_wdelay) /mnt/cdrom 192.168.16.*(ro)
(1)/nfs/public 192.168.16.0/24(rw,async) *(ro)
輸出目錄/nfs/public可供子網192.168.16.0/24中所有客戶機進行讀寫操作,而其他網絡中的客戶機只能讀取該目錄中的內容。
值得注意的是:當某用戶使用子網192.168.16.0/24中的客戶機訪問該共享目錄時,能否真正地寫入,還要看該目錄對該用戶有沒有開放Linux文件系統權限的寫入權限。
如果該用戶是普通用戶,那么只有該目錄對該用戶開放了寫入權限,該用戶才可以在該共享目錄下創建子目錄及文件,且新建的子目錄及文件的所有者就是該用戶。
如果該用戶是root用戶,由於默認選項中有root_squash,root用戶會被映射為nfsnobody,因此只有該共享目錄對nfsnobody開放了寫入權限,該用戶才能在共享目錄中創建子目錄及文件,且所有者將變成nfsnobody。
(2)/nfs/liu 192.168.16.20(rw,sync)
輸出目錄/nfs/liu只供IP地址為192.168.16.20的客戶機進行讀寫操作。
(3)/nfs/root *.gdvcp.net(ro,no_root_squash)
對於輸出目錄/nfs/root,gdvcp.net域中的所有客戶機都具有只讀權限,並且不將root用戶映射到匿名用戶。
(4)/nfs/users *.gdvcp.net(rw,insecure,all_squash,sync,no_wdelay)
對於輸出目錄/nfs/users來說,gdvcp.net域中的所有客戶機都具有可讀可寫的權限,並且將所有用戶及所屬地用戶組都映射為nfsnobody,數據同步寫入磁盤。如果有寫入操作則立即執行。
(5) /mnt/cdrom 192.168.16.*(ro)
對於輸出目錄/mnt/cdrom來說,子網192.168.16.0/24中的所有客戶機都具有只讀的權限。
3、維護NFS服務的輸出目錄列表
每當修改了/etc/exports文件的內容后,實際上不需要重新啟動NFS服務,而直接使用命令exportfs就可以是設置立即生效。
exportfs命令就是用來維護NFS服務的輸出目錄列表的,命令的基本格式如下:
exportfs [選項]
其選項有以下幾個:
a:輸出在/etc/exports文件中設置的所有目錄。
r:重新讀取/etc/exports文件中的設置,並使設置立即生效,而不需要重新啟動NFS服務。
u:停止輸出某一目錄。
v:在輸出目錄時將目錄顯示到屏幕上。
(1)重新輸出共享目錄
每當修改了/etc/exports文件的內容后,可使用下面的命令來重新輸出共享目錄:
[root@localhost ~]# exportfs -rv exporting 192.168.16.0/24:/nfs/public exporting 192.168.16.20:/nfs/liu exporting *.gdvcp.net:/nfs/users exporting 192.168.16.*:/mnt/cdrom exporting *.gdvcp.net:/nfs/root exporting *:/nfs/public
(2)停止輸出所有共享目錄
要停止輸出當前主機中NFS服務器的所有共享目錄,可使用下面的命令:
[root@localhost ~]# exportfs -auv
四、啟動和停止NFS服務
1、啟動NFS服務
為了是NFS服務器能正常工作,需要啟動portmap和nfs這兩個服務,並且portmap一定要先於nfs啟動,具體命令如下:
[root@localhost ~]# /etc/rc.d/init.d/portmap start Starting portmap: [ OK ] [root@localhost ~]# /etc/rc.d/init.d/nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ]
2、停止NFS服務
在停止NFS服務時,需要先停止NFS服務再停止portmap服務。如果系統中還有其他服務需要使用portmap服務時,則可不用停止portmap服務。具體命令如下:
[root@localhost ~]# /etc/rc.d/init.d/nfs stop Shutting down NFS mountd: [ OK ] Shutting down NFS daemon: [ OK ] Shutting down NFS quotas: [ OK ] Shutting down NFS services: [ OK ] [root@localhost ~]# /etc/rc.d/init.d/portmap stop Stopping portmap: [ OK ]
3、重新啟動NFS服務(保證portmap服務已開啟):
[root@localhost ~]# /etc/rc.d/init.d/nfs restart
Shutting down NFS mountd: [ OK ]
Shutting down NFS daemon: [ OK ]
Shutting down NFS quotas: [ OK ]
Shutting down NFS services: [ OK ]
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]
4、檢查portmap和nfs服務的狀態:
[root@localhost ~]# /etc/rc.d/init.d/portmap status portmap (pid 10792) is running... [root@localhost ~]# /etc/rc.d/init.d/nfs status rpc.mountd (pid 10951) is running... nfsd (pid 10948 10947 10946 10945 10944 10943 10942 10941) is running... rpc.rquotad (pid 10937) is running...
5、設置自動啟動NFS服務
對於實際應用中的Linux系統,每次開機后都手工啟動nfs服務是不現實的,應該設置系統在指定的運行級別(通常為3和5)自動啟動portmap和nfs服務。
[root@localhost ~]# chkconfig --level 35 portmap on [root@localhost ~]# chkconfig --level 35 nfs on
當然,也可以執行ntsysv命令啟動服務配置程序進行配置。
五、測試NFS服務
1、檢查輸出目錄所使用的選項:
在配置文件/etc/exports中,即使在命令行中只設置了一兩個選項,但在真正輸出目錄時,實際上還帶有很多默認的選項。通過查看/var/lib/nfs/etab文件,就可以了解到真正輸出目錄時到底使用了什么選項:
[root@localhost ~]# cat /var/lib/nfs/etab /nfs/public 192.168.16.0/24(rw,async,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534) /nfs/liu 192.168.16.20(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534) /nfs/users *.gdvcp.net(rw,sync,no_wdelay,hide,nocrossmnt,insecure,root_squash,all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534) /mnt/cdrom 192.168.16.*(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534) /nfs/root *.gdvcp.net(ro,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534) /nfs/public *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
2、使用showmount命令測試NFS服務器的輸出目錄狀態
showmount命令的基本格式為:
showmount [選項] NFS服務器名稱或地址
常用選項有:
a:顯示指定的NFS服務器的所有客戶端主機及其所連接的目錄。
d:顯示指定的NFS服務器中已被客戶端連接的所有輸出目錄。
e:顯示指定的NFS服務器上所有輸出的共享目錄。
(1)查看當前主機中NFS服務器上所有輸出的共享目錄
使用不帶NFS服務器名稱或地址參數的showmount -e命令,可以查看當前主機中NFS服務器上所有輸出的共享目錄:
[root@localhost ~]# showmount -e Export list for localhost.localdomain: /nfs/root *.gdvcp.net /mnt/cdrom 192.168.16.* /nfs/users *.gdvcp.net /nfs/liu 192.168.16.20 /nfs/public (everyone)
(2)顯示當前主機中NFS服務器上被掛載的所有輸出目錄
使用不帶NFS服務器名稱或地址參數的showmount -d命令,可以查看當前主機中NFS服務器上所有被掛載的輸出目錄:
[root@localhost ~]# showmount -d
Directories on localhost.localdomain:
六、NFS客戶端的使用
在NFS服務器設置完成后,客戶端可以先查看NFS服務器上有哪些共享目錄,然后使用mount命令將可用的共享目錄掛載到本機的文件系統中,甚至還可以實現開機自動掛載,以后用戶就可以像使用本地文件系統中的目錄一樣使用NFS掛載目錄了。
1、查看NFS服務器信息
在客戶端,要查看NFS服務器上有哪些共享目錄,可以使用showmount命令。
例如:如果NFS服務器的IP地址為192.168.1.4,那么可使用下面的命令來查看:
[root@localhost ~]# showmount -e 192.168.1.4 Export list for 192.168.1.4: /nfs/root *.gdvcp.net /mnt/cdrom 192.168.16.* /nfs/users *.gdvcp.net /nfs/liu 192.168.16.20 /nfs/public (everyone)
值得注意的是,在使用showmount -e命令查看NFS服務器上的輸出目錄時,如果出現下面故障:
[root@localhost ~]# showmount -e 192.168.1.4 mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive
可能是未啟動portmap服務。
[root@localhost ~]# showmount -e 192.168.1.4 mount clntudp_create: RPC: Program not registered
可能是未啟動nfs服務。
若是iptables防火牆引起的故障,為了測試NFS服務器功能,可簡單地用service iptables stop命令先關掉防火牆。
2、連接NFS服務器
在利用showmount命令得知遠程NFS服務器上的共享資源后,接下來就是進行實際的掛載操作。
掛載NFS服務器上的輸出目錄的命令格式為:
mount -t nfs 服務器名或IP地址:輸出目錄 本地掛載目錄
例如:將服務器(192.168.1.4)上的/nfs/public共享目錄掛載到本機上的/mnt/nfs目錄:
[root@localhost ~]# mkdir /mnt/nfs [root@localhost ~]# mount -t nfs 192.168.1.4:/nfs/public /mnt/nfs
值得注意到是,如果客戶端的用戶無權訪問NFS服務器上的輸出目錄時,就會無法進行掛載。
3、卸載NFS服務器
如果不想再使用已掛載的NFS輸出目錄,可用umount命令來卸載該目錄。
[root@localhost ~]# umount /mnt/nfs
技巧:如果當前還有客戶端正在連接NFS服務器,此時想要將NFS服務器所在地主機關機,應先關掉portmap和nfs服務,否則可能要等待很久才能正常關機。如果無法正確地關閉portmap和nfs服務,那么可先用netstat -ulp找出它們的PID,然后用kill命令殺掉,這樣才能正常關機。當然,還可以先用exportfs -auv命令將當前主機中NFS服務器的所有輸出目錄停止掉,再關機。
4、啟動時自動連接NFS
要想讓系統在啟動時自動掛載NFS服務器上的輸出目錄,應編輯文件/etc/fstab,在該文件中加入如下格式的語句:
NFS服務器名或IP地址:輸出目錄 本地掛載目錄 nfs defaults 0 0
例如:
192.168.1.4:/nfs/public /mnt/nfs defaults 0 0