1. 安裝軟件包
yum -y install nfs-utils rpcbind
2. 安裝文件說明
/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 :在 NFS 伺服器的登錄檔都放置到 /var/lib/nfs/ 目錄里面,在該目錄下有兩個比較重要的登錄檔, 一個是 etab ,主要記錄了 NFS 所分享出來的目錄的完整權限設定值;另一個 xtab 則記錄曾經連結到此 NFS 主機的相關用戶端資料。
nfs 的主配置文件 /etc/exports,默認為空。
3. 使配置更改生效
exportfs -r
4. 例子
示例:同一目錄針對不同范圍開放不同權限
[root@linux ~]# vi /etc/exports
/opt/test 192.168.1.0/24(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501) localhost(rw) *.ev.ncku.edu.tw(ro,sync)
/home/public 192.168.0.0/24(rw) *(ro) # 繼續累加在后面,注意,我有將主機與網域分為兩段 (用空白隔開) !
上面的例子說的是:當我的 IP 是在 192.168.0.0/24 這個網段的時候,那么當我在 Client 端掛載了 Server 端的 /home/public 后,針對這個被我掛載的目錄我就具有可以讀寫的權限~,至於如果我不是在這個網段之內,那么這個目錄的資料我就僅能讀取而已,亦即為只讀的屬性。
5. 權限說明
注:至於權限方面 (就是小括號內的參數) 常見的參數則有:
/opt/test 為共享目錄;
192.168.1.0/24 可以為一個網段,一個IP,也可以是域名,域名支持通配符 如: *.qq.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值,可以在此處自行設定;
anongid:匿名用戶的GID值。
6. 啟動 nfs
NFS 的啟動還需要 portmap 的協助才行! 所以趕緊啟動!
[root@linux ~]# /etc/init.d/portmap start
# 如果 portmap 本來就已經在執行了,那就不需要啟動!
[root@linux ~]# /etc/init.d/nfs start
# 有時候可能會出現如下的警告訊息:
exportfs: /etc/exports [3]: No 'sync' or 'async' option specified
for export "192.168.0.100:/home/test".
Assuming default behaviour ('sync').
# 上面的警告訊息僅是在告知因為我們沒有指定 sync 或 async 的參數,
# 則 NFS 將預設會使用 sync 的資訊而已。你可以不理他,也可以加入 /etc/exports。
[root@linux ~]# vi /etc/exports
/tmp *(rw,no_root_squash,sync)
/home/public 192.168.0.0/24(rw,sync) *(ro,sync)
/home/test 192.168.0.100(rw,sync)
/home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40,sync)
[root@linux ~]# /etc/init.d/nfs restart
service rpcbind start
service nfs start
chkconfig rpcbind on
chkconfig nfs on
啟動之后,請趕快到 /var/log/messages 里面看看有沒有被正確的啟動?
[root@linux ~]# vi /var/log/messages
...
Sep 22 00:01:37 linux nfs: Starting NFS services: succeeded
Sep 22 00:01:37 linux nfs: rpc.rquotad startup succeeded
Sep 22 00:01:37 linux nfsd[1050]: nfssvc_versbits: +2 +3 +4
Sep 22 00:01:37 linux nfs: rpc.nfsd startup succeeded
Sep 22 00:01:37 linux nfs: rpc.mountd startup succeeded
Sep 22 00:01:37 linux rpcidmapd: rpc.idmapd -SIGHUP succeeded
...
在確認沒有問題之后,接下來我們來瞧一瞧那么 NFS 到底開了哪些端口?
[root@linux ~]# netstat -ultn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:803 0.0.0.0:* LISTEN 1047/rpc.rquotad
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 32503/portmap
tcp 0 0 0.0.0.0:819 0.0.0.0:* LISTEN 1064/rpc.mountd
udp 0 0 0.0.0.0:2049 0.0.0.0:* -
udp 0 0 0.0.0.0:800 0.0.0.0:* 1047/rpc.rquotad
udp 0 0 0.0.0.0:816 0.0.0.0:* 1064/rpc.mountd
udp 0 0 0.0.0.0:111 0.0.0.0:* 32503/portmap
portmap 啟動的 port 在 111;
NFS 啟動的 port 在 2049;
其他 rpc.daemons 啟動的 port 則是隨機產生的,因此需向 port 111 注冊。
那我怎么知道每個 RPC 服務的注冊狀況?沒關系,你可以使用 rpcinfo 來處理的。
[root@linux ~]# rpcinfo [-p] [IP|hostname]
參數:
-p :顯示出所有的 port 與 porgram 的資訊;
范例一:顯示出目前這部主機的 RPC 狀態
[root@linux ~]# rpcinfo -p localhost
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 800 rquotad
100011 2 udp 800 rquotad
100011 1 tcp 803 rquotad
100011 2 tcp 803 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100005 1 udp 816 mountd
100005 1 tcp 819 mountd
100005 2 udp 816 mountd
100005 2 tcp 819 mountd
100005 3 udp 816 mountd
100005 3 tcp 819 mountd
# NFS版本 端口 服務名稱
如果你的 rpcinfo 無法輸出,那就表示注冊的資料有問題!可能需要重新啟動 portmap 與 nfs!
NFS 的連線觀察
在你的 NFS 伺服器設定妥當之后,我們可以先自我測試一下是否可以連線! 就是利用 showmount 這個指令來查閱!
[root@linux ~]# showmount [-ae] [hostname|IP]
參數:
-a :顯示目前主機與用戶端的 NFS 連線分享的狀態;
-e :顯示某部主機的 /etc/exports 所分享的目錄資料。
范例一:請顯示出剛剛我們所設定好的相關 exports 資訊
[root@linux ~]# showmount -e localhost
Export list for localhost:
/tmp *
/home/linux *.linux.org
/home/public (everyone)
/home/test 192.168.0.100
很簡單!所以,當您要掃瞄某一部主機提供的 NFS 分享的目錄時,就使用 showmount -e IP (或hostname) 即可!非常的方便!這也是 NFS client 端最常用的指令!
如果有其他用戶端掛載了你的 NFS 檔案系統時, 那么該用戶端與檔案系統資訊就會被記錄到 /var/lib/nfs/xtab 里頭去的!
[root@linux ~]# tail /var/lib/nfs/etab
/home/public *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,
subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)
# 上面是同一行,可以看出除了 ro, sync, root_squash 等等,
# 其實還有 anonuid 及 anongid 等等的設定!
/tmp *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,subtr
ee_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)
# 同樣的,在 /tmp 也有很多的權限相關的參數!
如果你想要重新處理 /etc/exports 檔案,當重新設定完 /etc/exports 后需不需要重新啟動 nfs ? 不需要!如果重新啟動 nfs 的話,還得要向 RPC 注冊!很麻煩~ 這個時候我們可以透過 exportfs 這個指令來幫忙!
[root@linux ~]# exportfs [-aruv]
參數:
-a :全部掛載(或卸載) /etc/exports 檔案內的設定
-r :重新掛載 /etc/exports 里面的設定,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的內容!
-u :卸載某一目錄
-v :在 export 的時候,將分享的目錄顯示到熒幕上!
范例一:重新掛載一次 /etc/exports 的設定
[root@linux ~]# exportfs -arv
exporting 192.168.0.100:/home/test
exporting 192.168.0.0/24:/home/public
exporting *.linux.org:/home/linux
exporting *:/home/public
exporting *:/tmp
范例二:全部都卸載
[root@linux ~]# exportfs -auv
要熟悉一下這個指令的用法!這樣一來,就可以直接重新 exportfs 我們記錄在 /etc/exports 的目錄資料!
7. 客戶端掛載
mount -t nfs 192.168.1.97:/opt/test /mnt
#查看可掛載
showmount -e 192.168.1.97
Export list for 192.168.1.97:
/opt/test 192.168.1.0/24
無提示即為成功。
客戶端在掛載的時候可能遇到網絡不太穩定的問題,原因可能是NFS默認是用UDP協議,換成TCP協議即可:
mount -t nfs 192.168.1.97:/opt/test /mnt -o proto=tcp -o nolock