NFS就是Network File System的縮寫,它最大的功能就是能夠經過網絡,讓不一樣的機器、不一樣的操做系統能夠共享彼此的文件。vim
NFS服務器可讓PC將網絡中的NFS服務器共享的目錄掛載到本地端的文件系統中,而在本地端的系統中來看,那個遠程主機的目錄就好像是本身的一個磁盤分區同樣,在使用上至關便利;centos
NFS服務器的掛載結構圖:服務器
如上圖示:網絡
當咱們在NFS服務器設置好一個共享目錄/home/public後,其餘的有權訪問NFS服務器的NFS客戶端就能夠將這個目錄掛載到本身文件系統的某個掛載點,這個掛載點能夠本身定義,如上圖客戶端A與客戶端B掛載的目錄就不相同。而且掛載好後咱們在本地可以看到服務端/home/public的全部數據。若是服務器端配置的客戶端只讀,那麼客戶端就只可以只讀。若是配置讀寫,客戶端就可以進行讀寫。掛載後,NFS客戶端查看磁盤信息命令:#df –h。app
既然NFS是經過網絡來進行服務器端和客戶端之間的數據傳輸,那麼二者之間要傳輸數據就要有想對應的網絡端口,NFS服務器到底使用哪一個端口來進行數據傳輸呢?基本上NFS這個服務器的端口開在2049,但因爲文件系統很是複雜。所以NFS還有其餘的程序去啓動額外的端口,這些額外的用來傳輸數據的端口是隨機選擇的,是小於1024的端口;既然是隨機的那麼客戶端又是如何知道NFS服務器端到底使用的是哪一個端口呢?這時就須要經過遠程過程調用(Remote Procedure Call,RPC)協議來實現了!tcp
由於NFS支持的功能至關多,而不一樣的功能都會使用不一樣的程序來啓動,每啓動一個功能就會啓用一些端口來傳輸數據,所以NFS的功能對應的端口並不固定,客戶端要知道NFS服務器端的相關端口才能創建鏈接進行數據傳輸,而RPC就是用來統一管理NFS端口的服務,而且統一對外的端口是111,RPC會記錄NFS端口的信息,如此咱們就可以經過RPC實現服務端和客戶端溝通端口信息。PRC最主要的功能就是指定每一個NFS功能所對應的port number,而且通知客戶端,記客戶端能夠鏈接到正常端口上去。ui
那麼RPC又是如何知道每一個NFS功能的端口呢?spa
首先當NFS啓動後,就會隨機的使用一些端口,而後NFS就會向RPC去註冊這些端口,RPC就會記錄下這些端口,而且RPC會開啓111端口,等待客戶端RPC的請求,若是客戶端有請求,那麼服務器端的RPC就會將以前記錄的NFS端口信息告知客戶端。如此客戶端就會獲取NFS服務器端的端口信息,就會以實際端口進行數據的傳輸了。操作系統
提示:在啓動NFS SERVER以前,首先要啓動RPC服務(即portmap服務,下同)不然NFS SERVER就沒法向RPC服務區註冊,另外,若是RPC服務從新啓動,原來已經註冊好的NFS端口數據就會所有丟失。所以此時RPC服務管理的NFS程序也要從新啓動以從新向RPC註冊。特別注意:通常修改NFS配置文檔後,是不須要重啓NFS的,直接在命令執行/etc/init.d/nfs reload或exportfs –rv便可使修改的/etc/exports生效。rest
1)首先服務器端啓動RPC服務,並開啓111端口
2)服務器端啓動NFS服務,並向RPC註冊端口信息
3)客戶端啓動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口
4)服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。
5)客戶端經過獲取的NFS端口來創建和服務端的NFS鏈接並進行數據的傳輸。
[root@server7 ~]# cat /etc/redhat-release CentOS release 7.3.1611 (AltArch) root@server7 ~]# uname -a Linux server7.ctos.zu 3.10.0-514.el7.centos.plus.i686 #1 SMP Wed Jan 25 12:55:04 UTC 2017 i686 i686 i386 GNU/Linux
要養成一個習慣,就是先查看系統版本和內核參數。同一個軟件在不一樣版本,內核之間是有差別的,因此部署的方法也不同,不要由於這個而形成沒必要要的錯誤。
要部署NFS服務,必須安裝下面兩個軟件包:nfs-utils:NFS主程序,rpcbind:PRC主程序;
NFS服務器端和Client端都須要這安裝這兩個軟件。
注意:NFS的RPC服務器,Centos5下名字爲portmap,CentOS6和CentOS7下名稱爲rcpbind
NFS軟件包
nfs-utils:NFS主程序,包含rpc.nfsd rpc.mount兩個deamons
rpcbind:RPC主程序
[root@server7 ~]# rpm -qa | egrep "nfs|rpcbind"
[root@server7 ~]#
個人CentOS release 7.3.1611是最小化安裝,默認沒有安裝nfs和rpcbind
Yum搜尋下安裝包是否存在
[root@server7 ~]# yum search nfs-utils rpcbind
[root@server7 ~]# yum install nfs-utils rpcbind
[root@server7 ~]# rpm -qa | egrep "nfs|rpcbind"
rpcbind-0.2.0-38.el7_3.1.i686
nfs-utils-1.3.0-0.33.el7_3.i686
libnfsidmap-0.25-15.el7.i686
查看這兩個軟件包在電腦裏都安裝了什麼文件;
[root@server7 ~]# rpm -ql nfs-utils
[root@server7 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
Active: active (running) since 一 2017-09-04 10:03:20 CST; 1s ago
Process: 3583 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 3584 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─3584 /sbin/rpcbind -w
9月 04 10:03:19 server7.ctos.zu systemd[1]: Starting RPC bind service...
9月 04 10:03:20 server7.ctos.zu systemd[1]: Started RPC bind service.
[root@server7 ~]# systemctl restart rpcbind
[root@server7 ~]# yum install net-tools lsof
[root@server7 ~]# lsof -i:111
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 56u IPv6 43164 0t0 TCP *:sunrpc (LISTEN)
systemd 1 root 57u IPv4 43165 0t0 TCP *:sunrpc (LISTEN)
rpcbind 3584 rpc 4u IPv6 43164 0t0 TCP *:sunrpc (LISTEN)
rpcbind 3584 rpc 5u IPv4 43165 0t0 TCP *:sunrpc (LISTEN)
rpcbind 3584 rpc 8u IPv4 44975 0t0 UDP *:sunrpc
rpcbind 3584 rpc 10u IPv6 44977 0t0 UDP *:sunrpc
[root@server7 ~]# netstat -tlunp |grep rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 3584/rpcbind
udp 0 0 0.0.0.0:791 0.0.0.0:* 3584/rpcbind
udp6 0 0 :::111 :::* 3584/rpcbind
udp6 0 0 :::791 :::* 3584/rpcbind
[root@server7 ~]# 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
[root@server7 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@server7 ~]# systemctl start nfs
[root@server7 ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@server7 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Active: active (exited) since 一 2017-09-04 10:15:21 CST; 19s ago
Main PID: 3654 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
9月 04 10:15:21 server7.ctos.zu systemd[1]: Starting NFS server and services...
9月 04 10:15:21 server7.ctos.zu systemd[1]: Started NFS server and services.
[root@server7 ~]# 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
100024 1 udp 56626 status
100024 1 tcp 42691 status
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 57225 nlockmgr
100021 3 udp 57225 nlockmgr
100021 4 udp 57225 nlockmgr
100021 1 tcp 35665 nlockmgr
100021 3 tcp 35665 nlockmgr
100021 4 tcp 35665 nlockmgr
[root@server7 ~]# netstat -tulnp |grep -E '(rpc|nfs)'
tcp 0 0 0.0.0.0:42691 0.0.0.0:* LISTEN 3634/rpc.statd
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 3642/rpc.mountd
tcp6 0 0 :::39614 :::* LISTEN 3634/rpc.statd
tcp6 0 0 :::20048 :::* LISTEN 3642/rpc.mountd
udp 0 0 127.0.0.1:842 0.0.0.0:* 3634/rpc.statd
udp 0 0 0.0.0.0:20048 0.0.0.0:* 3642/rpc.mountd
udp 0 0 0.0.0.0:111 0.0.0.0:* 3584/rpcbind
udp 0 0 0.0.0.0:791 0.0.0.0:* 3584/rpcbind
udp 0 0 0.0.0.0:56626 0.0.0.0:* 3634/rpc.statd
udp6 0 0 :::56122 :::* 3634/rpc.statd
udp6 0 0 :::20048 :::* 3642/rpc.mountd
udp6 0 0 :::111 :::* 3584/rpcbind
udp6 0 0 :::791 :::* 3584/rpcbind
[root@server7 ~]# ps -ef |egrep "rpc|nfs「
rpc 3584 1 0 10:03 ? 00:00:00 /sbin/rpcbind -w
rpcuser 3634 1 0 10:15 ? 00:00:00 /usr/sbin/rpc.statd --no-notify
root 3637 2 0 10:15 ? 00:00:00 [rpciod]
root 3642 1 0 10:15 ? 00:00:00 /usr/sbin/rpc.mountd
root 3652 1 0 10:15 ? 00:00:00 /usr/sbin/rpc.idmapd
root 3657 2 0 10:15 ? 00:00:00 [nfsd4_callbacks]
root 3663 2 0 10:15 ? 00:00:00 [nfsd]
root 3664 2 0 10:15 ? 00:00:00 [nfsd]
root 3665 2 0 10:15 ? 00:00:00 [nfsd]
root 3666 2 0 10:15 ? 00:00:00 [nfsd]
root 3667 2 0 10:15 ? 00:00:00 [nfsd]
root 3668 2 0 10:15 ? 00:00:00 [nfsd]
root 3669 2 0 10:15 ? 00:00:00 [nfsd]
root 3670 2 0 10:15 ? 00:00:00 [nfsd]
root 3705 3267 0 10:23 pts/0 00:00:00 grep -E --color=auto rpc|nfs
最主要的NFS服務提供程序,這個daemon主要的功能就是管理客戶端是否可以使用服務器文件系統掛載信息,其中還包含判斷這個登陸用戶的ID。
這個daemon主要功能則是管理NFS的文件系統。當client端順利經過rpc.nfsd登入主機後,在它可使用NFS服務器提供規定文件以前,還會通過文件使用權限的認證程序。它會去讀取NFS的配置 文件/etc/exports來對比客戶端的權限,當經過這一關以後,client端也就取得使用NFS文件的權限。
這個daemon用於管理文件的鎖定方面,當多個客戶端同時嘗試寫入某個文件時就能夠對該文件形成一些問題。rpc.lockd則能夠用來克服這此問題。但rpc.lockd必需要同時在客戶端和服務器端都開 啓才行。
這個daemon能夠用來檢查文件的一致性,若發生由於客戶端同時使用同一個文件形成文件損壞時,rpc.statd能夠用來檢測並嘗試恢復該文件
NFS軟件很簡單,主要配置文件:/etc/exports,默認這個裏面內容是空的,若是沒有這個文件,可使用vim主動創建這個文件。至於NFS服務器的搭建也很簡單,只要編輯好主要配置文件/etc/exports以後,先啓動rpcbind(若已經啓動了,就不要從新啓動),而後再啓動nfs,NFS就成功了。
[root@server7 etc]# vi /etc/exports
/tmp/data 192.168.1.0/24(ro) client-A.ctos.zu(rw,sync)
#[共享目錄] [客戶端地址1(權限)] [客戶端地址2(權限)]
以上是一個簡單案例配置,每一行最前面是要共享出來的目錄,注意是以目錄爲單位的
共享目錄:存在於咱們本機上的目錄,咱們想共享給網絡上的其餘主機使用。如我要共享/tmp/data目錄,那麼此選項能夠就直接寫/tmp/data目錄,這個目錄能夠依照不一樣的權限共享給不一樣的主機。
客戶端地址1(參數1,參數2):客戶端地址可以設置一個網絡,也能夠設置單個主機。參數:如讀寫權限rw,同步更新sync,壓縮來訪帳號all_squash,壓縮後的匿名帳號anonuid=uid,anongid=gid等等;
客戶端地址的設置主要有如下幾種方式:
1)、 可使用完整的IP或者是網絡號,例如192.168.100.100 或 192.168.8.0/24
2)、 可使用主機名,但這個主機名必需要在/etc/hosts內,或可使用DNS找到該名稱才行,反正重點是可找到IP就行,若是是主機名的話,還能夠支持通配符,例如‘*’或‘?’都可接受;例如:host[1-8].ctos.zu,server?.test.com
參數命令 |
參數用途 |
rw |
表示可讀寫 |
ro |
Read-only表示只能讀權限 |
Sync |
請求或者寫入數據時,數據同步寫入到NFS server的硬盤中後纔會返回 |
no_root_squas |
訪問nfs server共享目錄的用戶若是是root的話,它對該目錄具備root權限。這個配置本來爲無盤用戶準備的。用戶應避免使用! |
root_squash |
對於訪問NFS server共享目錄的用戶,若是是root的話會被壓縮成爲nobody用戶身份。 |
all_squash |
無論訪問nfs server共享目錄的用戶身份如何包括root,它的權限都將被壓縮成爲匿名用戶,同時他們的udi和gid都會變成nobody或nfsnobody帳戶的uid,gid。在多個nfs客戶端同時讀寫nfs server數據時,這個參數頗有用能夠確保你們寫入的數據的權限是同樣的。 但不一樣系統有可能匿名用戶的uid,gid不一樣。由於此處咱們須要服務端和客戶端之間的用戶是同樣的。好比說:服務端指定匿名用戶的UID爲2000,那麼客戶端也必定要存在2000這個帳號才能夠 |
anonuid |
anonuid就是匿名的uid和gid。說明客戶端以什麼權限來訪問服務端,在默認狀況下是nfsnobody。Uid65534. |
anongid |
同anongid,就是把uid換成gid而已 |
配置實例:
/home/test 1192.168.1.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000)
###注意紅色部分不能有空格!!生產環境中經常使用的一種配置,適合多客戶端共享一個NFS目錄。All_squash 也就是說無論客戶端是以什麼樣的身份來進行訪問的,都會被壓縮成爲all_squash後面所接的用戶和羣組身份。這邊用anonuid、anongid編號來標示。=
服務器共享配置格式:
1)基本格式:共享目錄 ip/24(共享屬性) ->注意無空格
2)共享權限設置:
rw讀寫屬性
sync文件實際寫入磁盤後才返回
all_squash:全部訪問用戶均被壓縮成後續接的用戶。
anonuid:默認壓縮的用戶
anongid:默認壓縮的用戶組
那麼客戶端以什麼身份來訪問?
客戶端訪問服務端默認是使用nfsnobody這個用戶來進行訪問的。uid和gid爲65534。服務器默認共享時,也是加上了all_squash這個參數。並制定anonuid爲65534(也就是nfsnobayd用戶)。固然若是系統中nfsnobody是其餘的uid,那麼就有可能形成訪問權限出現問題。因此最好咱們能夠經過一設置一個用戶來訪問,統一UID、GID。
掛載狀況怎樣呢?
有兩個重要的文件,可以解決這個疑問。/var/lib/nfs/etab、/var/lib/nfs/rmtab這兩個文件就可以查看服務器上共享了什麼目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。
一、etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可使用,而且設定的參數爲什麼。
二、rmtab這個文件就是可以查看到共享目錄被掛載的狀況。