一、NFS工作原理
1、什么是NFS服務器
NFS就是Network File System的縮寫,它最大的功能就是可以通過網絡,讓不同的機器、不同的操作系統可以共享彼此的文件。
NFS服務器可以讓PC將網絡中的NFS服務器共享的目錄掛載到本地端的文件系統中,而在本地端的系統中來看,那個遠程主機的目錄就好像是自己的一個磁盤分區一樣,在使用上相當便利;
2、NFS掛載原理
NFS服務器的掛載結構圖:
如上圖示:
當我們在NFS服務器設置好一個共享目錄/home/public后,其他的有權訪問NFS服務器的NFS客戶端就可以將這個目錄掛載到自己文件系統的某個掛載點,這個掛載點可以自己定義,如上圖客戶端A與客戶端B掛載的目錄就不相同。並且掛載好后我們在本地能夠看到服務端/home/public的所有數據。如果服務器端配置的客戶端只讀,那么客戶端就只能夠只讀。如果配置讀寫,客戶端就能夠進行讀寫。掛載后,NFS客戶端查看磁盤信息命令:#df –h。
既然NFS是通過網絡來進行服務器端和客戶端之間的數據傳輸,那么兩者之間要傳輸數據就要有想對應的網絡端口,NFS服務器到底使用哪個端口來進行數據傳輸呢?基本上NFS這個服務器的端口開在2049,但由於文件系統非常復雜。因此NFS還有其他的程序去啟動額外的端口,這些額外的用來傳輸數據的端口是隨機選擇的,是小於1024的端口;既然是隨機的那么客戶端又是如何知道NFS服務器端到底使用的是哪個端口呢?這時就需要通過遠程過程調用(Remote Procedure Call,RPC)協議來實現了!
3、RPC與NFS如何通訊
因為NFS支持的功能相當多,而不同的功能都會使用不同的程序來啟動,每啟動一個功能就會啟用一些端口來傳輸數據,因此NFS的功能對應的端口並不固定,客戶端要知道NFS服務器端的相關端口才能建立連接進行數據傳輸,而RPC就是用來統一管理NFS端口的服務,並且統一對外的端口是111,RPC會記錄NFS端口的信息,如此我們就能夠通過RPC實現服務端和客戶端溝通端口信息。PRC最主要的功能就是指定每個NFS功能所對應的port number,並且通知客戶端,記客戶端可以連接到正常端口上去。
那么RPC又是如何知道每個NFS功能的端口呢?
首先當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生效。
4、NFS客戶端和NFS服務端通訊過程
1)首先服務器端啟動RPC服務,並開啟111端口
2)服務器端啟動NFS服務,並向RPC注冊端口信息
3)客戶端啟動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口
4)服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。
5)客戶端通過獲取的NFS端口來建立和服務端的NFS連接並進行數據的傳輸。
二、NFS部署
1、 查看系統信息
[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
要養成一個習慣,就是先查看系統版本和內核參數。同一個軟件在不同版本,內核之間是有差異的,所以部署的方法也不一樣,不要因為這個而造成不必要的錯誤。
2、NFS軟件安裝
要部署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主程序
2.1、查看NFS軟件包
[root@server7 ~]# rpm -qa | egrep "nfs|rpcbind"
[root@server7 ~]#
我的CentOS release 7.3.1611是最小化安裝,默認沒有安裝nfs和rpcbind
Yum搜尋下安裝包是否存在
[root@server7 ~]# yum search nfs-utils rpcbind
2.2、安裝NFS和RPC服務
[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
3、啟動NFS服務
3.1、啟動NFS服務之前先啟動rpcbind服務
查看rcpbind狀態
[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.
注:rpcbind安裝成功后默認已經開啟,並且為開機自動啟動。如果沒有啟動的話,我們來重新啟動rcpbind服務
[root@server7 ~]# systemctl restart rpcbind
查看PRC端口
[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
未啟動NFS之前查看NFS服務向PRC注冊的端口信息
[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
3.2、RPC服務啟動后再啟動NFS服務
查看狀態
[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)
默認未啟動,系統開機重啟后不啟動,啟動nfs服務,將設置為開機啟動。
[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.
啟動NFS后我們再次查看rpc注冊的端口信息
[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
在確認啟動沒用問題后我們看一看NFS到底開了哪些端口
[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
4、NFS常見進程詳解
[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
- nfsd
最主要的NFS服務提供程序,這個daemon主要的功能就是管理客戶端是否能夠使用服務器文件系統掛載信息,其中還包含判斷這個登錄用戶的ID。
- rpc.mountd
這個daemon主要功能則是管理NFS的文件系統。當client端順利通過rpc.nfsd登入主機后,在它可以使用NFS服務器提供規定文件之前,還會經過文件使用權限的認證程序。它會去讀取NFS的配置 文件/etc/exports來對比客戶端的權限,當通過這一關之后,client端也就取得使用NFS文件的權限。
- rpc.lockd (非必要)
這個daemon用於管理文件的鎖定方面,當多個客戶端同時嘗試寫入某個文件時就可以對該文件造成一些問題。rpc.lockd則可以用來克服這此問題。但rpc.lockd必須要同時在客戶端和服務器端都開 啟才行。
- rpc.statd(非必要)
這個daemon可以用來檢查文件的一致性,若發生因為客戶端同時使用同一個文件造成文件損壞時,rpc.statd可以用來檢測並嘗試恢復該文件
5、配置NFS服務
NFS軟件很簡單,主要配置文件:/etc/exports,默認這個里面內容是空的,如果沒有這個文件,可以使用vim主動建立這個文件。至於NFS服務器的搭建也很簡單,只要編輯好主要配置文件/etc/exports之后,先啟動rpcbind(若已經啟動了,就不要重新啟動),然后再啟動nfs,NFS就成功了。
那么/etc/exports應該如何設置?
[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
NFS權限設置
NFS配置權限設置,即/etc/exports文件配置格式中小括號()里的參數集;
參數命令 |
參數用途 |
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這兩個文件就能夠查看服務器上共享了什么目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。
1、etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可以使用,並且設定的參數為何。
2、rmtab這個文件就是能夠查看到共享目錄被掛載的情況。
一、NFS介紹
1)什么是NFS
它的主要功能是通過網絡讓不同的機器系統之間可以彼此共享文件和目錄。NFS服務器可以允許NFS客戶端將遠端NFS服務器端的共享目錄掛載到本地的NFS客戶端中。在本地的NFS客戶端的機器看來,NFS服務器端共享的目錄就好像自己的磁盤分區和目錄一樣。一般客戶端掛載到本地目錄的名字可以隨便,但為方便管理,我們要和服務器端一樣比較好。
NFS一般用來存儲共享視頻,圖片等靜態數據。
《什么是NFS》
就是通過網絡共享目錄,讓網絡上的其他服務器能夠掛載訪問共享目錄內的數據。(一般共享視頻,圖片等靜態數據)
這個再往簡單點,就相當於windows里面共享文件,然后其他主機把這個共享文件映射成了本地盤使用一樣。接下來我們會學習兩部分:NFS原理(共享原理)、服務端如何架NFS(怎么共享)、客戶端怎么掛載(怎么映射網盤)
掛載結構圖
2)NFS掛載原理介紹
如上圖,當我們在nfs服務器設置好一個共享目錄/data后,其他的有權訪問NFS服務器的NFS客戶端就可以將這個目錄掛載到本地。並且能夠看到服務端/data的所有數據。因為掛載在本地的/data目錄,其實就是服務器端的/data目錄。如果服務器端配置的客戶端只讀,那么客戶端就只能夠只讀。如果配置讀寫,客戶端就能夠進行讀寫。掛載后,NFS客戶端查看磁盤信息命令:#df –h
NFS是通過網絡來進行服務端和客戶端之間的數據傳輸。兩者之間要傳輸數據就要有想對應的網絡端口來進行傳輸。NFS服務器到底使用什么網絡端口來傳輸數據的,NFS服務器端其實是隨機選擇端口來進行數據傳輸。那NFS客戶端又是如何知道NFS服務器端到底使用的是哪個端口呢?其實NFS服務器時通過遠程過程調用(remote procedure call 簡稱RPC)協議/服務來實現的。也就是說RPC服務會統一管理NFS的端口,客戶端和服務端通過RPC來先溝通NFS使用了哪些端口,之后再利用這些端口(小於1024)來進行數據的傳輸。
PS:哦,原來是RPC管理服務端的NFS端口分配,客戶端要傳數據,那客戶端的RPC會先跟服務端的RPC去要服務器的端口,要到端口后再建立連接,然后傳輸數據。
《rpc與nfs》
pc(portmap)就是用來統一管理NFS端口的服務,並且統一對外的端口是111。NFS服務端需要先啟動rpc,再啟動NFS,這樣NFS才能夠到RPC去注冊端口信息。客戶端的RPC可以通過向服務端的RPC請求獲取服務端的NFS端口信息。當獲取到了NFS端口信息后,就會以實際端口進行數據的傳輸。(由於NFS端口為隨機的。)
《RPC和NFS如何通訊》
因為NFS有很多功能,不同的功能需要使用不同的端口。因此NFS無法固定端口。而RPC會記錄NFS端口的信息,這樣我們就能夠通過RPC實現服務端和客戶端的RPC來溝通端口信息。
那RPC和NFS之間又是如何之間相互通訊的?
首先當NFS啟動后,就會隨機的使用一些端口,然后NFS就會向RPC去注冊這些端口。RPC就會記錄下這些端口。並且RPC會開機111端口,等待客戶端RPC的請求,如果客戶端有請求,那服務端的RPC就會將記錄的NFS端口信息告知客戶端。
提示:在啟動NFS SERVER之前,首先要啟動RPC服務(即portmap服務,下同)否則NFS SERVER就無法向RPC服務區注冊,另外,如果RPC服務重新啟動,原來已經注冊好的NFS端口數據就會全部丟失。因此此時RPC服務管理的NFS程序也要重新啟動以重新向RPC注冊。特別注意:一般修改NFS配置文檔后,是不需要重啟NFS的,直接在命令執行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。 |
PS:這里有個啟動順序的點,先給大家講清楚。因為NFS要想RPC注冊端口信息。所以RPC一定要先於NFS早啟動。我給大家比喻一個左手疊右手的游戲,此時就是一定要確保NFS的手掌(左)在RPC手掌(右)的上面。正常順序是要RPC先疊上去,然后NFS再疊上去。如果RPC重啟了,就相當於手掌抽出來了,然后重新疊上去。這樣RPC就在NFS上面了,所以不行。此時我們的NFS就需要再重新啟動一次。這樣NFS抽出來然后再疊上去之后,NFS就在RPC上面了。如果NFS修改了配置,就直接reload就好了
《客戶端NFS和服務端NFS通訊過程》
1)首先服務器端啟動RPC服務,並開啟111端口
2)啟動NFS服務,並向RPC注冊端口信息
3)客戶端啟動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口
4)服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。
5)客戶端通過獲取的NFS端口來建立和服務端的NFS連接並進行數據的傳輸。
------------------------------------小結-------------------------------------------------
NFS的原理結構其實還是挺簡單啊哦,NFS就是網絡共享目錄,就是共享文件.服務端共享,客戶端掛載使用。掛載流程原理,就是上面提到的5個流程。並且為什么是這個流程也講了。因為NFS要向RPC去注冊端口信息。因為NFS的端口是隨機獲取的。
----------------------------------------------------------------------------------------
二、NFS部署
客戶端
直接安裝下portmap軟件和NFS軟件,具體怎么按照參照服務器端。
服務器端
1)查看系統系信息
#uname -r查看系統內核版本
[root@CT5_6-32-220-NFS01 ~]# cat/etc/redhat-release
CentOS release 5.6 (Final)
[root@CT5_6-32-220-NFS01 ~]# uname -r
2.6.18-238.el5
要養成一個習慣,就是先查看系統版本和內核參數。同一個軟件在不同版本,內核之間是有差異的,所以部署的方法也不一樣,不要因為這個而造成不必要的錯誤。在做應用遷移之前也要對環境系統做一個完整的登記,並且新環境中的一些參數要和舊的環境一模一樣避免錯誤。
#uname -a查看操作系統信息
[root@CT56-32-220-NFS01 ~]# uname -a
Linux CT56-32-220-NFS01 2.6.18-238.el5 #1 SMP ThuJan 13 16:24:47 EST 2011 i686 i686 i386 GNU/Linux
2)NFS軟件安裝
要部署NFS服務,必須安裝下面兩個軟件包:Nfs-utils:NFS主程序、Portmap:RPC主程序
NFS服務器端和client端都需要安裝這兩個軟件。
《NFS軟件包》
1、nfs-utils:NFS的主程序,包含rpc.nfsd rpc.mount兩個deamons
2、portmap:RPC主程序,可以將NFS視為RPC下的一個子程序
2.1)查看NFS軟件包
[root@CT5_6-32-220-NFS01 ~]# rpm -qa | egrep "nfs|portmap" ####可以看到系統默認已經安裝了。
portmap-4.0-65.2.2.1
nfs-utils-lib-1.0.8-7.6.el5
nfs-utils-1.0.9-50.el5
如果沒有安裝的話,可以使用yum Install nfs-utils portmap安裝包名稱來安裝。
3)NFS啟動
因為NFS及其輔助程序都是基於RPC協議(使用RPC的111端口來進行請求的監聽)所以首先要確保系統中運行了portmap服務。客戶端和服務端都要啟動portmap服務,客戶端不用啟動nfs服務,而服務端需要啟動nfs服務。
portmap啟動命令:
#/etc/init.d/portmap start
[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/portmapstart
Starting portmap: [ OK ] ##服務已經正常啟動了
#netstat–lnt來查看系統中啟用的端口
[root@CT56-32-220-NFS01 ~]# netstat -lnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN ###可以看到多了一個111端口,這個端口就是RPC的監聽端口。
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:823 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
提示:如果portmap服務沒有啟動,我們通過rpcinfo –p(rpc informationRPC信息)Localhost檢查時,會報錯。
[root@CT56-32-220-NFS01 ~]# rpcinfo -p ##正常的顯示信息
programvers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 820 status
[root@CT56-32-220-NFS01 ~]# rpcinfo –p ##出錯的信息
rpcinfo: can't contact portmapper: RPC: Remotesystem error - Connection refused
Rpfinfo 就是用來查看在rpc注冊的端口信息。如果nfs系統服務啟動后,就會像rpc去注冊信息,此時就能夠差查看到注冊了哪些信息。
-------------
NFS啟動命令:
------------
#/etc/init.d/nfs start
#/etc/init.d/nfs status
[root@CT56-32-220-NFS01 ~]# /etc/init.d/nfs status ####我們這里查看nfs的狀態,這里卻顯示了3個程序的狀態,那是因為NFS包含了mountd掛載,quotad配額的管理機制的程序。
rpc.mountd is stopped-->管理client端是否能夠登入的問題
nfsd is stopped###這個是主程序->管理client端能夠取得的權限
rpc.rquotad is stopped
說明:從NFS服務啟動的信息中我們可以看到NFS默認需要啟動的進程有rpc,mountd,nfsd,rpc,rquotad,rpc,idmapd。NFS服務器啟動時最少需要兩個daemons,一個管理client端是否能夠登入的問題,另一個管理client端能夠取得的權限。如果還需要管理quota的話,NFS還要加載rpc.rquotad程序。
[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/nfs status
rpc.mountd (pid 12920) is running...
nfsd (pid 12917 12916 12915 12914 12913 12912 12911 12910) isrunning...
rpc.rquotad (pid 12892) is running...
1、nfsd(rpc.conf)
這個daemon的主要功能就是管理client端是否能夠登入主機,其中還包含登入者的ID判別。
2、rpc.mount
這個daemon主要功能則是管理NFS的文件系統。當client端順利通過rpc.nfsd登入主機后,在它可以使用NFS服務器提供規定文件之前,還會經過文件使用權限的認證程序。它會去讀取NFS的配置文件/etc/exports來對比客戶端的權限,當通過這一關之后,client端也就取得使用NFS文件的權限。這就是為什么單單在/etc/exports中設置NFS的權限是不夠的。
NFS啟動&信息查看 /etc/init.d/portmap start rpcinfo –p /etc/init.d/nfs status /etc/init.d/nfs start |
RPC主程序的是三個進程 rpc.mountd #nfs掛載程序 nfsd nfs #主程序 rpc.rqutod #配額 |
------------------------
配置NFS開機啟動
------------------------
#chkconfig nfs on
#chkconfig protmap on
(客戶端只需要portmap自啟動就可以了)
[root@CT5_6-32-220-NFS01 ~]# chkconfig portmapon
[root@CT5_6-32-220-NFS01 ~]# chkconfig nfs on
[root@CT5_6-32-220-NFS01 ~]# chkconfig --list | egrep "nfs|port" ####注意|兩邊不能加上空格要不會查詢不到。
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off
portmap 0:off 1:off 2:on 3:on 4:on 5:on 6:off
三、配置NFS服務
NFS配置文件的路徑
#/etc/exports 默認這個里面的內容是空的,這個就是nfs的配置文件。
格式:NFS共享目錄 客戶端地址1(參1,參2只讀還是可寫) 客戶端地址2(參1,參2)
參數選項說明:
共享目錄:存在於我們本機上的目錄,我們想共享給網絡上的其他主機使用。如我要共享/tmp/data目錄,那么此選項可以就直接寫/tmp/data目錄。
客戶端地址1(參數1,參數2):客戶端地址能夠設置一個網絡,也可以設置單個主機。參數:如讀寫權限rw,同步更新sync,壓縮來訪賬號all_squash,壓縮后的匿名賬號anonuid=uid,anongid=gid等等
客戶端地址選項說明:
客戶端地址 |
具體地址例子 |
說明 |
授權單一客戶端訪問NFS |
10.0.0.30 |
一般情況下,生產環境中此配置不多 |
授權整個網段可訪問NFS |
10.0.0.0/24 |
其中的/24表示掩碼為255.255.255.0.在生產環境中最常見的配置。 |
授權整個網段 |
10.0.0.* |
指定網段的另外寫法(需要驗證) |
生產環境常見配置實例:
常用格式說明 |
要共享的目錄客戶端ip地址或IP段(參1,參2)黃色區域是沒有空格的 |
配置實例1 |
/tmp/share 10.0.0.0/24(rw,sync) ###紅色部門不能有空格 sync表示同步更新到磁盤,同步將內存內的文件寫入到磁盤空間,保證數據不丟失,但會影響性能。 |
配置實例2 |
/home/ryan 10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000) ###生產環境中常用的一種配置,適合多客戶端共享一個NFS目錄。All_squash 也就是說不管客戶端是以什么樣的身份來進行訪問的,都會被壓縮成為all_squash后面所接的用戶和群組身份。這邊用anonuid、anongid編號來標示。 |
配置實例3 |
/home/atong 10.0.0.0/24(ro) |
NFS權限設置
NFS配置權限設置,即/etc/exports文件配置格式中小括號()里的參數集。
參數命令 |
參數用途 |
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而已。 |
提示:
1、另外可以通過man exports查閱exports參數說明。
2、當我們nfs配置好之后,我們可以通過cat /var/lib/nfs/etab來查看,nfs配置的參數。並且這個目錄很重要。/var/lib/nfs/rmtab從這個文件中我們可以看到,有哪些客戶端掛載了nfs共享目錄。這個兩個文件是比較重要的。
----------------------
服務器共享配置格式:
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這兩個文件就能夠查看服務器上共享了什么目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。
1、etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可以使用,並且設定的參數為何。
2、rmtab這個文件就是能夠查看到共享目錄被掛載的情況。
四、NFS配置實例
實例1、共享/atong 目錄給10.0.0.0/24這個網段。
服務器端操作:
1)檢查,啟動portmap
[root@CT5_6-32-220-NFS01 /]# /etc/init.d/portmapstatus
portmap (pid 2506) is running...
root@CT5_6-32-220-NFS01 /]# rpcinfo-p
-bash: rpcinfo-p: command not found
[root@CT5_6-32-220-NFS01 /]# rpcinfo –p ###查看RPC記錄的信息。哇,這么多不過可以看到有nfs rquotad,mount這些信息說明nfs有來注冊信息。
programvers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 601 status
100024 1 tcp 604 status
100011 1 udp 773 rquotad rquotad
100011 2 udp 773 rquotad
100011 1 tcp 776 rquotad
100011 2 tcp 776 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100005 1 tcp 803 mountd
100005 2 udp 800 mountd
100005 2 tcp 803 mountd
100005 3 udp 800 mountd
100005 3 tcp 803 mountd
2)查看NFS的運行狀態
[root@CT5_6-32-220-NFS01 /]# /etc/init.d/nfs status
rpc.mountd (pid 12920) is running...
nfsd (pid 12917 12916 12915 12914 12913 12912 1291112910) is running...
rpc.rquotad (pid 12892) is running...
3)創建目錄
[root@CT5_6-32-220-NFS01 /]# mkdir atong
[root@CT5_6-32-220-NFS01 /]# ls -d atong
atong
[root@CT5_6-32-220-NFS01 /]# ll -d atong
drwxr-xr-x 2 root root 4096 May 27 17:22 oldbo ####注意現在共享的目錄的權限為只有root才有寫權限。
4)配置/etc/exports(NFS配置文件)
修改完配置之后要重新reload一下。/etc/init.d/nfs reload
[root@CT5_6-32-220-NFS01 /]# cat /etc/exports
[root@CT5_6-32-220-NFS01 /]# cat /etc/exports
/atong 192.168.40.0/22(rw.sync)
[root@CT5_6-32-220-NFS01 /]# /etc/init.d/nfs reload
exportfs: /etc/exports:1: unknown keyword "rw.sync"###roload的時候提示錯誤,重新編寫了一下配置文件,就又正確了。以后要養成好的編寫配置要備份的習慣。
[root@CT5_6-32-220-NFS01 /]# vi /etc/exports
/atong 192.168.41.0/22(rw,sync)
[root@CT5_6-32-220-NFS01 /]# /etc/init.d/nfs reload 重新reload就成功了。
到此NFS已經算是共享了目錄,及設置了相應的權限。
客戶端操作:
----------------------------------------------------------------------------------------
現在我們的服務器端在配置文件上已經設置了共享,並在配置文件中設置了權限rw。但其實服務器端的目錄文件的rwxr-xr-x權限是還沒有開放的。這個跟我們的windows共享也是很像的,不僅要共享權限有,目錄本地安全權限也要有。現在就是讓客戶端來進行掛載就可以了。
----------------------------------------------------------------------------------------
1)查看portmap是否正常啟動
[root@CT56-32-220-NFS01 ~]# /etc/init.d/portmap status
portmap (pid 2725) is running...
2)查看服務器端的共享信息。
Showmount –e192.168.1.1 來查看服務端給我們提供的有哪些共享。
[root@CT56-32-220-NFS01 ~]# showmount -e 192.168.41.220
Export list for 192.168.41.220:
/atong 192.168.41.0/22 ----》看到已經有這個共享了。
3)在客戶端掛載服務器共享出來的目錄。
#mount -t nfs 192.168.1.1:/atong /mnt(本地目錄)我們可以自己新建一個要掛載的目錄。
[root@CT56-32-220-NFS01 ~]# mount -t nfs 192.168.41.220:/atong /atong
#mount 命令格式如下:
####mount -t 類型 device localedir(本地目錄)
#以上這個命令device=192.168.41.220:/atong
[root@CT56-32-220-NFS01 ~]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1655612 5708704 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
192.168.41.220:/atong 7765152 1655296 5709024 23% /atong
[root@CT56-32-220-NFS01 ~]# touch /atong/test.txt
touch: cannot touch `/atong/test.txt': Permissiondenied---》發現沒有現在是沒有權限的,因為我們服務器的本地的rwx權限沒有開啟來。
[root@CT56-32-220-NFS01 ~]# ll /atong/
total 4
-rw-r--r-- 1 root root 0 May 28 08:14 test1
drwxr-xr-x 2 root root 4096 May 28 08:15 test-dir1
##### 在服務器端創建了目錄,要過段時間才能同步到客戶端。額,這樣的情況有辦法解決沒有?
4)查看掛載和共享的文件是否一致。
#df 來查看一下我們系統中的文件系統情況。
[root@CT56-32-220-NFS01~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 7765136 1655612 5708704 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
192.168.41.220:/atong 7765152 1655296 5709024 23% /atong
檢查客戶端中掛載的內容是否和服務端的目錄一樣。
5)在客戶端執行寫操作。
權限說明:當我們在/etc/exports中給了NFS rw權限。但為什么客戶端還是寫不了。因為如果我們僅在NFS配置文件中配置了rw權限。只表明了網絡端的主機能夠有權限去服務器端去寫文件,但還需要通過服務器端的本地目錄的權限。那么也就是說客戶端需要通過兩層的權限來控制的。NFS配置文件—>共享目錄文件的權限。並且客戶端往服務端去寫文件,的用戶身份是nfsnobody、nfsnobody UID=65534。
《錯誤提示》
[atong@LiWenTong ~]$/etc/init.d/portmap stauts --->portmap沒有啟動
Networking not configured – exiting
客戶端NFS掛載參數
我們客戶端掛載NFS也可以設置很多參數的,就跟windows映射盤一樣,也是可以設置參數的。客戶端掛載可以設置:不可執行、讀寫權限、斷開后RPC呼叫方式、讀寫區塊大小等。一般來說當nfs服務器提供的只是普通數據(圖片html,css,jss,視頻等)應該不需要執行suid,exec等權限,由於是共享目錄不存在設備所以也不存在掛載設備dev,因此在客戶端掛載的時候,可以加上給你這幾個命令掛載。
#mount –t nfs -o nosuid,noexec,nodev,rw 192.168.1.1:/share /local/mnt
可使用掛載參數表:
參數 |
參數意義 |
系統默認值 |
suid nosuid |
允許設置suid 不允許在共享文件系統中設置suid |
Suid |
rw ro |
讀寫權限,或者是只讀。 |
|
dev nodev |
解釋設備上的設備 不解釋字符或塊特殊文件系統上的設備 |
|
exec noexec |
不允許在共享文件系統中直接執行任何二進制文件。 |
|
user nouser |
允許用戶去掛載和卸載這個共享目錄。並且這個選項也意味着noexec, nosuid, and nodev這個選項,除非后面有覆蓋指定。 |
|
auto noauto |
另外還有一些NFS掛載的額外參數可用。如果NFS是用在高速運行的環境中的話,那么建議加上這些參數,這樣當這台NFS服務器因為某些原因離線,NFS客戶端可以繼續在后台重復呼叫,直到NFS服務器再度連上線為止。
針對一些高並發的情況,還有一些可以進行優化的參數:
參數 |
參數功能 |
默認參數 |
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 |
當使用hard方式掛載時,若加上intr參數,則RPC的持續呼叫是可以被中斷的 |
沒有 |
rsize wsize ** |
讀出(rsize)和寫入(wsize)的區塊大小。這個設置值可以影響客戶端與服務器端傳輸數據的緩沖存儲容量。一般來說,如果在局域網內(LAN),並且客戶端與服務器都具有足夠的內存,這個值可以設置大一點,比如說32768,提升緩沖區塊將可提升NFS文件系統的傳輸能力。但設置的值也不要太大,最好是實現網絡能夠傳輸的最大值為限。 |
rsize=1024 wsize=1024 |
命令格式如下:mount –t nfs –o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.1:/share /local/dir
NFS客戶端如何掛載才最佳
1)noexec,nosuid,nodev,因為共享存放的是簡單資料,不需要suid位不需要執行,沒有設備文件。
2)hard,intr,bg 當NFS鏈接斷了之后會一直去監測服務端的NFS服務直到恢復之后重新連接。
3)rsize=32768 wsize=32768 調優NFS傳輸的區塊大小。
4)基本參數:rw 讀寫權限。
掛載完成后客戶端的常見操作
1)掛載后重啟設備后的反應。
[root@CT56-32-221-NFS02 ~]# mount -t nfs192.168.41.220:/atong /atong/
[root@CT56-32-221-NFS02 ~]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1634308 5730008 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
192.168.41.220:/atong 7765152 1655296 5709024 23% /atong
[root@CT56-32-221-NFS02 ~]# ll /atong/####當我們掛載了服務器端的共享目錄到本地目錄之后,原本地目錄的內容會被替換成為遠端服務器的內容。
total 4
-rw-r--r-- 1 root root 0 May 28 08:14 test1
drwxr-xr-x 2 root root 4096 May 28 08:15 test-dir1
[root@CT56-32-221-NFS02 ~]# umount /atong
[root@CT56-32-221-NFS02 ~]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1634308 5730008 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
[root@CT56-32-221-NFS02 ~]# ll /atong/ ####當我們將掛載的目錄重新卸載之后,原目錄的內容就又都能夠看見了。
total 0
-rw-r--r-- 1 root root 0 May 28 08:27 test1
-rw-r--r-- 1 root root 0 May 28 08:28 test2
2)如何設置開機自動掛載
特別說明:我們重新啟動客戶端之后,我們要重新去掛載nfs,我們可以有兩種方式來實現。
<1>通過把mount–t nfs 192.168.1.1:/atong /mnt這條命令寫到/etc/rc.local中,讓它開機就執行。
<2>在/etc/fstab(系統開機啟動分區加載項)添加我們的NFS配置:
10.0.0.161:/atong /atong/video nfs defaults 1 1 。
但在生產環境中,對於共享的NFS目錄,一般不會配置到/etc/fstab里。因為在客戶端主機重啟時如果由於網絡等原因連接不上nfs server時,就會導致客戶機無法啟動的厄運發生。一般是通過把mount -t nfs 10.10.10.1:/atong /local/dir命令放到rc.local中來實現開機自動掛載NFS。
nfs的開機自動掛載
有兩種方式實現開機自動掛載1、將mount命令寫在rc.local文件中。2、在/etc/fstab中寫入具體的配置系想你。
但這里建議采用第一種,如果因為網絡原因沒有連接到NFSserver那么第二中有可能會導致系統無法啟動的故障。
3)卸載掛載點
<1>正常卸載
#umount /local/dir 正常的卸載命令來卸載。
<2>umoutn提示busy錯誤
如何卸載nfs掛載點通過umount /local/dir來進行卸載。如果本地中有用戶還在這個掛載點中,那么會提示這個掛載點繁忙busy。我們需要先讓本地退出這個掛載點,然后再重新進行卸載。而如果有其他用戶在使用,同樣也是需要用戶退出之后這個掛載目錄才能進行卸載。
或者進行強制卸載:umount –lf /local/dir 來進行強制卸載。
簡述一次完整的NFS掛載過程
1)確認portmap、nfs已經啟動。並且是nfs比portmap后啟動的。
通過chkconfig來配置開機啟動,portmap的默認開啟順序一也是比nfs來得早。
2)vi /etc/export 配置nfs服務的共享目錄及權限。
#/etc/init.d/nfs reload 重新加載
確認服務器端要共享的目錄已經存在,並且權限正確。
3)客戶端的portmap的啟動,並加入開機自啟動中。通過showmount來查看服務器端是否已經提供了共享的NFS目錄。通過rpfinfo命令來查看服務器端的rpc信息。當本地端要掛載的時候也要確認本地掛載的目錄,沒有別占用。
3.1)當客戶端不能夠寫入的時候,需要去判斷服務器端的/etc/exports中權限是否正確,服務端共享的目錄的本地目錄權限是否正確。如果不正確,那么我們可以通過把目錄的屬主改成nfsnobody以達到讓客戶端能夠寫入的權限。當重客戶端寫完之后,可以查看一下寫入之后的檔案的所有者和權限。可以發現只要是從客戶端去創建的文檔,文件的屬主和用戶組都是nfsnobody。如果加上all_squash之后。
(但要確定是所有的客戶端具有同一個uidnfsnobody。當我們的系統都是32位的時候,可以確定匿名用戶的uid都是65534.而64位的操作系統,那么就是一串其他的數字。)
3.2)所有系統都是64位系統時。我們要共享時,可以在我們服務器端做一個修改:在all_squash,anonuid=2000,anongid=2000
3.3)不必查看系統時32還是64位
在網絡中的所有機器上創建一個新的用戶及用戶組。然后配置/etc/exports all_squash,anonuid=1207,anongid=1207
4)配置客戶端的默認開機啟動掛載。
將mount –t nfs 192.68..1.1:/share/dir /local/dir 命令寫入rc.local中。
------------------------------后續自我小結-----------------------------------------------
NFS就是網絡共享文件系統,道理很簡單那,就是服務器共享文件,客戶端掛載服務端共享的文件。共享文件,需要配置/etc/exports,添加相應的共享目錄及共享的目標網絡及權限配置,開啟共享文件的本地權限。然后客戶端進行有參數的掛載,設置讀寫權限rw,nodev,noexec,nouser,hard,intr,rsize,wsize等掛載參數。然后就是開始掛載使用。
在啟動順序上我們要注意portmap一定要先於NFS啟動,客戶端的NFS開機掛載最好是將命令加載/etc/rc.local里面。
----------------------------------------------------------------------------------------
常見問題補充:
1)服務器端網絡故障或者是網絡斷開時。
當把服務器的網絡斷開后,客戶端df查看本地分區信息的時候一直在等待中,有時會卡死。
[root@CT56-32-221-NFS02 atong]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1635964 5728352 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
…一直在等待中……
[root@CT56-32-222-NFS03 ~]# cd /atong
…一直等待中….連我們原本/atong的目錄都進不去因為現在是掛載的。
[root@CT56-32-221-NFS02 ~]# umount /atong ###通過umount /atong也不能進行卸載。
umount.nfs: 192.168.41.220:/atong: not found /mounted or server not reachable
[root@CT56-32-221-NFS02 ~]# umount -lf /atong ####通過-lf進行強制卸載,就能夠進行卸載了。
[root@CT56-32-221-NFS02 ~]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1635976 5728340 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
當服務器網絡恢復正常后,df就可以查看到信息了。
[root@CT56-32-222-NFS03 ~]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1636016 5728300 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
192.168.41.220:/atong 7765152 1655360 5708992 23% /atong
2)修改服務器NFS配置,停用共享,不reload nfs服務。
[root@CT56-32-221-NFS02 ~]# showmount -e 192.168.41.220
Export list for 192.168.41.220:
/atong 192.168.41.0/22
[root@CT56-32-222-NFS03 atong]# touch nfs4
[root@CT56-32-222-NFS03 atong]# ll
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 13:24 nfs2
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs3
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs4
###只要沒有reload就沒有任何的影響,因為服務器的RPC還是記住了NFS原有舊的信息。所以客戶端不會受影響。
[root@CT56-32-221-NFS02 ~]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1635976 5728340 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
df: `/atong':Permission denied
###當服務器修改完配置重新reload之后,原本掛載的目錄就會出現權限限制。原因就是reload之后會重新加載配置文件,就會重新按照新的配置文件來生效。重新配置,重新reload之后,客戶端就又能夠重新進行掛載了。
3)客戶端網絡中斷
客戶端網絡中斷的話,那么所有的連接就完全斷開的,就不必多多說了。之后網絡恢復后,就又可以使用了。
4)客戶端portmap服務被停止
[root@CT56-32-222-NFS03 atong]# /etc/init.d/portmapstatus
portmap (pid 2726) is running...
[root@CT56-32-222-NFS03 atong]# /etc/init.d/portmapstop
Stopping portmap: [ OK ]
[root@CT56-32-222-NFS03 atong]# ll
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 13:24 nfs2
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs3
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs4
-rwxrwxrwx 1 root root 0 May 28 08:14 test1
drwxrwxrwx 2 root root 4096 May 28 08:15 test-dir1
[root@CT56-32-222-NFS03 atong]# touch nfs5
[root@CT56-32-222-NFS03 atong]# ll --》能正常使用
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:39 nfs5
[root@CT56-32-222-NFS03 /]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1636016 5728300 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
192.168.41.220:/atong 7765152 1655360 5708992 23% /atong
[root@CT56-32-222-NFS03 /]# showmount -e 192.168.41.220
Export list for 192.168.41.220: ---》能查看原有NFS服務器的掛載信息
/atong 192.168.41.0/22
#####客戶端的portmap被停止后,原掛載的nfs仍然能夠進行工作。並且能和服務器進行同步。
[root@CT56-32-222-NFS03 /]# umount /atong
[root@CT56-32-222-NFS03 /]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1636020 5728296 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
[root@CT56-32-222-NFS03 /]# showmount -e 192.168.41.220
Export list for 192.168.41.220:
/atong 192.168.41.0/22
[root@CT56-32-222-NFS03 /]# mount -t nfs 192.168.41.220:/atong /atong
mount.nfs:Input/output error
####卸載原有的掛載之后,重新掛載就會出現掛載不了的錯誤。恢復portmap啟動后就又可以使用了。
5)當服務器端的NFS進程被停止后。
服務器端終止NFS進程
[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/nfs stop
Shutting down NFS mountd: [ OK ]
Shutting down NFS daemon: [ OK ]
Shutting down NFS quotas: [ OK ]
Shutting down NFS services: [ OK ]
[root@CT5_6-32-220-NFS01 ~]# cat /var/lib/nfs/etab
[root@CT5_6-32-220-NFS01 ~]# cat /var/lib/nfs/rmtab
192.168.41.221:/atong:0x00000003
192.168.41.222:/atong:0x00000002
[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/nfs status
rpc.mountd is stopped
nfsd is stopped
rpc.rquotad is stopped
###客戶端立馬就會出現連接不上,因為NFS才是切切相關需要時刻運行的進程。###
[root@CT56-32-222-NFS03 /]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1636028 5728288 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0%
###服務器端重新啟動NFS之后,客戶端就能夠重新掛載。
[root@CT56-32-221-NFS02 ~]# mount -t nfs 192.168.41.220:/atong /atong
[root@CT56-32-221-NFS02 ~]# df
Filesystem 1K-blocks Used Available Use%Mounted on
/dev/sda3 7765136 1634396 5729920 23% /
/dev/sda1 101086 11601 84266 13% /boot
tmpfs 62532 0 62532 0% /dev/shm
192.168.41.220:/atong 7765152 1655360 5708992 23% /oldbo
《NFS的三個進程》
nfsd這個就是nfs的主程序,如果這個被停了,那就表示nfs完全的癱掉不能工作,當然就連接不上了
rpc.mountd 這個屬於管理共享的掛載機制
rpc.quotad 管理共享配額
6)服務器端的portmap被停止。
------理論推導----------------
其實我們故障問題演示進行到這里已經大概可以知道其實用原理推一下就知道,表現會是什么。然后可以再用實驗去驗證我們的推論是否正確。
服務器的portmap是關系到NFS的端口注冊,而客戶端只要跟服務器簡歷起來NFS的連接之后就不會再去詢問portmap NFS的端口信息。那現在portmap停掉了,客戶端舊的NFS不會被影響。但是如果要再建立掛載就不行咯。而服務器要創建新的共享目錄也是不能夠成功的,因為新的NFS共享就要去portmap注冊信息。好咯推導完后,以下就來驗證咯:
插播:其實我們應該要學會的就是這樣,理論推導現象的能力。以后要進行故障排除是很重要的能力。至少我自己在網絡方面這么久就是這樣做的。
--------------------------------
服務器端停止portmap服務后,原有的nfs共享目錄,操作正常。
[root@CT5_6-32-220-NFS01 ~]# /etc/init.d/portmapstop
Stopping portmap: [ OK ]
[root@CT5_6-32-220-NFS01 ~]# cd /atong/
[root@CT5_6-32-220-NFS01 atong]# ll
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 13:24 nfs2
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs3
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs4
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:39 nfs5
###新的客戶端就不能查看掛載信息,也不能掛載
[root@CT56-32-222-NFS03 ~]# showmount -e192.168.41.220
mount clntudp_create: RPC: Port mapper failure -RPC: Unable to receive
##原有舊的掛載沒問題,但想重新查詢掛載信息也是失敗的。似乎是NFS端口信息溝通過1次就能夠記得住。而如果需要重新掛載新的共享或者去查詢共享,就必須去想服務器的portmap重新去請求,而此時服務器的111端口已經被停掉了。所以更本就無法去請求到新的端口對應數據。
[root@CT56-32-221-NFS02 atong]# showmount -e 192.168.41.220
mount clntudp_create: RPC: Port mapper failure -RPC: Unable to receive
7)服務端portmap重啟或NFS先於portmap之前啟動
------理論推導---------------------------------------------------------------------------
哈哈,再推導一次。portmap重啟,原本的注冊信息沒有了。而且NFS沒有重啟,所以portmap里面的信息是空的。但是原本舊的NFS掛載已經有了,而且進行建立起來就不會受到影響咯。但是有新的掛載就不行咯。而且服務器要建立一個新的NFS共享也是不行,如果是修改了配置之后reload一下,那是可以創建新的共享的,因為這樣就相當於重新去portmap注冊信息咯。
哈哈,其實這個都是我在寫博文的時候,馬上推的還得看實驗是否正的就是如此呢。
-----------------------------------------------------------------------------------------
[root@CT56-32-221-NFS02 atong]# touch sdfasd
[root@CT56-32-221-NFS02 atong]# ll
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 13:24 nfs2
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:05 nfs3
-rw-r--r-- 1 nfsnobody nfsnobody 0 May28 14:05 nfs4
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 14:39 nfs5
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 15:01 nfs6
-rw-r--r-- 1 root root 0 May 28 15:02 nfs7
-rw-r--r-- 1 nfsnobody nfsnobody 0 May 28 16:00 sdfasd
-rwxrwxrwx 1 root root 0 May 28 08:14 test1
drwxrwxrwx 2 root root 4096 May 28 08:15 test-dir1
[root@CT56-32-221-NFS02 atong]# showmount -e 192.168.41.220
mountclntudp_create: RPC: Program not registered
#####客戶端原有的共享掛載不會受到影響。但如果要重新掛載或者任何需要與portmap進行通訊的操作,都會提示RPC沒有注冊信息。
[root@CT5_6-32-220-NFS01 atong]# rpcinfo -p --》查看portmap信息,是全新的!符合推導。
programvers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmappe
###此時的portmap只記錄了111這個端口信息。
[root@CT5_6-32-220-NFS01 atong]# /etc/init.d/nfs restart 重新注冊信息
Shutting down NFS mountd: [ OK ]
Shutting down NFS daemon: [ OK ]
Shutting down NFS quotas: [ OK ]
Shutting down NFS services: [ OK ]
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]
[root@CT5_6-32-220-NFS01 atong]# rpcinfo -p
programvers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 660 rquotad
100011 2 udp 660 rquotad
100011 1 tcp 663 rquotad
100011 2 tcp 663 rq
###服務器端NFS重新啟動完之后就能夠注冊信息了。
-----------------------------------小結--------------------------------------------------
1)portmap故障
服務端portmap故障:原有已掛載的不會受到任何影響。所有客戶端如果是要掛載本服務器的共享,或者是重新執行已經掛載本服務器的共享的操作(卸載,重新掛載)均會出現錯誤。因為此時還需要去向portmap去請求端口信息。新的掛載或服務端新的共享均出錯。
客戶端portmap故障:原有已掛載的不會受到任何影響。本客戶端如果要重新掛載,卸載任何服務器的共享均會報錯。新的掛載出錯.
2)服務端NFS故障
服務器NFS故障:NFS是提供掛載的主程序,如果出現故障,那么掛載本服務器的共享的客戶端均會出現故障。主程序都出錯了,結果可想而知嘛。就像車子發動機都不動了,還怎么開。
3)網絡故障
網絡故障:網絡是提供網絡服務的最基礎條件,如果出現故障,那么基於網絡以上的服務都會出現故障。
-----------------------------------------------------------------------------------------
NFS優點
1、簡單容易掌握
2、方便快速部署簡單維護容易
3、可靠—從軟件層面上看,數據可靠性高,經久耐用
NFS局限
1、局限性是存在單點故障,如果NFSserver宕機了所有客戶端都不能訪問共享目錄,#####我們可以通過rsync來進行數據的同步。或者是通過負載均衡的高可用方案。######
2、在高並發的場合,NFS效率性能有限(一般幾千萬以下pv的網站不是瓶頸,除非網站架構太差。)
3、服務器共享文件的客戶端認證是基於IP和主機名的安全性一般(但用於內網則問題不大)
4、NFS數據是明文的,對數據完整性不做驗證(一般是存放於內網,提供內網的服務器使用。所以安全性相對不是一個問題)
5、多機器掛載服務器時,連接管理維護麻煩。尤其NFS服務端出問題后,所有客戶端都掛掉狀態(可使用autofs自動掛載解決。)
生產應用場景
中小型網站(2000萬pv以下)線上應用,都有用武之地。門戶網站也會有其他方面的應用,。因為門戶網站的並發量是超級的大。所以有更加會用專業的存儲來做這件事情。