NFS

一、NFS的幾個概念

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

簡單的說是函數調用(遠程主機上的函數) 一部分功能由本地程序完成 另外一部分功能由遠程主機上的函數完成。客戶端掛載了nfs服務器的文件系統時,進行一些操做,可是這些操做服務端如何知道呢??這但是在內核級別上實現協議。RPC就解決了這個問題,它會將客戶端的操做的函數調用發送到服務器端,由服務器端執行這些函數調用。linux

idmapd:

想一想這種情形,nfs客戶端在掛載文件系統之後,在本地以某用戶的身份建立了一個文件,在服務器端這個文件的屬主和屬組是哪一個用戶呢?早期是經過NIS(Network Information Services網絡信息服務)來解決這個問題的,可是在傳輸帳號和密碼時,使用的是明文傳輸,如今使用LDAP+clbbler來實現的。可是,NFS使用的是idmapd這個服務,有rpc提供,將全部的用戶後映射爲nfsnobody,可是在訪問的時候,仍是以本地UID對應的本地用戶來使用的。web

mounted:

NFS是經過什麼來控制那些客戶端能夠訪問,那些不能夠訪問的呢?NFS只支持經過IP來控制客戶端,而這個功能是由守護進程mounted來實現的,它監聽的端口是半隨機的。所謂的半隨機指的是,這個隨機端口是由rpc服務來決定的,而rpc是經過隨機的方式。做用等等同於小區大門保安的做用。vim

二、NFS請求過程

在CentOS6.5中,NFS服務端監聽在tcp和udp的2049端口,服務名是nfs、pc監聽於tcp和udp的111號端口,服務名是portmapper。centos

請求過程:當客戶端試這去掛載使用nfs共享的文件系統是,客戶端首先回去與postmapper(tcp/111)端口去註冊使用,此時postmapper會隨機分配一個端口給mounted,而後mounted這個守護進程會來驗證客戶端的合法性,驗證經過後,會把請求交給nfs服務,客戶端此時能夠掛載使用了,用戶在建立文件時,會使用到idmapd的守護進程來映射屬主。其實idmapd也是有rpc服務提供的,只不過在這裏,nfs服務使用到用戶映射的功能時,會自動的去調用此守護進程。服務器

========================================================================================================================網絡

3:原理app

nfs服務器主要端口是2049,早期是同時啓動1024如下的端口來響應客戶機。如今端口很大異步

nfs服務器啓動隨機獲取端口,並rpc註冊,因此rcp就知道NFS的端口了。async

rpc 同時使用固定端口111來監客戶端需求,同時把知道的正確nfs端口發給客戶。tcp

客戶機和nfs 直接聯繫了

 

4權限

1NFS server和 NFS client 恰好用相同的賬號和羣組。這時能夠直接存取

 (2) NFS server和NFS client  UID 正好相同,用戶名不一樣, 能夠存取,但有危險性

(3)當NFS server 沒有相對應的UID時,NFS client會被壓縮成匿名用戶nfsnobody。也有例外,就是當NFS server 共享目錄爲/tmp時,NFS client用戶創建的資料會變成無擁有者

(4) NFS client root 用訪問時,會壓縮成匿名者

 

5NFS服務器配置權限要點:

  (1)服務器/etc/exports 裏權限設定用關

  (2)共享的目錄實際權限,也就是目錄自己可寫

  (3)使用者的UID身份

 

6:配置文件

# yum install rpcbind nfs-utils

 

/usr/sbin/rpc.mountd

/usr/sbin/rpc.nfsd

 

/etc/exports        共享的目錄和權限

/usr/sbin/exportfs  服務器端維護共享資源的指令

 

/var/lib/nfs/etab   記錄NFS共享目錄的權限設定值

/var/lib/nfs/xtab   記錄NFS相關的科技機鏈接數據

 

/usr/sbin/showmount  客戶端查看共享資源的指令 

 

 

# /etc/rc.d/init.d/rpcbind start

# /etc/rc.d/init.d/nfs start

[root@centos ~]# /etc/rc.d/init.d/nfs start

Starting NFS services:                                     [  OK  ]

Starting NFS mountd:                                       [  OK  ]

Starting NFS daemon:                                       [  OK  ]

Starting RPC idmapd:                                       [  OK  ]

  

7:共享目錄配置文件:

/etc/exports:

文件系統  客戶機(權限)  客戶機(權限)  客戶機(權限)          

      注意客戶機:能夠是IP ,網段,主機名

      權限:rw 讀寫       ro 只讀  

            sync(同步)  async(異步)

            no_root_squash (不壓縮root) root_squash(壓縮root)

            all_squash (通通壓縮爲nfsnobody

            anonuid (匿名的uid) anongid (匿名的gid

 

測試:

NFS 服務器 : 

# useradd -u 600 test

# mkdir -pv /web/www

# setfacl -m u:test:rwx /web/www/

# vim /etc/exports 

/web/www 192.168.2.20(rw) 192.168.2.0/24(rw)

 

NFS 客戶端:

# useradd -u 600 test

 

# showmount -e 192.168.2.34  

Export list for 192.168.2.34:

/web/www 192.168.2.0/24

 

# mkdir /mnt/nfs

# mount -t nfs 192.168.2.34:/web/www /mnt/nfs/

 

 

匿名用戶登陸後 創建文件uid gid 都爲601.並能夠讀寫

[root@centos ~]# groupadd -g 601 nfsanon

[root@centos ~]# useradd -u 601 -g nfsanon nfsanon

[root@centos ~]# mkdir /nfs/linux -pv

[root@centos ~]# setfacl -m u:nfsanon:rwx /nfs/linux/

[root@centos ~]# cat /etc/exports 

/web/www 192.168.2.20(rw) 192.168.2.0/24(rw)

/nfs/linux 192.168.2.0/24(rw,all_squash,anonuid=601,anongid=601)

[root@centos ~]# exportfs -ar

 

# exportfs -ar : 從新到出全部的文件系統

# exportfs -au: 關閉處處的全部文件系統

# rpcinfo -p   查看監聽的端口

 

小知識:開機掛載時/etc/fstab

server:/path/  /mount_point   nfs  defaults,_netdev 0 0  

                                               _netdev 是跳過網絡檢查

經常使用命令

showmount是用來查看nfs服務的狀況

用法:showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

可使用短選型,也可使用長選項。

-a :這個參數是通常在NFS SERVER上使用,是用來顯示已經mount上本機nfs目錄的cline機器。   
-e :顯示指定的NFS SERVER上export出來的目錄。
 

exportfs:通常用在當NFS服務啓動後,使用此命令來控制共享目錄的導出

用法:exportfs [-aruv] 
-a :所有mount或者unmount /etc/exports中的內容 
-r :從新mount /etc/exports中分享出來的目錄 
-u :umount目錄 
-v :在export的時候,將詳細的信息輸出到屏幕上。 
具體例子: 
# exportfs -au 卸載全部共享目錄 
# exportfs -rv 從新共享全部目錄並輸出詳細信息

客戶端的使用

先使用 showmont -e SER_NAME 來發現服務端的共享的目錄

而後使用mount掛載使用,格式:

mount -t nfs SER_NAME:/data /parth/to/someponit [-o 選項]

mount -t nfs 192.168.1.99:/mydat /mnt -o rsize=4096

rsize 的值是從服務器讀取的字節數。wsize 是寫入到服務器的字節數。默認都是1024, 若是使用比較高的值,如8192,能夠提升傳輸速度。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息