NFS(網絡文件系統)用於Unix/Linux之間的文件共享,NFS在文件傳送過程中依賴與RPC(遠程過程調用)協議。NFS本身是沒有提供信息傳送的協議和功能。只要用到NFS的地方都需要啓動RPC服務,不論是NFS的服務端還是客戶端。
在啓動NFS服務之前,首先要啓動RPC服務(CentOS5是portmap服務,CentOS6.6以後的版本是rpcbind服務),否則NFS服務器無法向RPC服務註冊。另外,RPC服務如果重啓,原來以及有的NFS端口就會丟失,因此,只要RPC服務重啓,NFS服務就要重啓向RPC重新註冊新的隨機端口號。一般修改NFS配置文件後,不需要重啓服務,直接平滑重啓即可,命令:/etc/init.d/nfs reload或者exportfs -rv就可以修改/etc/exports生效。
相關軟件包:nfs-utils(NFS服務主程序)、rpcbind(PRC服務程序)
nfsd
監聽的端口: 2049/tcp, 2049/udpportmapper
監聽的端口: 111/tcp, 111/udp- 相關配置文件:
- /etc/exports
- /etc/sysconfig/nfs
- /etc/nfsmount.conf
- /etc/nfs.conf
1. 安裝並啓動nfs-utils、rpcbind
CentOS和Ubuntu安裝的軟件包有差異,下面分別介紹兩個系統下的安裝方法,其他操作基本沒有差異
==》 CentOS下安裝的軟件包爲nfs-utils和rpcbind
# yum -y install nfs-utils rpcbind
啓動順序很關鍵,必須先啓動rpcbind服務,使得nfs服務可以像rpc服務註冊端口
# systemctl restart rpcbind
# systemctl restart nfs
==》 Ubuntu下安裝的軟件包爲nfs-kernel-server和rpcbind
$ sudo apt install -y nfs-kernel-server rpcbind
啓動順序很關鍵,必須先啓動rpcbind服務,使得nfs服務可以像rpc服務註冊端口
$ systemctl restart rpcbind
$ systemctl restart nfs-kernel-server
查看NFS服務向rpc註冊的端口信息,主端口號是:111
# rpcinfo -p 192.168.10.10
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 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 37633 nlockmgr
100021 3 udp 37633 nlockmgr
100021 4 udp 37633 nlockmgr
100021 1 tcp 44262 nlockmgr
100021 3 tcp 44262 nlockmgr
100021 4 tcp 44262 nlockmgr
2. 添加共享條目
編輯/etc/exports文件添加共享條目
# vim /etc/exports
/shared 192.168.10.0/24(rw,sync,all_squash,anonuid=505,anongid=505) 192.168.20.0/24(rw)
修改共享目錄權限和屬主屬組
# mkdir /shared
# chown -R nfsnobody:nfsnobody /shared
# chmod -R 760 /shared
# 重新導出共享目錄
# exportfs -arv
測試
# showmount -e 192.168.10.10
Export list for 192.168.10.10:
/shared 192.168.10.0/24
測試成功
條目格式:(man exports查看man手冊)
共享目錄 NFS客戶端地址(屬性1,屬性2)
- ro: 只讀
- rw: 讀寫(還需要配置共享目錄有讀寫權限)
- sync: 數據同步寫入NFS服務器端的硬盤中
- async: 數據先寫到緩存區,再寫到磁盤裏中
- root_squash: NFS客戶端連接服務端時如果使用的是root的話,那麼對服務端分享的目錄來說,擁有匿名用戶權限,通常他將使用nobody或nfsnobody身份
- no_root_squash: NFS客戶端連接服務端時如果使用的是root的話,那麼對服務端分享的目錄來說,也擁有root權限。顯然開啓這項是不安全的
- all_squash: 不論NFS客戶端連接服務端時使用什麼用戶,對服務端分享的目錄來說都是擁有匿名用戶權限
- anonuid:指定匿名用戶的UID值,通常是nobody或nfsnobody,可以在此處自行設定
- anongid: 指定匿名用戶的GID值
3. 客戶端掛載使用
客戶端也要安裝nfs-utils、rpcbind
# yum -y install nfs-utils rpcbind
客戶端只需要啓動rpcbind服務即可,不需要啓動nfs服務
# systemctl restart rpcbind
列出服務端的共享目錄
# showmount -e 192.168.10.10
Export list for 192.168.10.10:
/shared 192.168.10.0/24
掛載文件系統到本地
# mount -t nfs 192.168.10.10:/shared /nfs
# df -h
192.168.10.10:/shared 17G 5.4G 12G 32% /nfs
4. 相關命令
showmount
顯示NFS服務器的掛載信息
showmount -e NFS_SERVER: 查看NFS服務器“導出”的各文件系統
showmount -a NFS_SERVER: 查看NFS服務器所有被掛載的文件系統及其掛載的客戶端對應關係列表
showmount -d NFS_SERVER: 顯示NFS服務器所有導出的文件系統中被客戶端掛載了文件系統列表
exportfs
在修改了/etc/exports文件後執行此命令即可重新導出或者取消導出所有文件系統,而不需要重新啓動nfs服務
-a:跟-r或-u選項同時使用,表示重新掛載所有文件系統或取消導出所有文件系統;
-r: 重新導出
-u: 取消導出
-v: 顯示詳細信息
rpcinfo
顯示RPC信息
-p:用rpc協議來探測主機host上使用的rpcbind,並顯示所有已註冊的RPC程序
nfsstat
查看NFS的運行狀態,對於調整NFS的運行有很大幫助
5.NFS性能調優
使用dd命令測試讀寫性能,並根據讀寫性能修改配置文件以允許最大nfs客戶端連接數
# time dd if=/dev/zero of=/nfs/test bs=10k count=10000
10000+0 records in
10000+0 records out
102400000 bytes (102 MB) copied, 0.604919 s, 169 MB/s
real 0m0.608s
user 0m0.002s
sys 0m0.078s
修改配置文件/etc/sysconfig/nfs中的參數RPCNFSDCOUNT,該參數默認值爲8
Q&A常見問題
- 客戶端掛載時,報錯誤
mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive
- 通過命令
rpcinfo -p
來查看portmap服務是否正常啓動以及相應的端口(默認111) - 檢查防火牆設置,允許tcp,udp的111端口訪問
- 檢查/etc/hosts.deny,/etc/hosts.allow看客戶端連接是否被阻止了
- 客戶端執行命令
showmount -e NFS_SERVER_IP
時,報錯誤:mount clntudp_create: RPC: Program not registered
- nfs或rpcbind服務沒有啓動,使用chkconfig把nfs、rpcbind加到系統服務中並用service來啓動
- 客戶端執行命令
showmount -e NFS_SERVER_IP
時,報錯誤:rpc mount export: RPC: Unable to receive; errno = No route to host
- 配置文件:/etc/sysconfig/nfs找到nfs服務相關端口設置的地方,並移除註釋並配置指定端口,然後在iptables防火牆設置中指定允許相應端口的Udp,tcp流通過。
- 執行
showmount -e NFS_SERVER_IP
成功,但是掛載時報錯:mount: mount to NFS server '192.168.10.10' failed: System Error: No route to host.
- 這是由於nfs服務的默認端口2049被防火牆阻塞了,修改iptables允許2049端口通過
- 執行
showmount -e NFS_SERVER_IP
成功,但是掛載時報錯:mount: mount to NFS server '192.168.10.10' failed: timed out (retrying).
- 編輯iptables相關端口的tcp端口允許通過,而udp不允許。
- 服務端的/etc/exports配置文件中目錄權限屬性設置爲rw(默認爲root_squash),但是在客戶端mount目錄執行touch命令時報錯誤:
touch: cannot touch a: Permission denied
- 檢查服務器端共享目錄是否有寫入權限
ll -d /shared
- 修改服務器端共享目錄權限
chown -R 760 /shared
(文件所有者root有全權限、文件所有組用戶有讀寫權限、其他用戶無權限,然後把目錄的組設置爲nfsnobody) - 修改服務器端共享目錄屬主屬組爲nfsnobody
chown -R nfsnobody:nfsnobody /shared