02-NFS存儲服務

一、NFS存儲服務概念

NFS 是 Network File System 的縮寫及網絡文件系統。 NFS 主要功能是經過局域網絡讓不一樣的主機系統之間能夠共享文件或目錄,NFS客戶端能夠經過掛載的方式將NFS服務端共享數據的文件目錄掛載到本地掛載點,這樣對本地掛載點目錄中的數據進行操做其實就是操做NFS服務端共享數據的文件目錄python

爲何要使用數據存儲共享服務?web

  1. 實現多臺服務器之間數據共享
  2. 實現多臺服務器之間數據一致

二、NFS應用場景

沒有共享存儲的場景:shell

一、A 用戶上傳圖片通過負載均衡,負載均衡將上傳請求調度至 WEB1 服務器上。
二、B 用戶訪問 A 用戶上傳的圖片,此時 B 用戶被負載均衡調度至 WEB2 上,由於 WEB2 上沒有這張圖片,因此 B用戶沒法看到 A 用戶傳的圖片vim

有共享存儲的場景:安全

1.A 用戶上傳圖片不管被負載均衡調度至 WEB1 仍是 WEB2, 最終數據都被寫入至共享存儲
2.B 用戶訪問 A 用戶上傳圖片時,不管調度至 WEB1 仍是 WEB2,最終都會上共享存儲訪問對應的文件,這樣就能夠訪問到資源bash

三、NFS和RPC

NFS服務必須依賴於RPC(遠程調用服務)才能工做。由於NFS支持的功能特別多,而不一樣的功能都會使用不一樣的程序來啓動,每啓動一個功能就會用一個隨機未被使用的端口來傳輸數據,所以,NFS的功能所對應的端口沒法固定。因此客戶端要準確的得到NFS服務所使用的端口就須要RPC服務。RPC最主要的功能就是記錄每一個NFS功能所對應的端口號,而且在NFS客戶端請求時將該端口和功能對應的信息傳遞給請求數據的NFS客戶端,讓客戶端能夠連接到正確的端口上去,從而實現數據傳輸。服務器

NFS服務啓動時會隨機取用多個端口,並主動向RPC服務註冊取用的相關端口信息,這樣,RPC服務就能夠知道每一個端口所對應的NFS功能,而後RPC服務使用固定的端口號111來監聽NFS客戶端提交的請求,並將正確的NFS端口答應給NFS客戶端,這樣一來,就可讓NFS客戶端與服務端進行數據傳輸了。網絡

四、NFS服務端部署

4-1 安裝軟件

yum -y install nfs-utils rpcbind

4-2 編寫配置文件

[root@nfs ~]# vim /etc/exports
# 格式: 01 02(03)
#01: 設置數據存儲的目錄 /data
#02: 設置網絡一個白名單 (容許哪些主機鏈接到存儲服務器進行數據存儲)
#03: 配置存儲目錄的權限信息 存儲目錄一些功能
/data   172.16.1.0/24(rw,sync)
#注意IP地址和小括號之間沒有空格

4-3 建立共享數據目錄並受權

[root@nfs ~]# mkdir /data -p
root@nfs ~]# chown -R nfsnobody.nfsnobody /data

4-4 啓動服務

  1. 啓動rpc服務,開啓111端口
  2. 啓動nfs服務
  3. 實現nfs服務進程和端口號的註冊
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs
# 檢查nfs服務進程與端口註冊信息
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

五、客戶端掛載部署

客戶端安裝nfs服務十分簡單,只須要安裝nfs軟件包便可app

# 1.安裝NFS服務軟件
[root@web01 ~]# yum -y install nfs
# 2.實現遠程掛載共享目錄
[root@web01 ~]# mount -t nfs 172.16.1.31:/data  /mnt
# 3.測試數據是否正常寫入
[root@web01 ~]# echo "testtesttest" > /mnt/test.txt
[root@web01 ~]# cat /mnt/test.txt
testtesttest
  • 實現開機自動掛載
# 1.利用rc.local
echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
# 2.利用fstab文件
vim /etc/fstab
172.16.1.31:/data   /mnt   nfs  defaults   0 0
  • 卸載
[root@web01 ~]# umount /mnt

六、NFS存儲目錄權限

rw ---讀寫權限
ro ---只讀權限
root_squash     ---當 NFS 客戶端以 root 管理員訪問時,映射爲 NFS 服務器的匿名用戶(不經常使用)
no_root_squash  ---當 NFS 客戶端以 root 管理員訪問時,映射爲 NFS 服務器的 root 管理員(不經常使用)
all_squash	    ---不管 NFS 客戶端使用什麼帳戶訪問,均映射爲 NFS 服務器的匿名用戶(經常使用)
no_all_squash   ---不管 NFS 客戶端使用什麼帳戶訪問,都不進行壓縮
sync     ---同時將數據寫入到內存與硬盤中,保證不丟失數據
async    ---優先將數據保存到內存,而後再寫入硬盤;這樣效率更高,但可能會丟失數據
anonuid  ---配置 all_squash 使用,指定 NFS 的用戶 UID,必須存在系統
anongid  ---配置 all_squash 使用,指定 NFS 的用戶 UID,必須存在系統

6-1 驗證ro權限

  • 服務端配置
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)

[root@nfs ~]# systemctl reload nfs  
# restart:將全部鏈接會話都會直接斷開
# reload:  只會將沒有數據傳輸連接斷開,從新創建鏈接,讓用戶訪問感覺更好
  • 客戶端掛載
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# df -h
Filesystem         Size  Used Avail Use% Mounted on
devtmpfs           471M     0  471M   0% /dev
tmpfs              487M     0  487M   0% /dev/shm
tmpfs              487M   15M  472M   3% /run
tmpfs              487M     0  487M   0% /sys/fs/cgroup
/dev/sda2           14G  8.6G  5.4G  62% /
/dev/sda1          2.8G  272M  2.6G  10% /boot
tmpfs               98M   12K   98M   1% /run/user/42
tmpfs               98M     0   98M   0% /run/user/0
172.16.1.31:/data   14G  6.8G  7.3G  49% /mnt
  • 讀寫測試
## root用戶測試
# 寫入測試,不能寫入
[root@web01 ~]# echo "hello,hello" > /mnt/hello.txt
-bash: /mnt/hello.txt: Read-only file system
# 讀取測試,能夠正常讀取數據
[root@web01 ~]# cat /mnt/test.txt 
hello,hello

## 普通用戶測試
# 讀取測試,能夠正常讀取數據
[python@web01 ~]$ cat /mnt/test.txt 
hello,hello
# 寫入測試,不能寫入
[python@web01 ~]$ echo "hello" >  /mnt/hello.txt
-bash: /mnt/hello.txt: Read-only file system

6-2 驗證all_squash、anonuid、anongid 權限

  • 服務端配置:
[root@nfs ~]# cat /etc/exports 
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=1005,anongid=1005)
  • 建立用戶並受權:
[root@nfs ~]# useradd -M -u 1005 www -s /sbin/nologin        
[root@nfs ~]# id www
uid=1005(www) gid=1005(www) groups=1005(www)
[root@nfs01 ~]# chown -R www:www /data/
[root@nfs ~]# ll /data/ -d
drwxr-xr-x. 5 www www 67 Jul  7 23:08 /data/
  • 重啓NFS服務
[root@nfs ~]# systemctl reload nfs
[root@nfs ~]# systemctl reload nfs
  • 客戶端操做:
# 1.建立www用戶uid=1005 gid=1005
[root@web01 ~]# useradd -M -u 1005 www -s /sbin/nologin
# 寫入數據測試
[root@web01 ~]# echo 'hello' > /mnt/hello.txt
[root@web01 ~]# ll /mnt/hello.txt
-rw-r--r-- 1 www www 6 Jul  8 00:07 /mnt/hello.txt

# 讀取數據測試
[root@web01 ~]# cat /mnt/hello.txt 
hello

七、查看NFS端口

[root@nfs ~]# rpcinfo  -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  57640  status
    100024    1   tcp  56096  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  56967  nlockmgr
    100021    3   udp  56967  nlockmgr
    100021    4   udp  56967  nlockmgr
    100021    1   tcp  44817  nlockmgr
    100021    3   tcp  44817  nlockmgr
    100021    4   tcp  44817  nlockmgr

八、客戶端mount命令參數

rw   	--- 實現掛載後掛載點目錄可讀可寫  (默認)
ro   	--- 實現掛載後掛載點目錄可讀可寫
suid 	--- 在共享目錄中可讓setuid權限位生效  (默認)
nosuid 	--- 在共享目錄中可讓setuid權限位失效   提供共享目錄的安全性
exec 	--- 共享目錄中的執行文件能夠直接執行
noexec 	--- 共享目錄中的執行文件能夠沒法直接執行 提供共享目錄的安全性
auto 	--- 能夠實現自動掛載     mount -a 實現加載fstab文件自動掛載
noauto 	--- 不能夠實現自動掛載
nouser 	--- 禁止普通用戶能夠卸載掛載點
user 	--- 容許普通用戶能夠卸載掛載點
相關文章
相關標籤/搜索