NFS文件系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFS文件系统相关的知识,希望对你有一定的参考价值。

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文件系统的主要内容,如果未能解决你的问题,请参考以下文章

NFS

java保存nfs

NFS文件系统

NFS网络文件系统配置

NFS网络文件系统的搭建

NFS (网络文件系统)