NFS為Network FileSystem的簡稱,最早之前是由Sun這家公司所發展出來的,他的目的就是想讓不同的機器、不同的作業系統可以彼此分享個別的檔案啦!目前在Unix Like當中用來做為file server是相當不錯的一個方案喔!基本上,Unix Like主機連接到另一部Unix Like主機來分享彼此的檔案時,使用NFS要比SAMBA這個伺服器快速且方便的多了!此外,NFS的設定真的很簡單,幾乎只要記得啟動Remote Procedure Call這個咚咚(RPC,就是portmap這個套件啦!)就一定可以架設的起來!真是不錯啊!不過,如果要達成Windows與Linux之間的溝通,那麼還是以SAMBA比較容易啊!無論如何,NFS還是可以做為小公司或學校單位內部Unix Like機器共享file的一個Server喔! |
例題: 請問我的主機是以RPM為套件管理的Linux distribution,例如Red Hat,CentOS與SuSE等版本,那麼我要如何知道我的主機裡面是否已經安裝了portmap與nfs相關的套件呢? 答:
|
[root@linux ~]# vi /etc/exports /tmp 192.168.1.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync) # [分享目錄] [第一部主機(權限)] [可用主機名] [可用萬用字元] |
[root@linux ~]# vi /etc/exports # 任何人都可以用我的 /tmp ,用萬用字元來處理主機名稱,重點在 no_root_squash /tmp *(rw,no_root_squash) |
[root@linux ~]# vi /etc/exports /tmp *(rw,no_root_squash) /home/public 192.168.0.0/24(rw) *(ro) # 繼續累加在後面,注意,我有將主機與網域分為兩段 (用空白隔開) 喔! |
[root@linux ~]# vi /etc/exports /tmp *(rw,no_root_squash) /home/public 192.168.0.0/24(rw) *(ro) /home/test 192.168.0.100(rw) # 只要設定 IP 正確即可! |
[root@linux ~]# vi /etc/exports /tmp *(rw,no_root_squash) /home/public 192.168.0.0/24(rw) *(ro) /home/test 192.168.0.100(rw) /home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40) # 如果要開放匿名,那麼重點是 all_squash,並且要配合 anonuid 喔! |
[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 |
[root@linux ~]# /etc/init.d/nfslock start |
[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 |
[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 |
[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版本 埠口 服務名稱 |
[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 |
[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 也有很多的權限相關的參數喔! |
[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 |
[root@linux ~]# vi /usr/local/virus/iptables/iptables.allow iptables -A INPUT -i $EXTIF -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT iptables -A INPUT -i $EXTIF -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT iptables -A INPUT -i $EXTIF -p TCP -s 140.116.0.0/16 --dport 111 -j ACCEPT iptables -A INPUT -i $EXTIF -p UDP -s 140.116.0.0/16 --dport 111 -j ACCEPT |
[root@linux ~]# vi /etc/hosts.allow # 讓來自 140.116.44.0/255.255.255.0 的主機可以使用 mountd mountd: 140.116.44.0/255.255.255.0 [root@linux ~]# vi /etc/hosts.deny # 讓所有人都不能使用 mountd mountd: ALL |
[root@linux ~]# /etc/init.d/portmap start [root@linux ~]# /etc/init.d/nfslock start # 一般來說,系統預設會啟動 portmap ,不過鳥哥之前關閉過,所以要啟動。 # 另外,如果伺服器端有啟動 nfslock 的話,用戶端也要啟動才能生效! [root@linux ~]# showmount -e 192.168.0.2 Export list for 192.168.0.2: /tmp * /home/linux *.linux.org /home/public (everyone) <==這是等一下我們要掛載的目錄 /home/test 192.168.0.100 |
[root@linux ~]# mkdir -p /home/nfs/public [root@linux ~]# mount -t nfs 192.168.0.2:/home/public /home/nfs/public # 注意一下掛載的語法!『 -t nfs 』指定檔案系統類型, # IP:/dir 則是指定某一部主機的某個提供的目錄! [root@linux ~]# df Filesystem 1K-blocks Used Available Use% Mounted on ....中間省略.... 192.168.0.2:/home/public 10080512 2135072 7433344 23% /home/nfs/public |
[root@linux ~]# umount /home/nfs/public |
參數 | 參數代表意義 | 系統預設值 |
suid nosuid | 曉得啥是SUID吧?如果掛載的partition上面有任何SUID的binary程式時,你只要使用nosuid就能夠取消SUID的功能了!嗄?不知道什麼是SUID?那就不要學人家架站嘛!@_@!趕緊回去基礎學習篇複習一下程序與資源管理啦! | suid |
rw ro | 你可以指定該partition是唯讀(ro)或可讀寫喔! | rw |
dev nodev | 是否可以保留裝置檔案的特殊功能?一般來說只有/dev才會有特殊的裝置,因此你可以選擇nodev喔! | dev |
exec noexec | 是否具有執行binary file的權限?如果你想要掛載的僅是資料區(例如/home),那麼可以選擇noexec啊! | exec |
user nouser | 是否允許使用者進行檔案的掛載與卸載功能?如果要保護檔案系統,最好不要提供使用者進行掛載與卸載吧! | nouser |
auto noauto | 這個auto指的是『mount-a』時,會不會被掛載的項目。如果你不需要這個partition隨時被掛載,可以設定為noauto。 | auto |
[root@linux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \ > 192.168.0.2:/home/public /home/nfs/public [root@linux ~]# mount 192.168.0.2:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,addr=192.168.0.2) |
參數 | 參數功能 | 預設參數 |
fg bg | 當執行掛載時,該掛載的行為會在前景(fg)還是在背景(bg)執行?若在前景執行時,則mount會持續嘗試掛載,直到成功或time out為止,若為背景執行,則mount會在背景持續多次進行mount,而不會影響到前景的程序操作。如果你的網路連線有點不穩定,或是伺服器常常需要開關機,那建議使用bg比較妥當。 | fg |
soft hard | 上頭不是談到掛載時會使用RPC呼叫嗎?如果是hard的情況,則當兩者之間有任何一部主機離線,則RPC會持續的呼叫,直到對方恢復連線為止。如果是soft的話,那RPC會在time out後『重複』呼叫,而非『持續』呼叫,因此系統的延遲會比較不這麼明顯。同上,如果你的伺服器可能開開關關,建議用soft喔! | hard |
intr | 當你使用上頭提到的hard方式掛載時,若加上intr這個參數,則當RPC持續呼叫中,該次的呼叫是可以被中斷的(interrupted)。 | 沒有 |
rsize wsize | 讀出(rsize)與寫入(wsize)的區塊大小(block size)。這個設定值可以影響用戶端與伺服器端傳輸資料的緩衝記憶容量。一般來說,如果在區域網路內(LAN),並且用戶端與伺服器端都具有足夠的記憶體,那這個值可以設定大一點,比如說8192(bytes)等,提升緩衝記憶區塊將可提升NFS檔案系統的傳輸能力!但要注意設定的值也不要太大,最好是達到網路能夠傳輸的最大值為限。舉例來說,如果你的MTU可達9000,那設定成8192才會有意義吧!^_^ | rsize=1024 wsize=1024 |
[root@linux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \ > bg,soft,rsize=8192,wsize=8192 \ > 192.168.0.2:/home/public /home/nfs/public |
[root@linux ~]# vi /etc/fstab 192.168.0.2:/home/public /home/nfs/public nfs nosuid,noexec,nodev,rw, bg,soft,rsize=8192,wsize=8192 0 0 # 注意!上面的設定是同一行喔!不要搞錯囉! ^_^ |
[root@linux ~]# mount -t nfs localhost:/home/test /home/nfs mount: localhost:/home/test failed, reason given by server: Permission denied |
[root@linux ~]# mount -t nfs localhost:/home/test /home/nfs mount: RPC: Port mapper failure - RPC: Unable to receive [root@linux ~]# mount -t nfs localhost:/home/test /home/nfs mount: RPC: Program not registered |
[root@linux ~]# vi /etc/auto.master /home/nfs /etc/auto.nfs [root@linux ~]# mkdir /home/nfs # 注意!此時 /home/nfs 內並沒有其他的目錄存在喔! |
[本地端目錄] [-掛載參數] [伺服器所提供的目錄] 參數: [本地端目錄] :指的就是在 /etc/auto.master 內指定的目錄之次目錄 [-掛載參數] :就是前一小節提到的 rw,bg,soft 等等的參數啦!可有可無; [伺服器所提供的目錄] :例如 192.168.0.2:/home/public 等 [root@linux ~]# vi /etc/auto.nfs public -rw,bg,soft,rsize=8192,wsize=8192 192.168.0.2:/home/public testing -rw,bg,soft,rsize=8192,wsize=8192 192.168.0.2:/home/test temp -rw,bg,soft,rsize=8192,wsize=8192 192.168.0.2:/tmp # 參數部分,只要最前面加個 - 符號即可! |
[root@linux ~]# /etc/init.d/autofs start |
[root@linux ~]# mount; df # 妳不會看到任何跟 192.168.0.2 這部主機有關的 NFS 掛載資訊喔! [root@linux ~]# cd /home/nfs/public [root@linux public]# mount; df 192.168.0.2:/home/public on /home/nfs/public type nfs (rw,bg,soft, rsize=8192,wsize=8192,addr=140.116.44.179) # 上面的輸出是同一行!瞧!突然出現這個玩意兒! Filesystem 1K-blocks Used Available Use% Mounted on 192.168.0.2:/home/public 10080488 2144288 7424136 23% /home/nfs/public # 檔案的掛載也出現沒錯! [root@linux public]# pwd /home/nfs/public # 這個目錄突然被生出來了! ^_^ |
[root@linux ~]# vi /etc/exports /tmp 192.168.0.*(rw,no_root_squash) /home/nfs 192.168.0.*(ro) *(ro,all_squash) /home/upload 192.168.0.*(rw,all_squash,anonuid=210,anongid=210) /home/andy 192.168.0.50(rw) |
1. /tmp [root@linux ~]# ll -d /tmp drwxrwxrwt 5 root root 20480 Sep 22 22:52 /tmp 2. /home/nfs [root@linux ~]# mkdir -p /home/nfs [root@linux ~]# chmod 755 -R /home/nfs # 修改較為嚴格的檔案權限將目錄與檔案設定成唯讀!不能寫入的狀態,會更保險一點! 3. /home/upload [root@linux ~]# groupadd -g 210 nfs-upload [root@linux ~]# useradd -g 210 -u 210 -M nfs-upload # 先建立對應的帳號與群組名稱及 UID 喔! [root@linux ~]# mkdir -p /home/upload [root@linux ~]# chown -R nfs-upload:nfs-upload /home/upload # 修改擁有者!如此,則使用者與目錄的權限都設定妥當囉! 4. /home/andy [root@linux ~]# ll -d /home/andy drwx------ 3 andy andy 4096 Oct 28 13:37 andy |
[root@linux ~]# /etc/init.d/portmap start [root@linux ~]# /etc/init.d/nfs start [root@linux ~]# /etc/init.d/nfslock start |
1. 確認遠端伺服器的可用目錄: [root@linux ~]# /etc/init.d/portmap start [root@linux ~]# /etc/init.d/nfslock start [root@linux ~]# showmount -e 192.168.0.100 Export list for 192.168.0.100: /tmp 192.168.0.* /home/nfs (everyone) /home/upload 192.168.0.* /home/andy 192.168.0.50 2. 建立掛載點: [root@linux ~]# mkdir -p /home/zzz/tmp [root@linux ~]# mkdir -p /home/zzz/nfs [root@linux ~]# mkdir -p /home/zzz/upload [root@linux ~]# mkdir -p /home/zzz/andy 3. 實際掛載: [root@linux ~]# mount -t nfs 192.168.0.100:/tmp /home/zzz/tmp [root@linux ~]# mount -t nfs 192.168.0.100:/home/nfs /home/zzz/nfs [root@linux ~]# mount -t nfs 192.168.0.100:/home/upload /home/zzz/upload [root@linux ~]# mount -t nfs 192.168.0.100:/home/andy /home/zzz/andy |