1、NFS原理描述前端
什麼是NFS?NFS是Network File System的縮寫,它的主要功能是經過網絡讓不一樣的機器之間能夠彼此共享文件或目錄。NFS服務器能夠容許NFS客戶端將遠端NFS服務器端的共享目錄掛在到本地的NFS客戶端中。在本地NFS客戶端的機器看來,NFS服務器端共享的目錄就好像是本身的磁盤分區或者目錄同樣。安全
NFS通常用來存儲共享視頻、圖片等靜態數據,是當前互聯網系統架構中最經常使用的服務之一。服務器
2、NFS掛載結構圖網絡
圖解:NFS對外共享了video這個目錄,下面有兩臺NFS客戶端,客戶端能夠把服務端的video目錄掛載到本地的一個目錄下;至關於把本地的目錄跟服務端的目錄作一個綁定或者說是作一個映射,這個時候訪問本地的/data/video就至關於訪問NFS Server的/video目錄同樣,本地的共享目錄能夠是本身取的名字,固然最好是要作到見名知意了。架構
3、NFS掛載原理詳細介紹app
如上圖,當咱們在NFS服務器端設置好一個共享存儲目錄/video之後,其餘的有權限訪問NFS服務器端的NFS客戶端能夠將這個/video共享目錄,掛載到NFS客戶端本地系統上的某個掛載點(其實就是一個目錄,這個目錄能夠隨意指定,最好仍是作到見名知意,便於後期維護),上圖客戶端本地的掛載點分別爲/data/video和/data/video。tcp
當正確掛載完畢後,進入到NFS客戶端的/data/video或/data/video目錄就能夠看到NFS服務器端/video目錄下的全部數據。看起來NFS服務器端的/video目錄就至關於NFS客戶端本地的磁盤分區或者目錄同樣,根據NFS服務端授予的NFS共享權限,在NFS客戶端操做/data/video或/data/video掛載的目錄,就能夠將數據輕鬆存取到NFS Server的/video目錄中。ide
掛載後,NFS客戶端本地顯示以下面所示:測試
如上所示:掛載信息看起來,和本地的分區通常不二,只是開頭是ip地址的形式。ui
通過上面的介紹,咱們知道NFS是經過網絡來進行數據傳輸的(因此叫網絡文件系統嘛!,哈哈!),所以,NFS會使用一些端口來傳輸,那麼,NFS到底使用哪些端口來進行傳輸呢?這個問題比較難於回答。由於NFS在傳輸數據時使用的端口是隨機選擇的。可能有朋友會納悶,既然這樣,NFS客戶端是怎麼知道NFS服務端使用的是哪一個端口呢?答案:就是經過遠程過程調用(Remote Procedure Call簡稱RPC)協議/服務來實現的,接下來,咱們就談談什麼是RPC協議/服務。
4、什麼是RPC(Remote Procedure Call)
由於NFS支持的功能至關多,而不一樣的功能都會使用不一樣的程序來啓動,每啓動一個功能就會啓用一些端口來傳輸數據,所以,NFS的功能所對應的端口才沒法固定,而是隨機採用一些未被用的小於1024的端口來做爲傳輸之用。但如此一來就會形成客戶端與服務端聯機的困擾,由於客戶端必需要知道服務器端的數據傳輸端口才能進行聯機交互數據。
要解決上面的問題,咱們就須要遠程過程調用(RPC)服務了,RPC最主要的功能就是制定每一個NFS功能所對應的端口號,而且將該信息傳遞給NFS客戶端,讓客戶端能夠鏈接到爭取的端口上去。那麼RPC又是如何知道每一個NFS的端口呢?這是由於當NFS服務啓動時會隨機取用數個端口,並主動向NFS服務註冊取用的相關端口信息,這樣,RPC服務就能夠知道每一個端口對應的NFS功能了,而後RPD服務使用固定的Port 111 來監聽NFS客戶端的請求,並將正確的NFS端口應到給NFS客戶端,這樣一來,就可讓NFS的客戶端與服務端進行數據傳輸了。
提示:在啓動NFSServer以前,首先要啓動RPC服務(即portmap服務,下同,不然NFS Server就沒法想RPC服務註冊,另外,若是RPC服務從新啓動,原來已經註冊好的NFS端口數據將會丟失,所以,此時RPC服務管理的NFS程序也須要從新啓動以從新向RPC註冊。
特別注意:通常修改NFS配置文件後,是不須要重啓NFS的,直接在命令行執行/etc/init.d/nfs reload或exportfs -rv便可,可以使/etc/exports生效。
5、描述整個啓動過程以下圖
如上圖所示,當程序經過NFS客戶端向NFS服務端存取文件時,其請求數據流程大體如如下幾點:
1、首先用戶訪問應用程序,由應用程序在NFS客戶端發出NFS文件存取功能的詢問請求,這時NFS客戶端(即執行程序的服務器)RPC服務(即Portmap服務就會經過網絡向NFS服務器段的portmap的111端口發出FNS文件存取功能的詢問請求。
2、NFS服務器端的portmap服務找到對應的已註冊的NFS daemon端口後,通知NFS客戶端的portmap服務。
3、此時NFS客戶端就能夠獲取到了正確的斷藕,而後就直接與NFS daemon聯機存取數據了。
4、NFS客戶端把數據存取成功後,返回給前端訪問程序,告知用戶存取結果。
因爲NFS的各項功能都要向portmap服務註冊,因此portmap服務才能獲取到NFS服務的各項功能對應的端口號(port number、PID、NFS在主機所監聽的ip等,而NFS客戶端纔可以經過向portmap服務詢問從而找到正確的端口。也就是說,NFS須要有portmap服務的協助才能成功提供服務。由上面的描述,咱們不難推斷,不管是NFS客戶端仍是NFS服務器端,當須要使用NFS時,都須要首先啓動portmap服務。
5、實驗測試
同時打開三臺虛擬機,並修改好主機名稱,以及標籤
NFS-SERVER端配置詳解
(1)查看NFS服務端系統信息
[root@nfs-server ~]# cat /etc/redhat-release CentOS release 5.8 (Final)
(2)查看內核版本信息
[root@nfs-server ~]# uname -r 2.6.18-308.el5
(3)安裝NFS主程序nfs-utils軟件和提供RPC主程序的portmap軟件
Portmap提供端口映射 [root@nfs-server ~]# yum -y install nfs-utils portmap [root@nfs-client1 ~]# yum -y install nfs-utils portmap [root@nfs-client2 ~]# yum -y install nfs-utils portmap [root@nfs-server ~]# rpm -qa nfs-utils portmap portmap-4.0-65.2.2.1 nfs-utils-1.0.9-70.el5 [root@nfs-client1 ~]# rpm -qa nfs-utils portmap nfs-utils-1.0.9-70.el5 portmap-4.0-65.2.2.1 [root@nfs-client2 ~]# rpm -qa nfs-utils portmap portmap-4.0-65.2.2.1 nfs-utils-1.0.9-70.el5 也可使用下列方法查詢軟件包是否安裝 [root@nfs-server ~]# rpm -qa |grep -E "nfs-utils|portmap" portmap-4.0-65.2.2.1 nfs-utils-lib-1.0.8-7.9.el5 nfs-utils-1.0.9-70.el5 [root@nfs-client1 ~]# rpm -qa |grep -E "nfs-utils|portmap" nfs-utils-1.0.9-70.el5 portmap-4.0-65.2.2.1 nfs-utils-lib-1.0.8-7.9.el5 [root@nfs-client2 ~]# rpm -qa |grep -E "nfs-utils|portmap" portmap-4.0-65.2.2.1 nfs-utils-lib-1.0.8-7.9.el5 nfs-utils-1.0.9-70.el5
(4)NFS服務端首先必需要啓動portmap服務
由於NFS及其輔助程序都是基於RPC(Remote Procedure Call)協議的(使用的端口爲111),因此要首先確保系統中運行了portmap服務。 [root@nfs-server ~]# service portmap status portmap 已停 [root@nfs-server ~]# service portmap start 啓動 portmap: [肯定] [root@nfs-server ~]# lsof -i:111 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME portmap 3361 rpc 3u IPv4 15366 0t0 UDP *:sunrpc portmap 3361 rpc 4u IPv4 15367 0t0 TCP *:sunrpc (LISTEN) [root@nfs-server ~]# netstat -tulanp |grep :111 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3361/portmap udp 0 0 0.0.0.0:111 0.0.0.0:* 3361/portmap
模擬portmap服務沒啓動,執行rpcinfo -p localhost會報錯
[root@nfs-server ~]# service portmap stop 中止 portmap: [肯定] [root@nfs-server ~]# rpcinfo -p localhost rpcinfo:沒法同 portmapper 交互: RPC:遠程系統錯誤 - 拒絕鏈接 [root@nfs-server ~]# export LANG=c [root@nfs-server ~]# rpcinfo -p localhost rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused
如下操做表示RPC服務是正常的。
[root@nfs-server ~]# service portmap start Starting portmap: [ OK ] [root@nfs-server ~]# rpcinfo -p localhost program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper
(5)其次是啓動NFS服務,以便向RPC服務來註冊
[root@nfs-server ~]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS daemon: [ OK ] Starting NFS mountd: [ OK ] [root@nfs-server ~]# ps aux |grep nfs root 3451 0.0 0.0 0 0 ? S< 02:31 0:00 [nfsd4] root 3453 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3454 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3455 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3456 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3457 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3458 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3459 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3460 0.0 0.0 0 0 ? S 02:31 0:00 [nfsd] root 3479 0.0 0.0 61152 660 pts/0 R+ 02:31 0:00 grep nfs
(6)配置NFS開機自啓動,服務端配置NFS和portmap,客戶端只須要配置portmap便可
[root@nfs-server ~]# chkconfig --level 3 nfs on [root@nfs-server ~]# chkconfig --level 3 portmap on [root@nfs-server ~]# chkconfig --list |grep -E "nfs|portmap" nfs 0:off 1:off 2:off 3:on 4:off 5:off 6:off nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off [root@nfs-client1 ~]# chkconfig --level 3 portmap [root@nfs-client1 ~]# chkconfig --list |grep portmap portmap 0:關閉 1:關閉 2:關閉 3:啓用 4:啓用 5:啓用 6:關閉 [root@nfs-client1 ~]# export LANG=c [root@nfs-client1 ~]# chkconfig --list |grep portmap portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off [root@nfs-client2 ~]# chkconfig --level 3 portmap on [root@nfs-client2 ~]# chkconfig --list |grep portmap portmap 0:關閉 1:關閉 2:關閉 3:啓用 4:啓用 5:啓用 6:關閉 [root@nfs-client2 ~]# export LANG=c [root@nfs-client2 ~]# chkconfig --list |grep portmap portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off
(7)NFS配置文件路徑及配置文件格式
NFS默認配置文件路徑爲/etc/exports,默認爲空,無任何內容
/etc/exports 文件配置格式爲
NFS共享目錄客戶端地址1(參數1..參數N),客戶端地址2(參數1..參數N),各參數說明
一、NFS共享目錄:爲NFS服務端要共享的實際目錄絕對路徑。 二、客戶端地址:爲服務端受權的訪問共享目錄的客戶端服務器地址,能夠做爲單獨的ip地址或域名,也能夠爲整個網段,還可使用*來匹配全部服務器能夠訪問。 三、參數集:對受權的客戶端的訪問權限控制,詳見下表
客戶端地址 |
具體地址案例 |
說明 |
受權單一客戶端訪問NFS |
192.168.1.51 |
通常狀況,生產環境中此配置不常見 |
受權整個網段訪問 |
192.168.1.0/24 |
指定網段爲生產環境中最多見的配置 |
生產環境常見配置實例
經常使用格式說明 |
要共享的目錄客戶端ip地址或ip段(參數1,參數2..參數n) |
配置實例一 |
/video 192.168.1.0/24(rw, sync) |
配置實例二 |
/data/video 192.168.1.10/24(rs,sync,all_squash,anonuid=3000,anongid=3000)此配置是生產環境中的經常使用配置,適合多客戶端共享一個NFS目錄 |
配置實例三 |
/data/video 192.168.1.52(ro)只讀共享 |
NFS配置實例詳解
配置實例一:共享/data/video目錄給192.168.1.0/24整個網段可讀寫
1、在NFS服務端執行以下操做
建立要共享的NFS服務端目錄 [root@nfs-server ~]# mkdir /data/ 設置最大權限爲777,不安全,後面會進行詳解;這裏主要是爲了方便測試 [root@nfs-server ~]# chmod -R 777 /data/ 至關於使用VIM編輯NFS配置文件同樣/etc/exports而後輸入/data/ 192.168.1.0/24(rw,sync)同樣 [root@nfs-server ~]# echo "/data/ 192.168.1.0/24(rw,sync)">/etc/exports 查看經過echo生成的配置文件結果 [root@nfs-server ~]# tail /etc/exports /data/ 192.168.1.0/24(rw,sync) 查看當前portmap服務運行狀態 [root@nfs-server ~]# /etc/init.d/portmap status portmap (pid 3397) is running... 查看當前NFS服務運行狀態 [root@nfs-server ~]# /etc/init.d/nfs status rpc.mountd (pid 3463) is running... nfsd (pid 3460 3459 3458 3457 3456 3455 3454 3453) is running... 修改NFS配置文件後,使用reload平滑重啓NFS服務使其生效 [root@nfs-server ~]# /etc/init.d/nfs reload 查看NFS配置文件的參數,包括默認加載的參數 [root@nfs-server ~]# cat /var/lib/nfs/etab /data 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
2、在客戶端mount目錄
首先查看服務端提供了哪些共享 [root@nfs-client1 ~]# showmount -e 192.168.1.50 Export list for 192.168.1.50: /data 192.168.1.0/24 [root@nfs-client2 ~]# showmount -e 192.168.1.50 Export list for 192.168.1.50: /data 192.168.1.0/24 客戶端掛載 [root@nfs-client1 ~]# mount -t nfs 192.168.1.50:/data/ /mnt/ [root@nfs-client1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext3 15G 2.3G 12G 17% / /dev/sda6 ext3 9.5G 151M 8.9G 2% /data /dev/sda5 ext3 9.5G 151M 8.9G 2% /app /dev/sda3 ext3 9.5G 151M 8.9G 2% /tools /dev/sda1 ext3 190M 12M 169M 7% /boot tmpfs tmpfs 502M 0 502M 0% /dev/shm 192.168.1.50:/data/ nfs 9.5G 151M 8.9G 2% /mnt [root@nfs-client1 ~]# mount /dev/sda2 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda6 on /data type ext3 (rw) /dev/sda5 on /app type ext3 (rw) /dev/sda3 on /tools type ext3 (rw) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) 192.168.1.50:/data/ on /mnt type nfs (rw,addr=192.168.1.50) [root@nfs-client2 ~]# mount -t nfs 192.168.1.50:/data/ /mnt/ [root@nfs-client1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext3 15G 2.3G 12G 17% / /dev/sda6 ext3 9.5G 151M 8.9G 2% /data /dev/sda5 ext3 9.5G 151M 8.9G 2% /app /dev/sda3 ext3 9.5G 151M 8.9G 2% /tools /dev/sda1 ext3 190M 12M 169M 7% /boot tmpfs tmpfs 502M 0 502M 0% /dev/shm 192.168.1.50:/data/ nfs 9.5G 151M 8.9G 2% /mnt [root@nfs-client1 ~]# mount /dev/sda2 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda6 on /data type ext3 (rw) /dev/sda5 on /app type ext3 (rw) /dev/sda3 on /tools type ext3 (rw) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) 192.168.1.50:/data/ on /mnt type nfs (rw,addr=192.168.1.50)
NFS服務端建立測試目錄:服務端往客戶端存文件
[root@nfs-server ~]# ls -l /data/ total 0 [root@nfs-server ~]# mkdir /data/123 -pv mkdir: created directory `/data/123' [root@nfs-client1 ~]# ls -l /mnt/ total 8 drwxr-xr-x 2 root root 4096 May 1 03:49 123 [root@nfs-client2 ~]# ls -l /mnt/ total 8 drwxr-xr-x 2 root root 4096 May 1 03:49 123
NFS客戶端建立測試目錄:客戶端往服務端存目錄
[root@nfs-client1 ~]# mkdir /mnt/test1 -pv mkdir: created directory `/mnt/test1' [root@nfs-client2 ~]# mkdir /mnt/test2 -pv mkdir: created directory `/mnt/test2' [root@nfs-server ~]# ls -l /data/ total 24 drwxr-xr-x 2 root root 4096 May 1 03:49 123 drwxr-xr-x 2 nfsnobody nfsnobody 4096 May 1 03:54 test1 drwxr-xr-x 2 nfsnobody nfsnobody 4096 May 1 03:55 test2
[root@nfs-client1 ~]# id nfsnobody uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody) context=root:system_r:unconfined_t:SystemLow-SystemHigh [root@nfs-client2 ~]# id nfsnobody uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody) context=root:system_r:unconfined_t:SystemLow-SystemHigh
NFS客戶端掛載的命令格式
掛載命令 |
掛載的格式類型 |
NFS服務端提供的共享目錄 |
NFS客戶端要掛在的目錄 |
mount |
-t nfs |
192.168.1.50:/data |
/mnt |
完整掛載命令爲:mount -t nfs 192.168.1.50:/data /mnt |
附:NFS權限設置經常使用圖解
關因而否開機自動掛載的問題?
在當前目錄下,想強制卸載NFS客戶端掛載點的問題, umount -l 強制卸載 l--lazy卸載