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的安装和配置
1、安装:
RPC的主程序:rpcbind
NFS的主程序:nfs-utils
yum install -y rpcbind nfs-utils
2、服务的启动停止与开机自动启动
service nfs start
设置开机自动启动:
[root@www ~]#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@www ~]#chkconfig nfs --level 35 on //在等级3和等级5默认开启 [root@www ~]#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
设置RPC的开机自动启动:
chkconfigrpcbind --level 35 on
3、NFS的配置
NFS的配置文件为:/etc/exports
配置文件参数:对满足客户端匹配条件的客户端的权限设置。常用的如下:
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以上的端口)。
示例:
设置共享目录
/data 172.16.0.0/16(rw,sync,no_root_squash) //把“/data”共享给172.16.0.0/16网段(可读可写,同步)。
设置完成以后,需要使用service nfs restart将NFS服务器重新启动或者是使用exportfs-avr使配置生效。
exportfs -auv //所有共享的目录停止共享 exportfs -arv //重新共享
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.16.0.0/16 -d 172.16.12.1 -m multiport --dport 111,2049,3001,3004 -j ACCEPT iptables -A INPUT-i eth0 -p udp -s 172.16.0.0/16 -d 172.16.12.1 -m multiport --dport 111,2049,3001,3004 -j ACCEPT
5、客户端查看服务器端的共享
客户端可以使用showmount -e查看客户端的共享目录。
showmount -e //服务的ip地址或FQDN
showmount -e 172.16.12.1
6、客户端挂载
格式:
在客户端172.16.251.100上执行:
mkdir /tmp/nfs-test mount -t nfs 172.16.12.1:/data /tmp/nfs-test/
7、自动挂载
最好不要用/etc/fstab设置开机自动挂载,有可能会由于服务的启动顺序导致挂载失败,影响开机时间。可以通过autofs自动挂载。
步骤如下:
1. 编辑/etc/auto.master文件
增加如下内容:
/- /etc/auto.nfs
2. 新建/etc/auto.nfs文件,增加如下内容:
/tmp/nfs-test -fstype=nfs 172.16.12.1:/data
3. 重启autofs服务
/etc/init.d/autofs stop /etc/init.d/autofs start
注意:一定要先stop,然后在start,如果直接restart的话,可能会有问题。
这样设置完以后,当我们需要使用/tmp/nfs-test目录时,系统就会自动的帮我们进行挂载。
8、实战测试
示例:仅允许172.16.0.0/16网段的主机访问,且UID为1000的用户testuser可以读写访问;
服务器上:
[root@www data]# cat /etc/exports /data 172.16.0.0/16(rw,sync,anonuid=1000,no_root_squash) [root@www data]# useradd testuser [root@www data]# setfcl -m u:testuser:rwx /data
客户端:
[root@station100 ~]# useradd -u 1000 test [root@station100 ~]# su - test [root@station100 ~]# useradd -u 1000 test [root@station100 ~]# su - test [test@station100 ~]$ cd /tmp/nfs-test/ [test@station100 nfs-test]$ ll total 0 [test@station100 nfs-test]$ touch hello [test@station100 nfs-test]$ ll total 0 -rw-rw-r-- 1 nobody nobody 0 Apr 2 17:30 hello [test@station100 nfs-test]$
服务器端: