NFS简介
NFS(Network File System)即网络文件系统,最初是由sun公司开发。NFS的功能就是可以通过网络实现文件的共享。客户端可以通过网络将远程的NFS服务器上的共享目录挂载至本地的文件系统中,可以直接当做一个本地的分区来进行使用。客户端和服务器端的数据传输通过RPC协议实现。
RPC调用原理
NFS服务器的RPC服务
NFS支持的功能非常多,不同的功能会有不同的服务来完成,很多服务都需要监听在一些端口,其中的很多端口并不是固定的。这些服务在启动时,都需要想rpcbind服务注册一个端口,rpcbind服务随机选取一个未被使用的端口予以分配。rpcbind服务监听在111端口。所以rpcbind的主要功能就是指定每个RPC service对应的port number,并且通知给客户端,让客户端连接到正确的端口上去。
客户端向NFS服务器端请求的步骤:
1、客户端向服务器端的rpcbind(111端口)发出访问请求(rpc call)
2、服务器端的rpcbind找到对应服务(rpc service)已注册的端口后,通知给客户端。
3、客户端收到端口后,相对应的服务发起请求。
由于rpc service在启动时需要向rpcbind注册端口,所以rpcbind要先启动。另外若rpcbind重新启动,原来注册的数据也会不见,因此一但rpcbind重新启动,让所管理的服务因为需要重新启动以重新向rpcbind注册。
常见的服务器端有如下的服务进程:
rpcbind #监听在111号端口
rpc.rquotad #管理共享目录的磁盘配额
rpc.nfsd #最主要的NFS服务提供程序,用于接受客户端发起的rpc请求。
rpc.mounted #挂载守护进程,等待客户端的挂载请求,并完成来源认证
rpc.idmapd #共享文件的文件名映射服务
rpc.statd #用来检查文件的一致性,与rpc.lock有关。
rpc.lock #用于管理文件的锁定方面
以下实验环境:
NFS服务器:192.168.1.104
客户端:192.168.1.113
NFS服务器端配置
服务器端需要安装两个软件包:rpcbind,nfs-utils。默认这两个软件包都是装上的。
[root@www localData]# rpm -qa rpcbind nfs-utils nfs-utils-1.2.3-39.el6.x86_64 rpcbind-0.2.0-11.el6.x86_64
/etc/rc.d/init.d/nfs #NFS服务脚本
/etc/sysconfig/nfs #NFS的主配置文件
/etc/exports #配置共享目录的而文件
/etc/exports的配置格式:
directory (or file system) client1(option1, option2) client2(option1, option2)
/etc/exports中的主机名( client)的设置有以下两种方式:
1、完整的IP地址或者网络号,例如:192.168.1.10或192.168.1.0/24或192.168.1.0/255.255.255.0。
2、主机名,如果是主机名可以支持通配符,例如“*”或“?”。
几个常用的选项(option)可以对 NFS 实现进行定制,这些选项包括:
secure: #使用了 1024 以下的 TCP/IP 端口实现 NFS 的连接。指定 insecure 可以禁用这个选项。默认为secure。
rw: #这个选项允许 NFS 客户机进行读/写访问。缺省选项是只读的。
ro: #只读权限
async: #异步写入数据,这个选项可以改进性能,但是如果没有完全关闭 NFS 守护进程就重新启动
#了 NFS服务器,这也可能会造成数据丢失。(默认选项)
sync: #同步写入数据。
no_wdelay: #关闭写延时。如果设置了 async,那么 NFS 就会忽略这个选项。
wdelay: #开启写延时。
nohide: # 共享NFS目录的子目录
hide: #在NFS共享目录中不共享其子目录
no_subtree_check: #关闭子树检查,子树检查会执行一些不想忽略的安全性检查。缺省选项是启用子树检查。
no_auth_nlm: #这个选项也可以作为 insecure_locks 指定,它告诉 NFS 守护进程不要对加锁请求进行认证。
#如果关心安全性问题,就要避免使用这个选项。缺省选项是 auth_nlm 或 secure_locks。
mp (mountpoint=path): #通过显式地声明这个选项,NFS 要求挂载所导出的目录。
fsid=num: #这个选项通常都在 NFS 故障恢复的情况中使用。如果希望实现 NFS 的故障恢复,请
#参考 NFS 文档。
no_acl: #关闭nfs支持acl功能
用户映射的选项包括:
root_squash: #不允许 root 用户访问挂载上来的 NFS 卷。(默认开启)
no_root_squash: #允许 root 用户访问挂载上来的 NFS 卷。
all_squash: #这个选项对于公共访问的 NFS 卷来说非常有用,它会限制所有的 UID 和 GID,只使用匿名
#用户。缺省设置是 no_all_squash。
anonuid 和 anongid: #这两个选项将匿名 UID 和 GID 修改成特定用户和组帐号。
可通过man exports查看详细信息。
配置/etc/exports文件,然后启动服务。
[root@www localData]# vim /etc/exports /tmp 192.168.1.0/24(rw,no_root_squash) /data/ftpData 192.168.1.0/24(rw) /data/localData 192.168.1.0/24(rw,all_squash,anonuid=1001,anongid=1001) ...... [root@www localData]# service rpcbind start #先启动rpcbind服务 Starting rpcbind: [ OK ] [root@www localData]# service nfslock start #会启动rpc.statd服务 Starting NFS statd: [ OK ] [root@www localData]# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ]
rpcinfo命令:报告rpc的相关信息,包括rpc服务监听的端口以及各向rpc注册使用其端口的半随机服务所使用的套接字
[root@www localData]# rpcinfo -p #默认ip为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 33265 status 100024 1 tcp 55602 status 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad ......... .........
客户端配置
客户端需要启动两个服务rpcbind,rpc.statd。rpc.statd服务来自nfs-utils软件包。
启动服务:
[root@CentOS6 nfs]# service rpcbind start Starting rpcbind: [ OK ] [root@CentOS6 nfs]# service nfslock start Starting NFS statd: [ OK ]
通过showmount查看NFS服务器端共享的文件系统:
[root@CentOS6 nfs]# showmount -e 192.168.1.104 #-e选项查看某台主机共享的目录 Export list for 192.168.1.104: /data/localData 192.168.1.0/24 /data/ftpData 192.168.1.0/24 /tmp 192.168.1.0/24
若服务器端对/etc/exports文件进行了修改,可以通过exportfs命令重新加载服务而不需要重启服务。若重启服务需要重新向prcbind注册,而且对客户端的影响也很大,所以尽量使用exportfs命令来使配置文件生效。
exportfs:
exportfs -ar: #重新导出所有的文件系统
exportfs -r: #导出某个文件系统
exportfs -au: #关闭导出的所有文件系统
exportfs -u: #关闭指定的导出的文件系统
手动挂载NFS共享目录
[root@CentOS6 nfs]# showmount -e 192.168.1.104 Export list for 192.168.1.104: /data/localData 192.168.1.0/24 /data/ftpData 192.168.1.0/24 /tmp 192.168.1.0/24 [root@CentOS6 nfs]# mount -t nfs 192.168.1.104:/data/localData /home/nfs/localData/ [root@CentOS6 nfs]# mount -t nfs 192.168.1.104:/data/ftpData /home/nfs/ftpData/ [root@CentOS6 nfs]# mount -t nfs 192.168.1.104:/tmp /home/nfs/tmp/
开机自动挂载
编辑/etc/fstab文件,添加如下行:
192.168.1.104:/data/localData /home/nfs/localData nfs defaults,_netdev 0 0
_netdev明确说明这是网络文件系统,在挂载时有超时时长,一但超过,就跳过不挂载。如果不加这项,挂载不上时,系统将无法启动。当然也可以将挂载的语句添加到/etc/rc.d/rc.local脚本中,这样就可以避免无法启动的问题,建议使用这种方法。
客户端挂载参数:
rsize= #接收缓冲的大小(读出的区块大小,默认1024)
wsize= #发送缓冲(写入的区块大小,默认1024),这两个值调大,可以提升NFS文件系统的传输能力。
proto= #基于哪种协议
timeo= #超时时长,单位是1/10秒
addr #远程服务器地址
fg/bg #挂载行为是在前台(fg)还是后台执行(bg),默认fg
sort/hard #若果是hard,两者之间的任意一台主机脱机,则RPC会持续呼叫,直到恢复连接。若是soft,RPC
#会在timeout后重复呼叫,默认hard
NFS文件访问权限
1、客户端用id=N的用户访问服务器端,服务器端也有ip=N的用户
在服务器端创建id=1000的用户redhat,在客户端创建id=1000的用户gentoo。
在客户端访问已挂载的/data/ftpData(共享目录)
服务器端相关配置:
[root@www data]# cat /etc/exports /tmp 192.168.1.0/24(rw,no_root_squash) /data/ftpData 192.168.1.0/24(rw) /data/localData 192.168.1.0/24(rw,all_squash,anonuid=1001,anongid=1001) [root@www data]# setfacl -m u:redhat:rwx /data/ftpData
客户端:
[root@CentOS6 nfs]# mount -t nfs 192.168.1.104:/data/ftpData /home/nfs/ftpData/ [root@CentOS6 ftpData]# su - gentoo [gentoo@CentOS6 ~]$ cd /home/nfs/ftpData/ [gentoo@CentOS6 ftpData]$ touch abc [gentoo@CentOS6 ftpData]$ ls abc passwd [gentoo@CentOS6 ftpData]$ ll total 4 -rw-rw-r--. 1 nobody nobody 0 Jul 10 2015 abc -rw-r--r--. 1 nobody nobody 590 Jul 9 21:45 passwd
服务器端:
可以看到当服务器端与客户端用相同id号的用户时,只要exports文件中指定的参数是读写,那么客户端这个用户的权限与服务器端相同id号的用户权限相同,而且创建的文件的用户名与服务器端的用户名相同。
2、客户端用一个服务器端不存在的用户访问服务器端
在上一个例子的基础上(同样访问/data/ftpData,读写权限)
服务器端:
[root@www data]# chmod 777 /data/ftpData/ #让所有用户能读写
客户端:
[root@CentOS6 ftpData]# useradd -u 1002 hello #服务器端不存在这个用户 [root@CentOS6 ftpData]# su - hello [hello@CentOS6 ~]$ cd /home/nfs/ftpData/ [hello@CentOS6 ftpData]$ touch CDE
服务器端查看文件属性:
文件的属主和属组是id号1002。这个不存在的用户对该目录的权限取决于服务器端该目录的属性。
3、客户端访问用户被映射成服务器上的某个用户
[root@www data]# cat /etc/exports ...... /data/localData 192.168.1.0/24(rw,all_squash,anonuid=1001,anongid=1001)
例如在客户端访问/data/localData挂载的目录,则客户端的权限将被映射成服务器端id=1001的系统用户。
4、用root用户访问
默认情况下root_squash这一项开启,root用户访问时会被映射成一个权限很小的服务器端用户,几乎没有什么权限,若设置了no_root_squash这一项,root用户访问时,对该目录有系统管理员的权限。一般为了安全,使用root_squash。
原文地址:http://ljbaby.blog.51cto.com/10002758/1673070