分类: LINUX
2008-07-07 15:10:32
NFS & Automount
項目選擇
在 Unix/Linux 的世界中,用來做資料交換存取最常用的方法,莫過於 NFS (Network FileSystem) 機制了,它最早是由 Sun 所提出的,而後來在 Unix/Linux 上一直被廣泛的使用。
使用 NFS,它最大的特色就是使用 RPC (Remote Procedure Call) 做 Port 對應,而做 Port 對應的工作,是使用 pormap 來做的,也就是說,一旦決定要使用 NFS 來使 Unix/Linux 之間的檔案交換,那麼就需要先啟動 portmap 來使 RPC 控制,如此 NFS 才能使用。
NFS 分享設定
首先,在做 NFS 分享前,要先編好設定檔 /etc/exports,內容非常簡單,我們就來看看以下實做吧:
[root@ldap-dns /]# vi /etc/exports ==================================== /misc 192.168.1.0/24(ro) ==================================== [root@ldap-dns /]# |
好了,這樣設定完,只要是 192.168.1.0/24 的機器都可以來掛載,但是只能讀取 (Read Only) 不可寫入。
當然,如果你要開於其它權限的話,可以參考下面的參數:
啟動 NFS 服務
首先,一定要記得啟動 NFS 之前一定要先把 portmap 啟動才行,否則會出錯:
[root@ldap-dns /]# service portmap start Starting portmap: [ OK ] [root@ldap-dns /]# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ] [root@ldap-dns /]# |
Only for SuSE
若你的系統是使用 SuSE,那麼因為系統沒有 service 指令,所以無法使用 service 來啟動 portmap,但啟動方法也很簡單:
suse:/etc/init.d # /etc/init.d/portmap start
Starting RPC portmap daemon done
suse:/etc/init.d /etc/init.d/nfsserver start
Starting kernel based NFS server done
suse:/etc/init.d #
啟動之後,可以使用 showmount 看看有分享那些目錄:
[root@ldap-dns /]# showmount -e Export list for ldap-dns.l-penguin.idv.tw: /misc 192.168.1.0/24 [root@ldap-dns /]#[root@ldap-dns /]# showmount -e Export list for ldap-dns.l-penguin.idv.tw: /misc 192.168.1.0/24 [root@ldap-dns /]# |
你可以使用 rpcinfo 這個工具來看看有那些服務使用 rpc 資源:
[root@ldap-dns misc]# rpcinfo -p 192.168.1.211 program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100011 1 udp 828 rquotad 100011 2 udp 828 rquotad 100011 1 tcp 831 rquotad 100011 2 tcp 831 rquotad 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100021 1 udp 1028 nlockmgr 100021 3 udp 1028 nlockmgr 100021 4 udp 1028 nlockmgr 100021 1 tcp 1037 nlockmgr 100021 3 tcp 1037 nlockmgr 100021 4 tcp 1037 nlockmgr 100005 1 udp 844 mountd 100005 1 tcp 847 mountd 100005 2 udp 844 mountd 100005 2 tcp 847 mountd 100005 3 udp 844 mountd 100005 3 tcp 847 mountd [root@ldap-dns misc]# |
若要使用網路上分享出來的 NFS 資源的話,使用 mount 指令就可以幫我們解決了,但是還有一個最重要的前提是,千萬不要忘了先把 portmap 啟動,如此才能正確的掛載:
[root@mailgw ~]# service portmap start Starting portmap: [ OK ] [root@mailgw ~]# mount -t nfs -o ro,soft,intr,timeo=10 192.168.1.211:/misc /mnt [root@mailgw ~]# |
上面的 option 選項裡,記得要下 "soft,intr,timeo" 來指定掛載逾時和軟性掛載,指定軟性掛載的好處是,在 NFS Server 沒有回應或關機時,避免 Client 會完全停掉而無法無應,此時就算是關機也無法解決。
當然,你可以使用 mount 指令看看目前有那些目錄被掛載起來:
[root@mailgw mnt]# mount 192.168.1.211:/misc on /mnt type nfs (ro,soft,intr,timeo=10,addr=192.168.1.211) [root@mailgw mnt]# |
上面只截取 NFS 掛載部份。
現在,就來看看 /mnt 裡,是否能看到 192.168.1.211 分享出來的 /misc 目錄:
[root@mailgw mnt]# ls -l /mnt total 8 -rw-r--r-- 1 root root 0 Aug 17 22:38 example drwxr-xr-x 2 root root 4096 Aug 17 22:39 java drwxr-xr-x 2 root root 4096 Aug 17 22:39 tomcat [root@mailgw mnt]# |
當然,可想而知,你是不可以在上面建立檔案的,因為在 NFS Server 掛載的選項就是只能唯讀呀!
使用了 NFS 之後,我想大家應該會知道,若大家連線越多,那麼對 Server 的資源也就浩用越大,若是 Client 能設定成只在需要的時候才自動掛上必要的目錄,而在一段時間之後若沒有再使用就卸載,如此對於 Server 的使用也能相對的減少資源使用。
autofs 可以用來自動掛載資料,也就是我們這次的重點,而 autofs 是一個 daemon,一旦啟動後它會駐列在系統中,他會先載入設定檔然後監視指定的目錄,一旦使用者要存取所指定的目錄時就會開始自動掛載起來。以下的範列,我將示範在主機裡分享 /home 目錄可供 Client 掛載,而在 Server 的設定,完全就跟往前一樣設定好分享條件,然後啟動 NFS 就可以了。所以我們要調整的是 Client 的部份。
/etc/auto.master
auto.master 主要是設定需要監控那一個目錄,然後再指定其設定檔:
[root@mailgw ~]# vi /etc/auto.master ===================================== /home /etc/auto.home --timeout=30 ===================================== |
上面的意思是,autofs 要去監控 /home 目錄,而設定檔在 /etc/auto.home 這個檔案裡,而 timeout 時間是 30 秒。
Only for SuSE若你的系統是使用 SuSE,那麼請改為下面的設定:
[root@mailgw ~]# vi /etc/auto.master
=====================================
/home /etc/auto.home "--timeout 30"
=====================================
/etc/auto.home
auto.home 是由 auto.master 設定而來的,裡面設定了 /home 目錄下的掛載來源和參數:
[root@mailgw ~]# vi /etc/auto.home ===================================== * -rw,soft,intr 192.168.1.211:/home/& ===================================== |
上面的意思是,/home 目錄下的任何子目錄,其子目錄都可以讀寫,並且是軟性掛載,而來源是 192.168.1.211 的 /home 目錄。"&" 的意思是,對應到 "*" 的值,若是要進入 /home/steven 時,那麼就會自動把 192.168.1.211 的 /home/steven 掛進來。
啟動 autofs
要啟動 autofs 之前,因為我們的來源是使用 NFS,所以 portmap 是一定要先開的,再來啟動 autofs。
[root@mailgw ~]# service portmap start Starting portmap: [ OK ] [root@mailgw ~]# service autofs start Starting automount: [ OK ] [root@mailgw ~]# |
Only for SuSE若你的系統是使用 SuSE Linux,設定方法都是一樣的,而啟動方法則請參考下面的範例:
suse:/var/log # /etc/init.d/autofs start
Starting service automounter/usr/sbin/automount: done
suse:/var/log #
現在再來看看目前的 mount 狀態:
[root@mailgw ~]# mount /dev/sda1 on / type ext3 (rw) none on /proc type proc (rw) none on /sys type sysfs (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) none on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) automount(pid2774) on /home type autofs (rw,fd=4,pgrp=2774,minproto=2,maxproto=4) [root@mailgw ~]# |
上面可以看到 automount 正在監控 /home 目錄,而且為我們還沒有進入 /home 目錄裡的任何資料夾,所以會沒有其它的 mount 資訊。
現在可以試著進入 /home/steven 這個資料夾裡:
[root@mailgw ~]# cd /home/steven [root@mailgw steven]# |
接著馬上來看看 mount 的變化:
[root@mailgw steven]# mount /dev/sda1 on / type ext3 (rw) none on /proc type proc (rw) none on /sys type sysfs (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) none on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) automount(pid2774) on /home type autofs (rw,fd=4,pgrp=2774,minproto=2,maxproto=4) 192.168.1.211:/home/steven on /home/steven type nfs (rw,soft,intr,addr=192.168.1 .211) [root@mailgw steven]# |
看到了吧,最後一行正顯示著 192.168.1.211 的 /home/steven 正被我們掛載。