NFS (Network File System,網絡文件系統),經過網絡讓不一樣的機器、不一樣的操做系統可以彼此分享個別的數據,讓應用程序在客戶端經過網絡訪問位於服務器磁盤中的數據,是在類Unix系統間實現磁盤文件共享的一種方法。 NFS 的基本原則是「允許不一樣的客戶端及服務端經過一組RPC分享相同的文件系統」,它是獨立於操做系統,容許不一樣硬件及操做系統的系統共同進行文件的分享。vim
NFS在文件傳送或信息傳送過程當中依賴於RPC協議。RPC, (Remote Procedure Call,遠程過程調用)是能使客戶端執行其餘系統中程序的一種機制,RPC採用C/S模式。NFS自己是沒有提供信息傳輸的協議和功能的,但NFS卻能讓咱們經過網絡進行資料的分享,這是由於NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。能夠說NFS自己就是使用RPC的一個程序;或者說NFS也是一個RPC SERVER,因此只要用到NFS的地方都要啓動RPC服務,不管是NFS SERVER或者NFS CLIENT。這樣SERVER和CLIENT才能經過RPC來實現PROGRAM PORT的對應。能夠這麼理解RPC和NFS的關係:NFS是一個文件系統,而RPC是負責負責信息的傳輸。安全
注意:RPC服務啓動以後才能啓動nfs服務,由於nfs服務要到RPC註冊端口號。服務器
(1)客戶端向NFS服務器發送資源請求時,客戶端RPC服務經過網絡向NFS服務器的RPC(111端口)服務發出資源請求。網絡
(2)NFS服務器的RPC端口獲取到服務器端nfs服務註冊端口,通知客戶端RPC服務器app
(3)客戶端收取到正確的端口以後,直接與服務端的nfs服務創建通訊。異步
(4)服務器nfs服務接受到請求資源以後本地響應讀取本地磁盤中的內容,而後返回至客戶端這樣就完成一次存取操做。async
(1)節省本地存儲空間ide
(2)用戶不須要再網絡中的每一個機器上都建有home目錄性能
NFS v2 | NFS v3 | NFS v4 |
只支持32位文件傳輸,最大文件數爲4G | 支持64位傳輸 | CentOS 7 默認使用NFS v4,實現僞根掛載,輔助服務不須要,徹底支持kerberos |
文件傳輸尺寸限制在8K | 沒有文件尺寸限制 | |
無 | v3增長和完善了許多錯誤和成功信息的返回,對於服務器的設置和管理能帶來很大好處 | 改進了INTERENT上的存取和執行效能在協議中加強了安全方面的特性 |
只提供了對UDP協議的支持,在一些高要求的網絡環境中又很大限制 | 增長了對TCP傳輸協議的支持,有更好的I/O性能 | 只支持TCP傳輸,經過一個安全的帶內系統,協商在服務器和客戶端之間使用的安全性類型使用字符串而不是整數倆表示用戶和組標識符 |
rpm.nfsd 最主要的NFS進程,管理客戶端是否可登錄,登入者ID的判斷。監聽在2049端口測試
rpc.mount 主要功能管理NFS的文件系統。當客戶端經過rpc.nfsd登入主機後,使用NFS服務器提供的文件以前,還會通過文件使用權限的認證程序。讀取/etc/exports
配置文件來對比客戶端的權限;若是權限認證經過,客戶端就可使用NFS提供的文件了。
rpc.lockd 管理文件鎖,避免同時寫錯
rpc.statd 檢查文件一致性,可修復文件
軟件包名:nfs-utils
配置文件
/etc/exports.d和/etc/exports
配置NFS使用固定端口
RQUOTAD_PORT
LOCKD_TCPPORT
LOCKD_UDPPORT
MOUNTD_PORT
STATD_PORT rpc.statd監聽端口
STATD_OUTGONING_PORT outgoing設置端口
鎖配置文件
/etc/modprobe.d/lockd.conf
nfs服務啓動配置文件
/etc/sysconfig/nfs
命令配置文件
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/osd_login
/sbin/rpc.statd
/sbin/umount.nfs
/sbin/umount.nfs4
/etc/exports
配置文件格式
/DIR(共享的文件或目錄) 主機1(opts) 主機2(opts)
主機格式:
單個主機:IPv4 IPv6 FQDN
IP network:兩種掩碼格式均支持
0.0.0.0/24
0.0.0.0/255.0.0.0
wildcards:主機名通配,例如*.localhost.com
netgroups:NIS域主機組,@group_name
anonymous:表示使用*通配全部客戶端
ops:
secure:使用了1024如下的TCP/IP端口實現NFS的鏈接。
insecure:容許客戶端從大於1024的TCP/IP端口實現NFS鏈接。
rw:容許NFS客戶機進行讀寫訪問
ro:容許NFS客戶機進行只讀訪問
async:異步,數據變化後不當即寫磁盤,能夠改進性能
no_wdelay:關閉寫延時;若是設置了async,NFS會忽略這個選項
nohide:若是將一個目錄掛載到另一個目錄上,那麼原來的目錄一般就被隱藏起來,這個選項禁用這種行爲。
hide:隱藏原來目錄中的內容
no_stbtree_check:關閉子樹檢查;子樹檢查會執行一些不想忽略的安全性檢查。默認啓用子樹檢查
mp(mountpoint=path):NFS要求掛載所導出的目錄
no_auth_nlm:NFS守護進程不要對加鎖請求進行認證。默認爲auth_nlm或secure_locks
fsid=num|root|uuid:NFS須要識別每一個文件系統。
crossmnt:這個選項相似於nohide,使得客戶端能訪問掛載目錄下的文件。例如若是B目錄掛載A目錄上,設置crossmnt在A目錄上不被隱藏。
經過NFS中的用戶映射,能夠將僞或實際用戶和組的表示賦給一個正在對NFS捲進行操做的用戶,這個NFS用戶具備映射所容許的用戶和組的許可權限。對NFS卷使用一個經過的用戶/組能夠提供必定的安全性和靈活性。
在使用NFS掛載的文件系統上的文件時,用於的訪問一般都會受到限制,都是以匿名用戶的身份對文件進行訪問的,這些用戶缺省的狀況下對這些文件只有只讀權限。NFS容許指定訪問遠程文件用戶經過用戶標識號和組標識號,能夠禁用正常的squash行爲
用戶映射選項
root_squash:將root用戶及所屬組映射爲匿名用戶或用戶組,默認選項
no_root_squash:容許root用戶訪問掛載NFS卷
all_squash:對於公共訪問的NFS卷時很是有用的,它會限制全部的UID和GID,只使用匿名用戶(nfsnobody)訪問NFS卷
anonuid:將遠程訪問的全部用戶都映射爲匿名用戶,並制定該用戶爲本地用戶(UID=NUM)
anongid:將遠程用戶的全部用戶組都映射爲匿名用戶組帳戶,並指定該匿名用戶組帳戶爲本地用戶組帳戶(GID=NUM)
fg:前臺掛載
bg:後臺掛載
hard:持續請求
soft:非持續請求
rsize:從服務器中讀取的字節數
wsize:寫入服務器的字節數,默認爲1024,若是使用比較高的值,能夠提升傳輸速度
_netdev:網絡設備掛載,若是檢測到網絡自動掛載
(1)exportfs 管理當前NFS共享文件系統列表
-a 打開或取消全部目錄共享
-o 指定一列共享選項
-i 忽略`/etc/exports`文件,從而只是用默認的和命令行指定的選項
-r 從新讀共享全部目錄。它是/etc/exportfs和/var/lib/nfs/xtab同步。
-u 取消一個或多個目錄共享
-v 輸出詳細信息
(2)showmount 查詢mountd守護進程,以顯示NFS服務器加載的信息
-d 僅顯示以被NFS客戶端加載的目錄
-e 顯示NFS服務器上的全部共享目錄
(3)rpcinfo 顯示portmap的有關信息
-p 列出全部host用portmap註冊的RPC程序,若是沒有指定host,就查找本機上RPC程序
-u RPC調用host程序program的version版本,並報告是否接受到相應
-t TCP RPC調用host程序program的version版本,並報告是否接收到響應
-n 根據-t或者-u,使用編號爲port的端口,而不是portmap指定的端口
-d 將程序program的version版本從本機的RPC註冊表中刪除。注意只用root權限的用戶纔可使用此選項。
-s 查看RPC註冊程序
(4)mount.nfs 掛載NFS
-r 只讀掛載
-w 讀寫掛載
-f 假掛載,不實際調用mount
-n 不更新/etc/mtab
(1)CentOS 7 共享目錄/app/testnfs
[root@localhost/app]#vim /etc/exports
1 /app/testnfs 192.168.4.132
(2)使用命令exportfs重讀
[root@localhost/app]#exportfs -r
(3)CentOS 6使用showmount命令查看
[root@localhost/app]#showmount -e 192.168.4.60
(4)掛載
[root@localhost ~]# mount -t nfs 192.168.4.60:/app/testnfs /mnt/nfs/
若是不NFS服務器中掛載不添加任何選項,默認爲
ro,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash
若是客戶對文件有寫權限,可是此目錄NFS設爲只要只讀權限,因此對NFS寫不進去文件或建立目錄等等操做。若是須要這種操做須要確保文件對此目錄是否有寫權限,而且NFS共享時是否設置了讀寫權限;只有二者同時具有才能夠寫操做。
這時咱們開啓NFS共享文件的權限
[root@localhost/app]#chmod 777 /app/testnfs
再次寫去測試便可建立
(1)建立一個目錄並在目錄下在建立目錄
[root@localhost/app/testnfs]#mkdir nfs1
[root@localhost/app/testnfs]#mkdir nfs2
(2)配置共享文件
[root@localhost/app/testnfs]#vim /etc/exports
1 /app/testnfs 192.168.4.132(rw,fsid=0,crossmnt)
2 /app/testnfs/nfs1 192.168.4.132(rw,root_squash)
3 /app/testnfs/nfs2 192.168.4.132(ro)
[root@localhost/app/testnfs]#exportfs -v
/app/testnfs 192.168.4.132(rw,sync,wdelay,hide,crossmnt,no_subtree_check,fsid=0,sec=sys,secure,root_squash,no_all_squash)
/app/testnfs/nfs1
192.168.4.132(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/app/testnfs/nfs2
192.168.4.132(ro,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
咱們也能夠經過 /var/lib/nfs/etab
[root@localhost/app/testnfs]#cat /var/lib/nfs/etab
/app/testnfs/nfs2 192.168.4.132(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,no_all_squash)
/app/testnfs/nfs1 192.168.4.132(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,no_all_squash)
/app/testnfs 192.168.4.132(rw,sync,wdelay,hide,crossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,fsid=0,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,no_all_squash)
(3)測試
[root@localhost ~]# showmount -e 192.168.4.60
[root@localhost ~]# mount -t nfs 192.168.4.60:/ /mnt/nfs/
[root@localhost nfs1]# touch nfs.txt
[root@localhost nfs1]# ll
-rw-r--r--. 1 nfsnobody nfsnobody 0 Oct 15 2017 nfs.txt
此時咱們看建立文件的全部者及所屬組都爲nfsnobody,這裏就驗證了咱們剛剛前面提到的root用戶映射爲匿名用戶nfsnobody。
[joah@localhost nfs1]$ ll
-rw-rw-r--. 1 joah joah 0 Oct 15 2017 nfs2.txt
-rw-r--r--. 1 nfsnobody nfsnobody 0 Oct 15 2017 nfs.txt
經過上述查看非系統帳號建立的文件的全部者及所屬組爲本身自己。
此時咱們在NFS服務器上查看文件
[root@localhost/app/testnfs/nfs1]#ll
-rw-rw-r--. 1 500 500 0 Oct 15 23:45 nfs2.txt
-rw-r--r--. 1 nfsnobody nfsnobody 0 Oct 15 23:42 nfs.txt
在客戶端建立的文件在NFS服務器上的全部者和所屬組都爲500。而客戶端joah的全部者和所屬組的id也爲500,這也驗證了上述說明的用戶映射。若是服務器500這個id號被佔用如何處理?
[root@localhost/app/testnfs/nfs1]#ll
-rw-rw-r--. 1 li 500 0 Oct 15 23:45 nfs2.txt
此時全部者不同了。這樣有時就會出現問題。
關於權限
(1)客戶端鏈接時候,對普通用戶檢查
a、若是明確設定了普通用戶被壓榨,那麼此時客戶端用戶的身份轉換爲指定用戶
b、若是沒有明確指定,那麼此時用戶身份被壓榨成nfsnobody
(2)客戶端鏈接時,對root的檢查
a、若是設置no_root_squash,此時root用戶身份被壓榨成NFS服務器上的root
b、若是設置了all_squash、anonuid、anongid,此時root的身份被壓榨爲指定用戶
c、若是沒有明確指定,root被壓榨爲nfsnobody
d、若是同時指定no_root_squash和all_squash用戶將被壓榨爲nfsnobody;若是設置了anonuid、anongid將被壓榨爲指定用戶與組
Autofs與Mount/Umount的不一樣之處在於,它是一種看守程序。若是它檢測到用戶正試圖訪問一個還沒有掛接的文件系統,它就會自動檢測該文件系統,若是存在,那麼Autofs會自動將其掛接。另外一方面,若是它檢測到某個已掛接的文件系統在一段時間內沒有被使用,那麼Autofs會自動將其卸載。所以一旦運行了Autofs後,用戶就再也不須要手動完成文件系統的掛接和卸載。
主配置文件
/etc/autos.conf
配置掛載文件
/etc/auto.master
(1)相對路徑法
/etc/auto.master
配置格式
DIRNAME 子配置文件
子配置文件格式
BASENAME 須要掛載的文件等
示例 :
[root@localhost ~]# vim /etc/auto.master
/mnt /etc/auto.nfs
[root@localhost ~]# vim /etc/auto.nfs
nfs -fstype=nfs 192.168.4.60:/
重啓服務測試便可
[root@localhost ~]# cd /mnt/nfs/
[root@localhost nfs]# ls
fstab nfs1 nfs2
(2)絕對路徑法
/etc/auto.master
配置格式
/- 子配置文件
子配置文件格式
掛載點路徑 被掛載文件等
示例:
[root@localhost ~]# vim /etc/auto.master
/- /etc/auto.nfs
[root@localhost ~]# vim /etc/auto.nfs
/mnt/nfs -fstype=nfs 192.168.4.60:/
重啓服務測試便可
[root@localhost ~]# cd /mnt/nfs/
[root@localhost nfs]# ls
fstab nfs1 nfs2
注意:若是父目錄不存在時,會自動建立。使用絕對路徑不會隱藏原來目錄下目錄中的內容。