NFS服務介紹及實驗

2020-01-03     sandag

一、什麼是NFS

NFS 是 Network File System 的縮寫,即網絡文件系統。一種使用於分散式文件系統的協定,由 Sun 公司開發,於 1984 年向外公布。功能是通過網絡讓不同的機器、不同的作業系統能夠彼此分享個別的數據,讓應用程式在客戶端通過網絡訪問位於伺服器磁碟中的數據,是在類 Unix 系統間實現磁碟文件共享的一種方法 它的主要功能是通過網絡讓不同的機器系統之間可以彼此共享文件和目錄。NFS 伺服器可以允許 NFS 客戶端將遠端 NFS 伺服器端的共享目錄掛載到本地的 NFS 客戶端中。在本地的 NFS 客戶端的機器看來,NFS 伺服器端共享的目錄就好像自己的磁碟分區和目錄一樣。

NFS 服務主要用於文件共享,例如音樂,視頻,音樂等靜態文件。

二、NFS服務連接原理

NFS 是通過網絡來進行服務端和客戶端之間的數據傳輸。兩者之間要傳輸數據就要有想對應的網絡埠來進行傳輸。NFS 伺服器到底使用什麼網絡埠來傳輸數據的,NFS 伺服器端其實是隨機選擇埠來進行數據傳輸。那 NFS 客戶端又是如何知道NFS伺服器端到底使用的是哪個埠呢?

其實NFS伺服器時通過 遠程過程調用(remote procedure call 簡稱 RPC) 協議/服務來實現的。也就是說 RPC 服務會統一管理 NFS 的埠,客戶端和服務端通過 RPC 來先溝通 NFS 使用了哪些埠,之後再利用這些埠(小於 1024)來進行數據的傳輸。 也就是 RPC 管理服務端的 NFS 埠分配,客戶端要傳數據,那客戶端的 RPC 會先跟服務端的 RPC 去要伺服器的埠,要到埠後再建立連接,然後傳輸數據。

首先當 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

三、NFS服務連接過程

  • 1)首先伺服器端啟動 RPC 服務,並開啟 111 埠
  • 2)啟動 NFS 服務,並向 RPC 註冊埠信息
  • 3)客戶端啟動 RPC(portmap 服務),向服務端的 RPC(portmap)服務請求服務端的 NFS 埠
  • 4)服務端的 RPC(portmap)服務反饋 NFS 埠信息給客戶端。
  • 5)客戶端通過獲取的 NFS 埠來建立和服務端的 NFS 連接並進行數據的傳輸

五、相關軟體安裝

協議:

RPC(Remote Procedure Call Protocol) 遠程過程調用協議

軟體:

nfs-utils-* :包括 NFS 命令與監控程序

rpcbind-* :支持安全 NFS RPC 服務的連接

註:通常情況下,是作為系統的默認包安裝的

Cent OS6.*之前 rpcbind 叫 portmap

yum install nfs -y

六、NFS 服務配置

NFS 伺服器的配置相對比較簡單,只需要在相應的配置文件中進行設置,然後啟動 NFS 伺服器即可。

NFS 服務的配置文件為 /etc/exports,這個文件是 NFS 的主要配置文件,不過系統並沒有默認值,所以這個文件不一定會存在,可能要使用 vim 手動建立,然後在文件裡面寫入配置內容。

共享目錄  客戶機(訪問權限,用戶映射,其他)

客戶機

  • 指定 ip 地址的主機:100.100.100.200
  • 指定子網中的所有主機:100.100.100.0
  • 指定域名的主機:www.love1.com
  • 指定域中的所有主機:*.love1.com
  • 所有主機:*

訪問權限

  • 設置輸出目錄只讀:ro
  • 設置輸出目錄讀寫:rw

用戶映射

  • root_squash:將 root 用戶的訪問映射為匿名(nfsnobody)用戶 uid 和 gid;(默認生效)
  • no_root_squash:保留管理員權限,以伺服器管理員的權限管理;
  • all_squash:將遠程訪問的用戶及所屬組都映射為指定 uid、gid 的匿名用戶;
    anonuid=xxx:將遠程訪問的所有用戶都映射為指定 uid 的匿名用戶
    anongid=xxx:將遠程訪問的所有用戶組都映射為指定 gid 匿名組帳戶

其他

  • sync: 將數據同步寫入內存緩衝區與磁碟中,效率低,但可以保證數據的一致性(同步);
  • async:將數據先保存在內存緩衝區中,必要時才寫入磁碟(異步)

七、NFS 服務管理

1、啟動 NFS 伺服器

service rpcbind start service nfs start

2、查詢 NFS 伺服器狀態

service rpcbind status service nfs status

3、停止 NFS 伺服器

要停止 NFS 運行時,需要先停止 nfs 服務再停止 rpcbind 服務,對於系統中有其他服務(如 NIS)需要使用時,不需要停止 rpcbind 服務。

service nfs stop service rpcbind stop

4、設置 NFS 伺服器的自動啟動狀態

設置開機啟動,默認在2345級別啟動

chkconfig --level rpcbind on chkconfig --level  nfs on

5、查看 RPC 伺服器開啟了哪些埠

rpcinfo –p localhost

八、相關實驗

1、創建目錄修改配置文件

[root@centos ~]#mkdir /share[root@centos ~]#vim /etc/exports    /share  100.100.100.103(rw)   [root@centos ~]#service nfs restart[root@centos ~]# exportfs/share          100.100.100.103

2、查看共享服務

[root@centos ~]# showmount -e 100.100.100.102Export list for 100.100.100.102:/share 100.100.100.103

3、客戶機掛載

[root@centos ~]# mkdir /share命令格式:mount NFS伺服器IP:共享目錄 本地掛載點目錄 [root@centos ~]# mount 100.100.100.102:/share /share      #mount –o vers=3 共享 本地 #指定掛載使用nfs V3版本(避免同步延遲)    #[root@centos /]# mount  -o vers=3 100.100.100.102:/share  /share[root@centos ~]# mount | grep /share 100.100.100.102:/share on /share type nfs (rw,vers=4,addr=100.100.100.102,clientaddr=100.100.100.103)[root@centos share]# echo haha>1.txt-bash: 1.txt: Permission denied  #此時,無法寫入文件,因為沒有文件系統權限,/share目錄所屬用戶是root,我們進行掛載時,用戶為nfsnobody,因此沒有權限。有多種方法,這裡示例兩種。1)修改配置文件[root@centos ~]# vim /etc/exports    /share  100.100.100.103(no_root_squash,rw)[root@centos share]# echo haha>1.txt[root@centos share]# lltotal 4-rw-r--r-- 1 root root 5 Jan  1 21:38 1.txt2)修改文件系統權限chmod 777 /share

4、卸載和自動掛載

卸載:

1. 卸載客戶端的掛載目錄            umount 掛載點     2. 停止伺服器端的共享         exportfs –au

自動掛載

[root@centos ~]# vim /etc/fstab 格式:    :  nfs < options> 0 0     100.100.100.102:/share /sharenfs defaults 0 0     #100.100.100.102:/share /share                   nfs     defaults,vers=3 0 0(指定版本)[root@centos ~]# mount –a

exportfs命令

如果我們在啟動了NFS之後又修改了/etc/exports,是不是還要重新啟動nfs呢?這個時候我們就可以用exportfs 命令來使改動立刻生效,該命令格式如下:

格式:exportfs [-aruv] -a 全部掛載或卸載 /etc/exports中的內容  -r 重新讀取/etc/exports 中的信息 ,並同步更新/etc/exports、/var/lib/nfs/xtab -u 卸載單一目錄(和-a一起使用為卸載所有/etc/exports文件中的目錄) -v 在export的時候,將詳細的信息輸出到螢幕上。

具體例子:

# exportfs -au 卸載所有共享目錄 # exportfs -ra 重新共享所有目錄並輸出詳細信息

rpcinfo命令

rpcinfo -p 可以查看出RPC開啟的埠所提供的程序有哪些,其中nfs 開啟的是2049,portmapper(rpcbind) 開啟的是111,其餘則是rpc開啟的

文章來源: https://twgreatdaily.com/zh-tw/ok3sbG8BMH2_cNUgTlel.html