CentOS 7 安裝配置 NFS
環境
nps 192.168.1.97
client 192.168.1.98
一、yum 安裝
»yum -y install nfs-utils rpcbind
NFS 的套件結構:
- /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/expots,默認為空
[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) # [分享目錄] [第一部主機(權限)] [可用主機名] [可用萬用字元]
使配置生效 »exportfs -r
例:同一目錄針對不同范圍開放不同權限
[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 后,針對這個被我掛載的目錄我就具有可以讀寫的權限~ 至於如果我不是在這個網段之內,那么這個目錄的 資料我就僅能讀取而已,亦即為唯讀的屬性啦
二、權限說明
注:至於權限方面 (就是小括號內的參數) 常見的參數則有:
/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值。
三、啟動 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 的連線觀察
[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 的目錄資料啰!
四、客戶端掛載:
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