NFS文件共享
NFS(Network File System)是網絡文件系統,是由sun公司開發的一種通過網絡方式共享文件系統的通用共享解決方案,目前NFS有三個版本,分別是NFSv2、NFSv3、NFSv4。V2雖然比較老,但是他的兼容性很好,CentOS7版本默認使用版本4提供NFS網絡文件系統共享服務,NFS監聽在TCP2049端口。
當倆台計算機需要通過網絡建立連接時,雙方主機就一定要提供一些基本信息,如:IP地址、服務端口號等;當有100台客戶端需要訪問某台服務器時,服務器就需要記住這些客戶端的IP地址以及相應的端口號等信息。而這些信息需要程序來管理。在Linux中,這些的信息可以由某個特定服務自己來管理,也可以委托RPC來幫助自己管理。RPC是遠程調用協議,RPC協議為遠程通信程序管理通信雙方所需的基本信息。這樣NFS就可以專注於如何共享數據,支語通信的連接以及連接的基本信息,則全權委托給RPC管理,CentOS7系統由rpcbind服務提供RPC服務提供RPC協議的支持,目前NFSv4雖然不再需要與rpcbind直接交互,單rpc.mountd依然是NFSv4所必須的服務。所以,如果在CentOS7平台上實現NFS共享,需要同時啟動NFS與rpcbind服務
所需軟件包:nfs-utils rpcbind(提供地址與端口注冊服務)
一條完整的共享條目語法結構如下,其中,客戶端主機可以是一個網段、單台主機或主機名
共享路徑 客戶端主機(選項)
我們也可以為多個客戶主機設置不通的訪問選項
共享路徑 客戶端主機1(選項) 客戶端主機2(選項)
最簡單的NFS配置可以僅給定一個共享路徑與一個客戶端主機,而不是指定選項,因為沒有選項時,NFS將使用默認設置,而默認屬性為ro、sync、wdelay、no_root_squash。具體NFS屬性以及其對應含義看選項
NFS選項:
NFS選項 |
功能 |
ro |
只讀共享 |
rw |
可讀可寫共享 |
sync |
同步寫操作 |
async |
異步寫操作 |
wdelay |
延遲寫操作 |
root_squash |
屏蔽遠程root權限 |
no_root_squash |
不屏蔽遠程root權限 |
all_squash |
屏蔽所有的遠程用戶權限 |
以上選項中,ro與rw比較容易理解,用來定義客戶端訪問共享時可以獲得的權限是只讀訪問換時可讀可寫訪問。計算機對數據進行修改時會先將修改的內容寫入快速的內存,隨后才會慢慢寫入慢速的硬盤設備中,async選項允許NFS服務器在沒有完全把數據寫入硬盤前就返回成功消息給客戶端,而此時數據實際還存放在內存中,但客戶端則顯示數據已經寫入成功。這里要注意,該選項僅僅影響操作信息的返回時間,並不決定如何進行寫操作,sync選項確保在數據正真寫入存儲設備后才會返回成功信息。wdelay為延遲寫入選項。也就是說,他決定了先將數據寫入內存,再寫入磁盤,然后將多個寫入請求合並后寫入硬盤,這樣可以減少對磁盤IO的次數,從而優化性能,該選項可以優化NFS性能,單有可能導致非正常關閉NFS時數據丟失情況的發生。於此相反的選項就是no_wdelay,但該選項與async選項一起使用時將不會生效,因為async時基於wdelay實現對客戶端使用root賬號訪問NFS時,服務器虛榮默認會自動將root映射為服務器本地的匿名賬號,通過anonuid可以指定匿名賬號id,默認anonuid為65534,也就是nfsnobody賬號,使用no_root_squash可以防止這種映射而保留root權限,all_squash選項則可以屏蔽多有賬戶權限,將所有的用戶對NFS的訪問自動映射為服務器本地的匿名賬戶。默認情況下,普通賬號的權限時保留的,也就是沒有進行squash操作
server端:
安裝NFS服務
[root@localhost ~]# yum install -y nfs-utils rpcbind
檢測是否安裝成功
[root@localhost ~]# rpm -qa nfs-utils rpcbind rpcbind-0.2.0-32.el7.x86_64 nfs-utils-1.3.0-0.21.el7.x86_64
創建一個共享的目錄
[root@localhost ~]# mkdir /var/web [root@localhost ~]# chmod a+w /var/web/
NFS配置文件時/etc/exports,是一個新的文件,所以直接添加就可以
[root@localhost ~]#cat /etc/exports /var/web/ 192.168.17.0/24(rw,async)
要共享的目錄 允許訪問的網段(可以是一個IP地址或者主機名) rw是指可讀可寫
sync是指同步寫入磁盤
[root@localhost ~]# systemctl start rpcbind.service [root@localhost ~]# systemctl start nfs.service [root@localhost ~]# systemctl enable rpcbind.service [root@localhost ~]# systemctl enable nfs-server Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
查看啟動是否成功
[root@localhost ~]# showmount -e 192.168.17.130 Export list for 192.168.17.130: /var/web 192.168.17.0/24
若要想客戶端主機可以訪問並使用服務器所提供的共享目錄,可通過mount命令掛載NFS共享
#mount -t nfs -o 選項 服務主機:/服務器共享目錄 /本地掛載目錄
client端:
客戶端進行安裝NFS
[root@localhost ~]# yum install -y nfs-utils rpcbind
掛載
[root@localhost ~]# mount 192.168.17.130:/var/web/ /opt [root@localhost ~]# mount | grep /opt/ [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 18G 940M 17G 6% / devtmpfs 479M 0 479M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.7M 483M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 497M 125M 373M 25% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.17.130:/var/web 18G 1.1G 17G 6% /opt [root@localhost ~]# mount | grep /opt 192.168.17.130:/var/web on /opt type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.17.131,local_lock=none,addr=192.168.17.130)
添加到開機自動掛載
[root@localhost ~]# cp -a /etc/fstab /etc/fstab.bak [root@localhost ~]# echo "192.168.17.130:/var/web /opt nfs defaults,_netdev 0 0" >>/etc/fstab [root@localhost ~]# tail -1 /etc/fstab 192.168.17.130:/var/web /opt nfs defaults,_netdev 0 0 [root@localhost ~]# umount /opt/ [root@localhost ~]# mount -a [root@localhost ~]# mount | grep nfs 192.168.17.130:/var/web on /opt type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.17.131,local_lock=none,addr=192.168.17.130,_netdev)
server端:
[root@localhost ~]# cat /var/lib/nfs/etab /var/web 192.168.17.0/24(rw,async,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
除了使用NFS的掛載參數來控制權限外,還可以通過共享目錄本身的權限來進行控制
實驗結果:
在server寫一個測試文件
客戶端就可以查看