天天學五分鐘 Liunx 111 | 存儲篇:NFS


NFS

NFS(Network File System,網絡文件系統),它能夠經過網絡讓不一樣操做系統,不一樣機器共享彼此的文件。
NFS 分爲服務端和客戶端。服務端提供共享的文件目錄,客戶端將該目錄掛載到本地目錄,從客戶端上看,至關因而將磁盤分區掛載到目錄,很是便利。

NFS 工做原理

 
 
NFS 工做原理如上圖所示。其中,RPC 服務是 Remote Process Call 遠程過程調用服務,它的出現主要是爲了解決 NFS 端口沒法固定的問題。因爲文件系統很是複雜,NFS 中不一樣程序對應不一樣的功能,每一個程序開啓相應的功能會隨機啓用額外的端口。可是對於客戶端來講,隨機取用的端口,客戶端沒法獲取到,因此就須要 RPC 服務做爲「中介」,NFS 服務每次啓用的端口信息,都會到 RPC 中註冊(因此啓動 NFS 服務以前要先確保 RPC 服務已經啓動了)。同時,RPC 會提供一個固定的外部端口 111 供外部機器訪問。這樣客戶端有 NFS 請求,服務端會經過 RPC 服務將 NFS 的端口信息告知客戶端,從而實現客戶端和服務端 NFS 的鏈接和數據傳輸。
 
 
NFS 的工做流程:
1. NFS 服務器端會啓動 RPC 服務(portmap),並開啓 111 端口。
2. NFS 服務器端再啓動 NFS 服務,服務啓動後向 RPC 服務註冊端口信息。
3. 客戶端啓動 RPC 服務,向服務端的 RPC 服務請求服務端的 NFS 端口信息。
4. 服務端的 RPC 服務將端口信息發給客戶端的 RPC 服務。
5. 客戶端經過獲取到的端口信息建議和服務端 NFS 的鏈接和數據的傳輸。
 
 

NFS 部署

NFS 程序

NFS 程序主要有 RPC 主程序 rpcbind 和 NFS 主程序 nfs-utils。
rpcbind: 如前所述,負責 port mapping 的工做。
nfs-utils: NFS 主程序,包含 rpc.nfsd / rpc.mount / rpc.locked / rpc.statd 等幾個 damones 。
[root@test home]# ps -ef | egrep "rpc|nfs"
root         487       2  0 Mar21 ?        00:00:00 [rpciod]
rpc        65293       1  0 Mar21 ?        00:00:00 /sbin/rpcbind -w
rpcuser    76183       1  0 Mar21 ?        00:00:00 /usr/sbin/rpc.statd --no-notify
root      152992  567813  0 18:43 pts/0    00:00:00 grep -E --color=auto rpc|nfs
root      757265       1  0 17:08 ?        00:00:00 /usr/sbin/rpc.idmapd
root      757267       1  0 17:08 ?        00:00:00 /usr/sbin/rpc.mountd
root      757272       2  0 17:08 ?        00:00:00 [nfsd4_callbacks]
root      757278       2  0 17:08 ?        00:00:00 [nfsd]
root      757279       2  0 17:08 ?        00:00:00 [nfsd]
root      757280       2  0 17:08 ?        00:00:00 [nfsd]
root      757281       2  0 17:08 ?        00:00:00 [nfsd]
root      757282       2  0 17:08 ?        00:00:00 [nfsd]
root      757283       2  0 17:08 ?        00:00:00 [nfsd]
root      757284       2  0 17:08 ?        00:00:00 [nfsd]
root      757285       2  0 17:08 ?        00:00:00 [nfsd]

 

每一個 damones 負責的功能以下:
rpc.nfsd:管理客戶端是否能使用服務端文件系統。包括判斷用戶登陸 ID 等。
rpc.mountd:管理 NFS 文件系統。當客戶端經過 rpc.nfsd 登入主機以後,rpc.mountd 經過讀取 NFS 配置文件 /etc/exports 對客戶端進行權限認證。當權限認證經過後,客戶端便可以訪問服務端文件系統。
rpc.locked:管理文件鎖定問題。當多個用戶讀寫同一份文件時可能會對文件形成一些問題,rpc.locked 即對文件進行保護,從而避免出現這樣的問題,它是可選的。
rpc.statd:管理文件一致性問題。當多個用戶同時使用文件形成文件損壞時,rpc.statd 能夠檢測而且嘗試恢復該文件。
 

NFS 配置文件

NFS 的主要配置文件是 /etc/exports 文件。它的格式是   #共享目錄 [客戶端地址1(權限)] [客戶端地址2(權限)] ...   其中,共享目錄是服務端要共享給客戶端的目錄。客戶端地址是能夠創建 NFS 鏈接的客戶端地址,能夠是 ip ,能夠是 cidr ,也能夠是主機名 (前提是在 /etc/hosts 或者經過 DNS 能夠查詢到)。權限是客戶端用戶訪問服務端文件系統所具備的權限,它包含如下幾個參數:
參數命令
參數做用
rw
可讀寫
ro
只讀權限
sync
請求或寫入數據時,數據會同步寫入到服務端硬盤,再返回
no_root_squas
對於客戶端用戶 root 不壓縮。即客戶端 root 能夠以 root 身份來訪問文件
root_squash
對客戶端用戶 root 壓縮,將 root 身份壓縮爲 nobody
all_squash
對客戶端所用用戶壓縮,默認將用戶身份壓縮爲用戶 nobody 和用戶組 nobody。
可指定壓縮用戶的身份,可是須要客戶端和服務端都有該用戶,不然沒法訪問
anonuid
匿名的 uid,說明客戶端以什麼用戶來訪問服務端文件系統
anongid
匿名的 gid,說明客戶端以什麼用戶組來訪問服務端文件系統
 
舉例:
/home/test 10.57.0.0/24(rw,sync,all_squash,anonuid=4300,anongid=4300),指 在 cidr 10.57.0.0/24 內的客戶端主機,可以以 uid/gid 4300 的用戶身份經過讀寫方式訪問服務端 /home/test 目錄。
 
NFS 還有兩個文件是 /var/lib/nfs/etab 和 /var/lib/nfs/rmtab 。 etab 文件記錄了 NFS 共享的文件目錄的完整權限設定值。 rmtab 文件記錄了共享目錄被掛載狀況。
 

NFS 命令

rpcinfo: 輸出 RPC 記錄的信息。
exportfs: 維護 NFS 文件系統表。經過 exportfs 命令可從新分享 /etc/exports 文件的目錄,該命令用在服務端。
showmount:查看 NFS server 共享的目錄資源,該命令主要用在客戶端。
 

NFS 配置實例

配置 NFS 使得 cidr 10.57.0.0/24 內的客戶端主機,可以以 uid/gid 4300 的用戶身份經過讀寫方式訪問服務端 /home/test 目錄。
 
配置步驟以下:
1. 服務端,客戶端安裝 rpcbind 和 nfs-utils。
2. 啓動 rpcbind 服務,啓動 nfs 服務。
3. 服務端配置 /etc/exports 文件:/home/test 10.57.0.0/24(rw,sync,all_squash,anonuid=4300,anongid=4300)
4. 服務端關閉 iptables。關閉 iptables 是由於 NFS 隨機開啓的端口信息並不會寫入到 iptables 中,因此須要手動寫入(關於 iptables 可看這裏),這裏暴力一點直接將 iptables 關掉。SELiunx 有開的,能夠將 SELiunx 關閉。
5. 客戶端掛載服務端共享目錄。
6. 新建文件測試是否配置是否生效。
 
1. 服務端,客戶端安裝 rpcbind 和 nfs-utils:
[root@test home]# rpm -qa | egrep "rpc|nfs"
libnfsidmap-0.25-15.el7.x86_64
rpcbind-0.2.0-38.el7.x86_64
libtirpc-0.2.4-0.8.el7.x86_64
nfs-utils-1.3.0-0.33.el7.x86_64
xmlrpc-c-1.32.5-1905.svn2451.el7.x86_64
xmlrpc-c-client-1.32.5-1905.svn2451.el7.x86_64
已經安裝好了,沒安裝的可經過 yum install rpcbind nfs-utils 命令安裝。
 
2. 啓動 rpcbind 服務,啓動 nfs 服務:
[root@test home]# systemctl start rpcbind
[root@test home]# systemctl start nfs
 
[root@test test]# rpcinfo -p localhost
   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  55860  status
    100024    1   tcp  49019  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  36125  nlockmgr
    100021    3   udp  36125  nlockmgr
    100021    4   udp  36125  nlockmgr
    100021    1   tcp  42363  nlockmgr
    100021    3   tcp  42363  nlockmgr
    100021    4   tcp  42363  nlockmgr
 
3. 服務端配置 /etc/exports 文件:
服務端:
[root@test test]# cat /etc/passwd | grep 4300
[root@test test]# cat /etc/group | grep 4300
[root@test test]# groupadd -g 4300 lianhuasheng
[root@test test]# useradd -u 4300 -g 4300 lianhuasheng
[root@test test]# cat /etc/passwd | grep lianhuasheng
lianhuasheng:x:4300:4300::/home/lianhuasheng:/bin/bash
 
[root@test home]# cat /etc/exports | grep 4300
/home/test 10.57.0.0/24(rw,sync,all_squash,anonuid=4300,anongid=4300)
 
[root@test home]# systemctl restart nfs
 
客戶端:
[root@test test]# cat /etc/passwd | grep 4300
[root@test test]# cat /etc/group | grep 4300
[root@test test]# groupadd -g 4300 lianhuasheng
[root@test test]# useradd -u 4300 -g 4300 lianhuasheng
[root@test test]# cat /etc/passwd | grep lianhuasheng
lianhuasheng:x:4300:4300::/home/lianhuasheng:/bin/bash
 
如參數一節所述,服務端和客戶端都須要配置相同的 uid 和 gid。同時,在從新寫 exports 文件後,須要重啓 nfs 服務使配置生效。
 
4. 關閉 iptables:
[root@test test]# systemctl stop iptables
 
5. 客戶端掛載服務端共享目錄:
[root@test lianhuasheng]# showmount -e 10.57.0.1
Export list for 10.57.0.1:
/home/test 10.57.0.0/24
[root@test test]# mount -t nfs 10.57.0.1:/home/test  /home/test/lianhuasheng/
[root@test home]# df -hT | grep lianhuasheng
10.57.0.1:/home/test nfs4      895G  849G   46G  95% /home/test/lianhuasheng
 
6. 新建文件測試是否配置是否生效:
客戶端:
[root@test lianhuasheng]# touch nfs.log
[root@test lianhuasheng]# ll
total 0
-rw-r--r--. 1 lianhuasheng lianhuasheng 0 Mar 22 17:10 nfs.log
 
服務端:
[root@test test]# ll -h
total 0
-rw-r--r--. 1 lianhuasheng lianhuasheng 0 Mar 22 17:10 nfs.log
 
客戶端以 root 身份建立文件 nfs.log,文件所屬用戶和用戶組被修改成 4300 對應的用戶 lianhuasheng。服務端查看該文件所屬用戶和用戶組爲 lianhuasheng。
 

NFS Troubleshooting

1. 掛載出現 error:clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
出現這種 error 是因爲客戶端沒法訪問到服務端。可經過兩種方式解決:
  • 暴力一點直接將 iptables 服務關閉。
  • 固定 NFS 端口,將端口信息寫入 iptables 中,重啓 iptables 服務。
參考鏈接見這裏:  
 
2. umount 文件時出現 error:umount:/mnt:target is busy
出現這個 error 時當前磁盤正在使用。可經過 lsof 命令 show 出使用該掛載目錄的 PID:
[root@test lianhuasheng]# lsof /home/test/lianhuasheng/
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF       NODE NAME
lsof    407987 root  cwd    DIR  0,549       21 1325440613 /home/test/lianhuasheng (10.57.0.1:/home/test)
lsof    407988 root  cwd    DIR  0,549       21 1325440613 /home/test/lianhuasheng (10.57.0.1:/home/test)
bash    682732 root  cwd    DIR  0,549       21 1325440613 /home/test/lianhuasheng (10.57.0.1:/home/test)
而後將此 PID kill 掉,從新 umount。
 
 
 (完)
相關文章
相關標籤/搜索