一、NFS服務(wù)簡(jiǎn)介
NFS 就是NetworkFileSystem 的縮寫(xiě),最早之前是由sun這家公司所發(fā)展出來(lái)的。 它最大的功能就是可以透過(guò)網(wǎng)絡(luò),讓不同的機(jī)器、不同的操作系統(tǒng)、可以彼此分享個(gè)別的檔案 (share files)。所以,你也可以簡(jiǎn)單的將他看做是一個(gè)文件服務(wù)器 (file server) 呢!這個(gè) NFS 服務(wù)器可以讓你的 PC 來(lái)將網(wǎng)絡(luò)遠(yuǎn)程的 NFS 服務(wù)器分享的目錄,掛載到本地端的機(jī)器當(dāng)中, 在本地端的機(jī)器看起來(lái),那個(gè)遠(yuǎn)程主機(jī)的目錄就好像是自己的一個(gè)磁盤(pán)分區(qū)槽一樣 (partition)!使用上面相當(dāng)?shù)谋憷?
因?yàn)?NFS 支持的功能相當(dāng)?shù)亩啵煌墓δ芏紩?huì)使用不同的程序來(lái)啟動(dòng), 每啟動(dòng)一個(gè)功能就會(huì)啟用一些端口來(lái)傳輸數(shù)據(jù),因此, NFS 的功能所對(duì)應(yīng)的端口才沒(méi)有固定住, 而是隨機(jī)取用一些未被使用的小于 1024 的埠口來(lái)作為傳輸之用。但如此一來(lái)又造成客戶(hù)端想要連上服務(wù)器時(shí)的困擾, 因?yàn)榭蛻?hù)端得要知道服務(wù)器端的相關(guān)埠口才能夠聯(lián)機(jī)吧!
此時(shí)我們就得需要遠(yuǎn)程過(guò)程調(diào)用 (RPC) 的服務(wù)啦!RPC 最主要的功能就是在指定每個(gè) NFS 功能所對(duì)應(yīng)的 port number ,并且回報(bào)給客戶(hù)端,讓客戶(hù)端可以連結(jié)到正確的埠口上去。 那 RPC 又是如何知道每個(gè) NFS 的埠口呢?這是因?yàn)楫?dāng)服務(wù)器在啟動(dòng) NFS 時(shí)會(huì)隨機(jī)取用數(shù)個(gè)埠口,并主動(dòng)的向 RPC 注冊(cè),因此 RPC 可以知道每個(gè)埠口對(duì)應(yīng)的 NFS 功能,然后 RPC 又是固定使用 port 111 來(lái)監(jiān)聽(tīng)客戶(hù)端的需求并回報(bào)客戶(hù)端正確的埠口, 所以當(dāng)然可以讓 NFS 的啟動(dòng)更為輕松愉快了!
所以你要注意,要啟動(dòng) NFS 之前,RPC 就要先啟動(dòng)了,否則 NFS 會(huì)無(wú)法向 RPC 注冊(cè)。 另外,RPC 若重新啟動(dòng)時(shí),原本注冊(cè)的數(shù)據(jù)會(huì)不見(jiàn),因此 RPC 重新啟動(dòng)后,它管理的所有服務(wù)都需要重新啟動(dòng)來(lái)重新向 RPC 注冊(cè)。
當(dāng)客戶(hù)端有 NFS 檔案存取需求時(shí),他會(huì)如何向服務(wù)器端要求數(shù)據(jù)呢?
客戶(hù)端會(huì)向服務(wù)器端的 RPC (port 111) 發(fā)出 NFS 檔案存取功能的詢(xún)問(wèn)要求; 服務(wù)器端找到對(duì)應(yīng)的已注冊(cè)的 NFS daemon 埠口后,會(huì)回報(bào)給客戶(hù)端; 客戶(hù)端了解正確的埠口后,就可以直接與 NFS daemon 來(lái)聯(lián)機(jī)。
由于 NFS 的各項(xiàng)功能都必須要向 RPC 來(lái)注冊(cè),如此一來(lái) RPC 才能了解 NFS 這個(gè)服務(wù)的各項(xiàng)功能之 port number, PID, NFS 在服務(wù)器所監(jiān)聽(tīng)的 IP 等等,而客戶(hù)端才能夠透過(guò) RPC 的詢(xún)問(wèn)找到正確對(duì)應(yīng)的埠口。 也就是說(shuō),NFS 必須要有 RPC 存在時(shí)才能成功的提供服務(wù),因此我們稱(chēng) NFS 為 RPC server 的一種。事實(shí)上,有很多這樣的服務(wù)器都是向 RPC 注冊(cè)的,舉例來(lái)說(shuō),NIS (Network Information Service) 也是 RPC server 的一種呢
二、所需要的軟件及軟件結(jié)構(gòu)
要設(shè)定好 NFS 服務(wù)器我們必須要有兩個(gè)軟件才行,分別是:
RPC 主程序:rpcbind
就如同剛剛提的到,我們的 NFS 其實(shí)可以被視為一個(gè) RPC 服務(wù),而要啟動(dòng)任何一個(gè) RPC 服務(wù)之前,我們都需要做好 port 的對(duì)應(yīng) (mapping) 的工作才行,這個(gè)工作其實(shí)就是『 rpcbind 』這個(gè)服務(wù)所負(fù)責(zé)的!也就是說(shuō),在啟動(dòng)任何一個(gè) RPC 服務(wù)之前,我們都需要啟動(dòng) rpcbind 才行! (在 CentOS 5.x 以前這個(gè)軟件稱(chēng)為 portmap,在 CentOS 6.x 之后才稱(chēng)為 rpcbind 的!)
NFS 主程序:nfs-utils
就是提供 rpc.nfsd 及 rpc.mountd 這兩個(gè) NFS daemons 與其他相關(guān) documents 與說(shuō)明文件、執(zhí)行文件等的軟件!這個(gè)就是 NFS 服務(wù)所需要的主要軟件啦!一定要有喔! 主要配置文件:/etc/exports
這個(gè)檔案就是 NFS 的主要配置文件了!不過(guò),系統(tǒng)并沒(méi)有默認(rèn)值,所以這個(gè)檔案『不一定會(huì)存在』,你可能必須要使用 vim 主動(dòng)的建立起這個(gè)檔案喔!我們等一下要談的設(shè)定也僅只是這個(gè)檔案而已!
NFS 文件系統(tǒng)維護(hù)指令:/usr/sbin/exportfs
這個(gè)是維護(hù) NFS 分享資源的指令,我們可以利用這個(gè)指令重新分享 /etc/exports 變更的目錄資源、將 NFS Server 分享的目錄卸除或重新分享等等,這個(gè)指令是 NFS 系統(tǒng)里面相當(dāng)重要的一個(gè)喔!至于指令的用法我們?cè)诘紫聲?huì)介紹。
分享資源的登錄檔:/var/lib/nfs/*tab
在 NFS 服務(wù)器的登錄文件都放置到 /var/lib/nfs/ 目錄里面,在該目錄下有兩個(gè)比較重要的登錄檔, 一個(gè)是 etab ,主要記錄了 NFS 所分享出來(lái)的目錄的完整權(quán)限設(shè)定值;另一個(gè) xtab 則記錄曾經(jīng)鏈接到此 NFS 服務(wù)器的相關(guān)客戶(hù)端數(shù)據(jù)。
客戶(hù)端查詢(xún)服務(wù)器分享資源的指令:/usr/sbin/showmount
這是另一個(gè)重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 則主要用在 Client 端。這個(gè) showmount 可以用來(lái)察看 NFS 分享出來(lái)的目錄資源喔!
就說(shuō)不難吧!主要就是這幾個(gè)!
三、系統(tǒng)環(huán)境
系統(tǒng)CentOS6.8
IP 192.168.2.203
四、安裝NFS服務(wù)
1、查看系統(tǒng)是否已安裝NFS
[root@bogon ~]# rpm -qa | grep nfs
[root@bogon ~]# rpm -qa | grep rpcbind
[root@bogon ~]#
2、安裝NFS
[root@bogon ~]# yum -y install nfs-utils rpcbind
已加載插件:fastestmirror
設(shè)置安裝進(jìn)程
Loading mirror speeds from cached hostfile
… …
已安裝:
nfs-utils.x86_64 1:1.2.3-70.el6_8.2 rpcbind.x86_64 0:0.2.0-12.el6
作為依賴(lài)被安裝:
keyutils.x86_64 0:1.4-5.el6 libevent.x86_64 0:1.4.13-4.el6 libgssglue.x86_64 0:0.1-11.el6
libtirpc.x86_64 0:0.2.1-11.el6_8 nfs-utils-lib.x86_64 0:1.1.5-11.el6 python-argparse.noarch 0:1.2.1-2.1.el6
五、服務(wù)端配置
在NFS服務(wù)端上創(chuàng)建共享目錄/data/lys并設(shè)置權(quán)限
[root@bogon ~]# mkdir -p /data/lys
[root@bogon ~]# ll /data/
總用量 4
drwxr-xr-x. 2 root root 4096 10月 21 18:10 lys
[root@bogon ~]# chmod 666 /data/lys/
編輯export文件
[root@bogon ~]# vim /etc/exports
/data/lys 192.168.2.0/24(rw,no_root_squash,no_all_squash,sync)
常見(jiàn)的參數(shù)則有:
參數(shù)值 內(nèi)容說(shuō)明
rw ro 該目錄分享的權(quán)限是可擦寫(xiě) (read-write) 或只讀 (read-only),但最終能不能讀寫(xiě),還是與文件系統(tǒng)的 rwx 及身份有關(guān)。
sync async sync 代表數(shù)據(jù)會(huì)同步寫(xiě)入到內(nèi)存與硬盤(pán)中,async 則代表數(shù)據(jù)會(huì)先暫存于內(nèi)存當(dāng)中,而非直接寫(xiě)入硬盤(pán)!
no_root_squash root_squash 客戶(hù)端使用 NFS 文件系統(tǒng)的賬號(hào)若為 root 時(shí),系統(tǒng)該如何判斷這個(gè)賬號(hào)的身份?預(yù)設(shè)的情況下,客戶(hù)端 root 的身份會(huì)由 root_squash 的設(shè)定壓縮成 nfsnobody, 如此對(duì)服務(wù)器的系統(tǒng)會(huì)較有保障。但如果你想要開(kāi)放客戶(hù)端使用 root 身份來(lái)操作服務(wù)器的文件系統(tǒng),那么這里就得要開(kāi) no_root_squash 才行!
all_squash 不論登入 NFS 的使用者身份為何, 他的身份都會(huì)被壓縮成為匿名用戶(hù),通常也就是 nobody(nfsnobody) 啦!
anonuid anongid anon 意指 anonymous (匿名者) 前面關(guān)于 *_squash 提到的匿名用戶(hù)的 UID 設(shè)定值,通常為 nobody(nfsnobody),但是你可以自行設(shè)定這個(gè) UID 的值!當(dāng)然,這個(gè) UID 必需要存在于你的 /etc/passwd 當(dāng)中! anonuid 指的是 UID 而 anongid 則是群組的 GID 。
配置生效
[root@bogon lys]# exportfs -r
啟動(dòng)rpcbind、nfs服務(wù)
[root@bogon lys]# service rpcbind start
正在啟動(dòng) rpcbind: [確定]
[root@bogon lys]# service nfs start
啟動(dòng) NFS 服務(wù): [確定]
啟動(dòng) NFS mountd: [確定]
啟動(dòng) NFS 守護(hù)進(jìn)程: [確定]
正在啟動(dòng) RPC idmapd: [確定]
[root@bogon lys]#
查看RPC 服務(wù)的注冊(cè)狀況
[root@bogon lys]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 49979 mountd
100005 1 tcp 58393 mountd
100005 2 udp 45516 mountd
100005 2 tcp 37792 mountd
100005 3 udp 32997 mountd
100005 3 tcp 39937 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 51112 nlockmgr
100021 3 udp 51112 nlockmgr
100021 4 udp 51112 nlockmgr
100021 1 tcp 43271 nlockmgr
100021 3 tcp 43271 nlockmgr
100021 4 tcp 43271 nlockmgr
選項(xiàng)與參數(shù):
-p :針對(duì)某 IP (未寫(xiě)則預(yù)設(shè)為本機(jī)) 顯示出所有的 port 與 porgram 的信息;
-t :針對(duì)某主機(jī)的某支程序檢查其 TCP 封包所在的軟件版本;
-u :針對(duì)某主機(jī)的某支程序檢查其 UDP 封包所在的軟件版本;
NFS 服務(wù)器設(shè)定妥當(dāng)之后,可以在 server 端先自我測(cè)試一下是否可以聯(lián)機(jī)!就是利用 showmount 這個(gè)指令來(lái)查閱!
[root@bogon lys]# showmount -e localhost
Export list for localhost:
/data/lys 192.168.2.0/24
選項(xiàng)與參數(shù):
-a :顯示目前主機(jī)與客戶(hù)端的 NFS 聯(lián)機(jī)分享的狀態(tài);
-e :顯示某部主機(jī)的 /etc/exports 所分享的目錄數(shù)據(jù)。
六、客戶(hù)端配置
安裝nfs-utils客戶(hù)端
[root@bogon ~]# yum -y install nfs-utils
已安裝:
nfs-utils.x86_64 1:1.2.3-70.el6_8.2
作為依賴(lài)被安裝:
keyutils.x86_64 0:1.4-5.el6 libevent.x86_64 0:1.4.13-4.el6 libgssglue.x86_64 0:0.1-11.el6
libtirpc.x86_64 0:0.2.1-11.el6_8 nfs-utils-lib.x86_64 0:1.1.5-11.el6 python-argparse.noarch 0:1.2.1-2.1.el6
rpcbind.x86_64 0:0.2.0-12.el6
創(chuàng)建掛載目錄
[root@bogon ~]# mkdir /lys
查看服務(wù)器拋出的共享目錄信息
[root@bogon ~]# showmount -e 192.168.2.203
Export list for 192.168.2.203:
/data/lys 192.168.2.0/24
為了提高NFS的穩(wěn)定性,使用TCP協(xié)議掛載,NFS默認(rèn)用UDP協(xié)議
[root@bogon ~]# mount -t nfs 192.168.2.203:/data/lys /lys -o proto=tcp -o nolock
七、測(cè)試結(jié)果
查看掛載結(jié)果
[root@bogon ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
18G 1.1G 16G 7% /
tmpfs 112M 0 112M 0% /dev/shm
/dev/sda1 477M 54M 398M 12% /boot
192.168.2.203:/data/lys
18G 1.1G 16G 7% /lys
服務(wù)端
[root@bogon lys]# echo "test" > test.txt
客戶(hù)端
[root@bogon ~]# cat /lys/test.txt
test
[root@bogon ~]# echo "204" >> /lys/test.txt
服務(wù)端
[root@bogon lys]# cat /data/lys/test.txt
test
204
卸載已掛在的NFS
[root@bogon ~]# umount /lys/
[root@bogon ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
18G 1.1G 16G 7% /
tmpfs 112M 0 112M 0% /dev/shm
/dev/sda1 477M 54M 398M 12% /boot
結(jié)束.
補(bǔ)充部分:
為了方便配置防火墻,需要固定nfs服務(wù)端口
NFS啟動(dòng)時(shí)會(huì)隨機(jī)啟動(dòng)多個(gè)端口并向RPC注冊(cè),這樣如果使用iptables對(duì)NFS端口進(jìn)行限制就會(huì)有點(diǎn)麻煩,可以更改配置文件固定NFS服務(wù)相關(guān)端口。
[root@bogon lys]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 49979 mountd
100005 1 tcp 58393 mountd
100005 2 udp 45516 mountd
100005 2 tcp 37792 mountd
100005 3 udp 32997 mountd
100005 3 tcp 39937 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 51112 nlockmgr
100021 3 udp 51112 nlockmgr
100021 4 udp 51112 nlockmgr
100021 1 tcp 43271 nlockmgr
100021 3 tcp 43271 nlockmgr
100021 4 tcp 43271 nlockmgr
分配端口,編輯配置文件:
[root@bogon lys]# vim /etc/sysconfig/nfs
添加:
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004
重啟
[root@bogon lys]# service nfs restart
關(guān)閉 NFS 守護(hù)進(jìn)程: [確定]
關(guān)閉 NFS mountd: [確定]
關(guān)閉 NFS 服務(wù): [確定]
Shutting down RPC idmapd: [確定]
啟動(dòng) NFS 服務(wù): [確定]
啟動(dòng) NFS mountd: [確定]
啟動(dòng) NFS 守護(hù)進(jìn)程: [確定]
正在啟動(dòng) RPC idmapd: [確定]
查看結(jié)果
[root@bogon lys]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 30003 mountd
100005 1 tcp 30003 mountd
100005 2 udp 30003 mountd
100005 2 tcp 30003 mountd
100005 3 udp 30003 mountd
100005 3 tcp 30003 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 30002 nlockmgr
100021 3 udp 30002 nlockmgr
100021 4 udp 30002 nlockmgr
100021 1 tcp 30002 nlockmgr
100021 3 tcp 30002 nlockmgr
100021 4 tcp 30002 nlockmgr
可以看到,隨機(jī)端口以固定
iptables策略問(wèn)題完美解決!
centos 7 設(shè)置靜態(tài)的nlockmgr 略坑,無(wú)論是修改LOCKD_TCPPORT,還是修改/etc/modprobe.d/nfs 的option lockd都無(wú)效,最后看了這篇文章http://rlworkman.net/howtos/NFS_Firewall_HOWTO
在sysctl中新增
fs.nfs.nlm_udpport=32768
fs.nfs.nlm_tcpport=32768
fs.nfs.nfs_callback_tcpport=32764
重啟nfs服務(wù)即可