1. NFS概述

NFS:Network File System网络文件系统。用于unix-like操作系统之间进行文件的共享。通过NFS,客户端可以将服务器端共享出来的目录挂载到本地,就像操作本地文件一样。而NFS在启动之前需要向RPC注册,告诉RPC,相应的服务所使用的端口。NFS可以说是RPC服务的一种。NFS通常情况下启动的端口为2049端口,RPC启动的端口为111端口,而NFS如果要想提供其他的服务,则还要启动不同的端口,这些端口都是随机的,如果不向RPC注册的话,客户端将不知道服务器端打开的端口。

RPC:远程过程调用。RPC定义了一种进程间通过网络进行交互通信的机制,它允许客户端进程通过网络向远程服务进程请求服务,而不需要了解服务器底层的通信协议详细信息。NFS在启动的时候,至少要启动2个服务,一个是管理客户端能否登入主机,一个是管理客户端取得的权限问题。

rpc.nfsd:管理客户端能否登入主机。

rpc.mountd:管理NFS共享的文件系统以及客户端的权限问题。当客户端顺利的通过rpc.nfsd登入主机后,在使用服务器提供的文件之前要经过共享文件的权限认证以及在/etc/exportfs里面所定义的权限,如果通过,则允许使用nfs提供的共享文件。

rpc.lockd:这个服务需要在客户端和服务器端同时开启才有用。当多个客户端对同一文件进行读写时就有可能产生一些问题,该服务可以克服这个问题。常和rpc.statd同时使用。

rpc.statd:这个服务需要在客户端和服务器端同时开启才有用。用来检查档案的一致性。当多个客户端同时使用同一档案时可能会存在错误,该服务可以用来检测并尝试恢复该档案。

2. NFS的安装和配置

2.1 NFS的安装

所需软件包:

RPC的主程序:rpcbind

NFS的主程序:nfs-utils

安装:yum install -y rpcbind nfs-utils

[root@server1 ~]#yum install -y rpcbind nfs-utils

2.2 服务的启动停止与开机自动启动

[root@server1 ~]#/etc/init.d/nfs 
Usage: nfs{start|stop|status|restart|reload|force-reload|condrestart|try-restart|condstop}
[root@server1 ~]#
设置开机自动启动:
[root@server1 ~]#chkconfig --list | grep nfs
nfs             0:off   1:off  2:off   3:off   4:off  5:off   6:off
nfslock         0:off  1:off   2:off   3:on   4:on    5:on    6:off
[root@server1 ~]#chkconfig nfs --level 35 on
[root@server1 ~]#chkconfig --list | grep nfs
nfs             0:off   1:off  2:off   3:on    4:off  5:on    6:off
nfslock         0:off  1:off   2:off   3:on   4:on    5:on    6:off
[root@server1 ~]#

设置RPC的开机自动启动:
[root@server1 ~]# chkconfigrpcbind --level 35 on
[root@server1 ~]#

2.3 NFS的配置

NFS的配置文件为:/etc/exports

该文件的语法结构为:

1. 以#开头的表示注释

2. 大小写敏感

3. 语法格式为:

共享目录客户端1(参数1)  客户端2(参数2) ……

各个字段的含义如下:

共享目录:指定要共享的目录的实际路径。如/opt/test

客户端:指定哪些客户端可以访问共享目录。如果不指定则所有的客户端均可以访问。客户端的匹配条件如下:

指定单一主机:如192.168.1.1或者是通过FQDN的方式,如nfs.frame.com

指定网段:如192.168.1.0/255.255.255.0或192.168.1.0/24或192.168.1.*

指定域名范围:如*.frame.com,则表示客户端的DNS后缀为frame.com的都放行。

所有主机:*

参数:对满足客户端匹配条件的客户端的权限设置。常用的如下:

ro:默认选项,以只读的方式共享。

rw:以读写的方式共享。

root_squash:将客户端使用的是root用户时,则映射到NFS服务器的用户为NFS的匿名用户(nfsnobody)。

no_root_squash:将客户端使用的是root用户时,则映射到FNS服务器的用户依然为root用户。

all_squash:默认选项,将所有访问NFS服务器的客户端的用户都映射为匿名用户,不管客户端使用的是什么用户。

anonuid:设置匿名用户的UID

anongid:设置匿名用户的GID

sync:默认选项,保持数据同步,数据同步写入到内存和硬盘。

async:先将数据写入到内存,在将数据写入到硬盘。

secure:NFS客户端必须使用NFS保留端口(通常是1024以下的端口),默认选项。

insecure:允许NFS客户端不使用NFS保留端口(通常是1024以上的端口)。

示例:

设置共享目录
/ftp-directory  *.frame.com(rw,no_root_squash)
/ftp-directory *.frame.com(rw,all_squash,anonuid=501,anongid=501)
设置完成以后,需要使用/etc/init.d/nfs restart将NFS服务器重新启动或者是使用exportfs-avr使配置生效。
[root@server1 ~]#exportfs -auv
[root@server1 ~]#exportfs -arv
exporting*.frame.com:/ftp-directory
[root@server1 ~]#

2.4 NFS启动在固定端口

NFS主程序使用的端口是2049端口,为了实现不同的功能,需要启用不同的端口,而这些端口需要向RPC注册,但是在配置防火墙时,由于这些端口不是固定的,因此配置起来就比较麻烦,为了方便防火墙的配置,因此需要让NFS启动在固定的端口,配置如下:

修改配置文件:/etc/sysconfig/nfs

LOCKD_TCPPORT=3001
LOCKD_UDPPORT=3001
MOUNTD_PORT=3002
STATD_PORT=3003
STATD_OUTGOING_PORT=3004

将上述几个端口修改为相应的端口。

防火墙的设置:

iptables -A INPUT-i eth0 -p tcp -s 172.17.100.0/24 -d 172.17.100.254 -m multiport --dport111,2049,3001:3004 -j ACCEPT
iptables -A INPUT-i eth0 -p udp -s 172.17.100.0/24 -d 172.17.100.254 -m multiport --dport111,2049,3001:3004 -j ACCEPT

2.5 客户端查看服务器端的共享

客户端可以使用showmount -e查看客户端的共享目录。

格式:

showmount -e  服务的ip地址或FQDN
IP地址方式:
[root@server2 ~]# showmount-e 172.17.100.254
Export list for172.17.100.254:
/ftp-directory*.frame.com
[root@server2 ~]#
FQDN的方式:
[root@server2 ~]#showmount -e nfs.frame.com
Export list fornfs.frame.com:
/ftp-directory*.frame.com
[root@server2 ~]#

2.6 客户端挂载

格式:

mount -t nfsip|fqdn:共享目录本地目录

如:
[root@server2 ~]#mkdir /nfs-mount
[root@server2 ~]# mount -t nfsnfs.frame.com:/ftp-directory /nfs-mount/
[root@server2 ~]#df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              18G  6.3G   11G 38% /
tmpfs                 244M     0 244M   0% /dev/shm
/dev/sda1             194M   32M 153M  18% /boot
nfs.frame.com:/ftp-directory
                       20G  7.4G  11G  41% /nfs-mount
[root@server2 ~]#

2.7 自动挂载

最好不要用/etc/fstab设置开机自动挂载,有可能会由于服务的启动顺序导致挂载失败,影响开机时间。可以通过autofs自动挂载。

步骤如下:

1. 编辑/etc/auto.master文件

增加如下内容:

/-      /etc/auto.nfs
2. 新建/etc/auto.nfs文件,增加如下内容:
/mnt/nfs  -fsytpe=nfs       ip|fqdn:共享目录
如:
/mnt/nfs        -fstype=nfs             172.17.100.254:/ftp-directory
3. 重启autofs服务
/etc/init.d/autofs stop
/etc/init.d/autofs start

注意:一定要先stop,然后在start,如果直接restart的话,可能会有问题。

这样设置完以后,当我们需要使用/mnt/nfs目录时,系统就会自动的帮我们进行挂载。

3. exportfs命令参考

常用的:

exportfs -auv所有共享的目录停止共享

exportfs -arv重新共享

4. 客户端测试

autofs:
[root@server2 ~]#df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              18G  6.3G  11G  38% /
tmpfs                 244M     0 244M   0% /dev/shm
/dev/sda1             194M   32M 153M  18% /boot
[root@server2 ~]#cd /mnt/nfs
[root@server2 nfs]#df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              18G  6.3G  11G  38% /
tmpfs                 244M     0 244M   0% /dev/shm
/dev/sda1             194M   32M 153M  18% /boot
172.17.100.254:/ftp-directory
                       20G  7.4G  11G  41% /mnt/nfs
[root@server2 nfs]#
系统自动挂载……
创建文件,测试写权限:
[root@server2 nfs]#touch nfs-test
[root@server2 nfs]#ll
total 0
-rw-r--r--. 1nobody nobody 0 Mar  3  2014 nfs-test
[root@server2 nfs]#

服务器端查看该文件的拥有者和所属组:
[root@server1 ~]#cd /ftp-directory/
[root@server1ftp-directory]# ll
total 0
-rw-r--r-- 1ftpuser ftpuser 0 Mar  3 17:38 nfs-test
[root@server1ftp-directory]# cat /etc/exports 
/ftp-directory  172.17.100.0/24(rw,all_squash,anonuid=501,anongid=501)
[root@server1ftp-directory]# grep 501 /etc/passwd
ftpuser:x:501:501::/ftp-directory:/sbin/nologin
[root@server1ftp-directory]#

因为我们这里面设置的权限是将所有的用户都映射为匿名用户,而指定匿名用户的UIDheGID都为501,在服务器端,501所对应的用户为ftpuser。



转载于:https://blog.51cto.com/hezhang/1366982