1. 程式人生 > >NFS文件系統

NFS文件系統

pre mil 出現 for unable onu idt containe route

NFS文件系統

新建linux運維,常用命令目錄

  • NFS文件系統
    • 1. 文件系統概述
      • 1.1 文件系統介紹
      • 1.2 文件系統選型
        • 1.2.1 SAS/SATA硬盤文件系統選型:
        • 1.2.2 常規應用:
      • 1.2. NFS的介紹
        • 1.21 NFS 是 Network File System 的縮寫。
        • 1.22 NFS應用場景:
    • 2. NFS服務
      • 2.1 NFS在傳輸數據時使用的端口的選擇
      • 2.2 NFS掛載原理:
    • 3. 實例
      • 3.1 安裝軟件包
      • 3.2 啟動服務
        • 3.2.1 啟動rpc服務
        • 3.2.2 啟動NFS服務
      • 3.2.3 把nfs和rpc服務設置為開機啟動
      • 3.2.4 修改配置文件exports
      • 3.2.5 在服務端確認已經共享了
        • a 在客戶端開啟rpc服務
        • b 在客戶端上確認是否能看到共享目錄:
          • b1. rpc服務沒開啟。
          • b2. 網絡不通
          • b3. 防火墻阻止
          • b4. 再從客戶端確認是否可以認到共享目錄了:
        • c. 在客戶端掛載共享目錄
        • d. 在客戶端上確認下是否讀寫不正常
          • d1. 權限阻止
          • d2. 查看屬主和屬組
          • d3. 把掛載出去的目錄權限設置為nfs的

NFS文件系統

1. 文件系統概述

1.1 文件系統介紹

文件系統是對一個存儲設備上的數據和元數據進行組織的一種機制,文件系統是在一個磁盤或者分區組織文件的方式和方法,目的是易於查詢和存取數據,文件系統是基於存儲設備,也可以說是基於虛擬數據或網絡存儲的方法,比如NFS,MFS,GFS。
linux下的常見文件系統,ext2,ext3,ext4,zfs,xfs,reiserfs
windows常見文件系統,NTFS,FAT32
分區必須格式化創建文件系統才能存放數據,不同分區只能有一種文件系統

1.2 文件系統選型

1.2.1 SAS/SATA硬盤文件系統選型:

a. reiserfs 大量小文件業務首選的文件系統
b. xfs 數據庫Mysql業務,門戶案例
c . ext4 視頻下載,流媒體,數據庫,小文件業務
d . ext2 藍汛的cache業務,CDN網站加速服務(沒有日誌功能,但是快 )

1.2.2 常規應用:

對於centos5.x系列常規應用選擇ext3文件系統
對於centos6.x系列常規應用選擇ext4文件系統

1.2. NFS的介紹

1.21 NFS 是 Network File System 的縮寫。

主要功能是通過網絡讓不同的主機系統之間可以彼此共享文件或目錄。
NFS客戶端可以通過掛載的方式將NFS服務器端共享的數據文件目錄掛載到NFS客戶端
本地系統中。從NFS客戶端的機器上看就像自己機器上的磁盤分區一樣,實際上卻是遠
端的服務器目錄。NFS網絡系統的使用很像windows系統的網絡共享,網絡驅動器映射,
和linux的samba類似。

1.22 NFS應用場景:

在企業集群架構的工作場景中,NFS網絡文件系統一般被用來存儲共享視頻,圖片,附件,註意程序不要放在NFS裏
NFS是當前互聯網系統架構中最常見的數據存儲服務之一,特別是中小型網站公司使用頻率很高。
大公司和門戶網站除了使用NFS還會使用MFS,GFS,FASTFS,TFS等分布式系統。
技術分享

a. 如圖:數據進來先到負載均衡器,負載均衡器先做處理,負載均很器根據自己的算法把數據導給A主機做數據處理,
b. 如果沒有後面的共享存儲設備,那麽如果有請求進來,負載均很器把該請求分給B主機做處理,該請求需要涉及到上一個
c. 已經被A主機處理的數據,那麽B主機顯然不存在這一數據,於是只能反饋沒結果,或者從A主機發過來給B主機,這樣做的話很費力.
d. 但是如果有後面的共享存儲設備的話就不會出現這種情況了,A主機處理完數據後把結果 保存到後面的共享存儲設備裏, B主機處理完了也一樣,當B主機需要找從A主機處理的數據時只需要在後面的共享存儲設備裏找,就像自己存在裏面的數據一樣。

2. NFS服務

2.1 NFS在傳輸數據時使用的端口的選擇

其實NFS支持功能很多,不同功能使用不同的程序來啟動,每個功能都會啟用一些端口,所以NFS功能所對應的端口無法固定,NFS是通過RPC(遠程過程調用)協議/服務來實現的,這個服務應用在門戶級別的網站很多,RPC服務最主要的功能就是記錄每個 NFS功能所對應的端口號,並且在NFS客戶端請求時候將該端口和功能對應的信息傳遞請求 給數據的NFS客戶端,從而可以確保客戶端可以連接到正確的NFS端口上去,達到實現數據傳輸交互數據的目的,類似NFS服務端和客戶端的中介一樣。

2.2 NFS掛載原理:

NFS 掛載方法:mount -t 192.168.115.1:/video /mnt

2.2.1. 先啟動RPC服務(C5:portmap,c6:rpcbind)
2.2.2. 啟動nfs服務
2.2.3 客戶向RPC請求NFS服務
2.2.4 RPC返回端口給客戶端
2.2.5 客戶端拿著地址端口向NFS服務器請求傳輸數據

3. 實例

3.1 安裝軟件包

yum install nfs-utils rpcbind -y
或者yum groupinstall “NFS file server” -y

3.2 啟動服務

3.2.1 啟動rpc服務

[[email protected] ~]# /etc/init.d/rpcbind start
[[email protected] ~]# /etc/init.d/rpcbind status
rpcbind (pid  1753) is running...
[[email protected] ~]# rpcinfo -p maiyat
  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  39331  status
   100024    1   tcp  37270  status
   如果出現
   rpcinfo: can‘t contact portmapper: RPC: Remote system error - Connection refused
   則說明rpcf服務沒開啟需要開啟

3.2.2 啟動NFS服務

 /etc/init.d/nfs start
 若出現
 [[email protected] ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno = Connection refused
rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).
                                                           [FAILED]
Starting NFS mountd:                                       [FAILED]
Stopping RPC idmapd:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd
                                                           [FAILED]
則沒有啟動rpc服務
[[email protected] ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[[email protected] ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Stopping RPC idmapd:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
[[email protected] ~]# rpcinfo -p maiyat
   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
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  46209  mountd
    100005    1   tcp  54685  mountd
    100005    2   udp  37054  mountd
    100005    2   tcp  47801  mountd
    100005    3   udp  51111  mountd
    100005    3   tcp  34610  mountd
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  34005  nlockmgr
    100021    3   udp  34005  nlockmgr
    100021    4   udp  34005  nlockmgr
    100021    1   tcp  59015  nlockmgr
    100021    3   tcp  59015  nlockmgr
    100021    4   tcp  59015  nlockmgr

3.2.3 把nfs和rpc服務設置為開機啟動

[[email protected] ~]# chkconfig --list |grep nfs
nfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
nfslock         0:off   1:off   2:off   3:on    4:on    5:on    6:off
[[email protected] ~]# chkconfig --list |grep rpcbind
rpcbind         0:off   1:off   2:on    3:on    4:on    5:on    6:off

3.2.4 修改配置文件exports

在服務端的/etc/exports文件中添加入下:
echo "/home/data 192.168.50.0/24(rw,sync)" >>/etc/exports
在服務端確認

[[email protected] sbin]# cat /etc/exports
#share /data for maiyatbbs by maiyat
/home/data      192.168.50.0/24(rw,sync)
[[email protected] sbin]# 

3.2.5 在服務端確認已經共享了

[[email protected] sbin]# showmount -e 192.168.50.5
Export list for 192.168.50.5:
/home/data 192.168.50.0/24

服務端如果出現這個,說明服務已經正常開啟了,這時候需要到客戶端去查看有沒有看到這個共享目錄,首先也是要開啟rpc服務,因為如上所說流程,主機先要開啟rpc,然後rpc通過TCP/IP協議去與遠程主機溝通相應開啟rpc的主機,這樣可以註冊端口,才可以在客戶端來掛載

a 在客戶端開啟rpc服務

[[email protected] sbin]# /etc/init.d/rpcbind status
[[email protected] sbin]# /etc/init.d/rpcbind status
rpcbind (pid  1740) is running...

b 在客戶端上確認是否能看到共享目錄:

[[email protected] sbin]# showmount -e 192.168.50.5
Export list for 192.168.50.5:
/home/data 192.168.50.0/24

如果可以正常看到說明正常,但是如果出現如下提示可能需要從幾方面考慮下;

[[email protected] sbin]# showmount -e 192.168.50.5
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
b1. rpc服務沒開啟。

是否客戶端機器rpc服務沒正常開啟,因為報錯顯示rpc,而且是port mapper failure:

[[email protected] sbin]# /etc/init.d/rpcbind status
rpcbind (pid  2383) is running...
b2. 網絡不通

是否本機網絡不通,是否與服務端網絡不通

[[email protected] sbin]# ping 192.168.50.5
PING 192.168.50.5 (192.168.50.5) 56(84) bytes of data.
64 bytes from 192.168.50.5: icmp_seq=1 ttl=64 time=1.96 ms
b3. 防火墻阻止
因為rpc服務已開啟,網絡也是通的,報錯日誌還有顯示不能收到,說明可能發出去了,但是沒有收到回復的,而服務端是正常的,rpc正常註冊了,也能看到共享目錄,是不是客戶端發過來的流量被服務端阻止了,導致服務端沒收到客戶端的rpc請求
[[email protected] sbin]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

[[email protected] sbin]# /etc/init.d/iptables stop
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[[email protected] sbin]# cat /etc/exports
b4. 再從客戶端確認是否可以認到共享目錄了:
[[email protected] sbin]# showmount -e 192.168.50.5
Export list for 192.168.50.5:
/home/data 192.168.50.0/24

c. 在客戶端掛載共享目錄

[[email protected] sbin]# mount -t nfs 192.168.50.5:/home/data /date
[[email protected] sbin]# df -hk |grep /data
192.168.50.5:/home/data
                       7178624   3408512   3408256  51% /data

d. 在客戶端上確認下是否讀寫不正常

[[email protected] data]# mkdir a
mkdir: cannot create directory `a‘: Permission denied
[[email protected] data]# 
d1. 權限阻止

因為登錄的是root用戶,所以這個問題不在於客戶端,而是服務端,客戶端寫的這個目錄本身就是屬於服務端的,是被nfs共享出來的,考慮到linux每個服務都有一個用戶,很多用戶都事沒有shell,都不需要登錄的,nfs肯定也有,查詢下nfs的配置文件

[[email protected] nfs]# pwd
/var/lib/nfs
[[email protected] nfs]# ls
etab  export-lock  rmtab  rpc_pipefs  statd  state  v4recovery  xtab
[[email protected] nfs]# ll etab
-rw-r--r--. 1 root root 154 Jul 27 11:03 etab
[[email protected] nfs]# cat etab
/home/data      192.168.50.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
[[email protected] nfs]# 

可以看到,這個掛載的文件的屬主和屬組分別為65534,65534

d2. 查看屬主和屬組

我們先查看屬主和屬組,然後確認我們掛載的那個目錄權限是不是這個。

[[email protected] nfs]# grep "65534" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[[email protected] nfs]# grep "65534" /etc/group
nfsnobody:x:65534:
[[email protected] nfs]# ls -ld /home/data
drwxr-xr-x. 2 root root 4096 Jul 27 01:01 /home/data
[[email protected] nfs]# 
d3. 把掛載出去的目錄權限設置為nfs的

從上述中可以清晰的看到,/home/data目錄不屬於nfs 的,客戶端又是通過nfs來控制讀寫的,想象一下,nfs沒有讀取這個目錄的權限,而你又要通過nfs來讀寫,那肯定是權限阻止了,所以問題得到解決

[[email protected] nfs]# chown 65534:65534 /home/data
[[email protected] nfs]# ls -ld /home/data
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Jul 27 01:01 /home/data

從客戶端確認

[[email protected] data]# mkdir a
[[email protected] data]# ls -l
total 4
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Jul 27 11:27 a
-rw-r--r--. 1 nfsnobody nfsnobody    0 Jul 27 11:01 aaa
[[email protected] data]# 

用root創建的文件屬主和屬組都是nfs的,可以反映出剛剛的結論,是通過nfs在服務端的共享目錄裏寫數據,所以屬主和屬組都是nfs用戶的

NFS文件系統