码迷,mamicode.com
首页 > 其他好文 > 详细

NFS文件服务器使用简介

时间:2015-07-11 06:48:54      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:rpc   nfs   文件服务器   nfs文件服务器   

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。


NFS文件服务器使用简介

标签:rpc   nfs   文件服务器   nfs文件服务器   

原文地址:http://ljbaby.blog.51cto.com/10002758/1673070

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!