最新消息:

NFS

运维专栏 lu 150浏览

NFS初探


  • NFS概述

  • NFS工作流程

  • NFS Server端设置

  • NFS工具与命令

  • NFS配置实例


NFS概述

NFS是什么?

NFS,network file system(网络文件系统)的缩写,是一种实现文件共享的实现方式。

NFS的功能是什么

NFS基于RPC协议,实现远程系统调用,共享文件资源。

NFS工作流程

nfs

RPC,Remote Procedure Call Protocol,远程过程调用协议,是实现本地调用远程主机实现系统调用的协议。
portmapper:负责分配RPC服务器的端口,并在客户端请求时,负责响应目的RPC服务器端口返回给客户端,工作在tcp与udp的111端口上。
mountd:是nfs服务的认证服务的守护进程,客户端在收到返回的真正端口时,就会去连接mountd,认证取得令牌。
nfsd:nfs的守护进程,负责接收到用户的调用请求后与内核发出请求并得到调用结果响应给用户。
idmapd:是NFS的一个程序,用来负责远程客户端创建文件后的权限问题。

nfs Server:
    nfsd:NFS的守护进程,工作在tcp与udp的2049端口上。
    mountd:NFS用来验证客户端信息的守护进程,工作在随机端口。
    rquotad:磁盘限额进程。
    lockd:文件锁。
    idmapd:权限映射。

NFS Server端

所需安装包

rpcbind:提供rpc服务(mapping)
nfs-utils:提供nfs,mountd与其他相关程序。

NFS服务器端配置

相关文件:
    /etc/exports:nfs的主要设定文件。
    /var/lib/nfs/*tab:设定记录文件。
        etab:共享目录的完整权限设定。
        xtab:曾经连接的客户端资料。
    /usr/sbin/exportfs:NFS分享资源命令,可以用来重新获取共享文件设定,挂载,卸载等。
    /usr/sbin/showmount:用来查看远程主机的共享信息。

exports文档设定格式

/PATH/TO/NFS_DIR    CLITNES_IP1(OPTION1,OPTION2...)        CLITNES_IP2(OPTION1,OPTION2...)    ...

例如:     /tmp/nfs    192.168.1.1(rw,root_squash,anonuid=50,anongid=50) 192.168.1.2(ro) 
            指定了共享文件夹为/tmp/nfs,192.168.1.1有读写权限,禁止root用户登录,使用的账户身份为uid/gid为50的账号。
            192.168.1.2只有ro权限,并使用默认身份,nobady。

常用的OPTION:
        rw / ro                                读写/只读
        sync / async                        同步传输/异步传输
        root_squash / no_root-squash        压缩root用户权限/不压缩root用户权限
        all_squash                            所有用户都压缩权限。
        anonuid=# / anongid=#                指定使用的用户或组

权限相关:

当远程用户访问共享文件夹时是使用什么权限呢?如果创建文件那么属主和属组又是什么呢?  
nfs默认是使用你本地主机当前用户UID与GID相对应的身份来使用,如果远程服务端没有此用户或组就会以数字的形式呈现。  

如果是root用户,那么在远程主机上肯定就是使用root了,因为root默认的uid gid都是0!
这样就太危险了,所以如果使用了root访问,NFS会自动压缩权限为最小权限nfsnobady。

当本地用户使用不一样的名字,UID却是相同的创建文件,会通过idmapd这个进程来映射,所以你在远程看到的还会是你原来的name。

当你将权限都设定完成后记得去更改服务器端文件夹的权限,推荐使用acl来设定,因为你的权限其实为 "用户权限与文件夹权限的交集"。

NFS工具与命令

showmount:查看服务器端共享文件夹状态的。

showmount [-ae] [hostname|ip]
            -a:显示目前服务端与用户端的NFS连线状态。
            -e:显示目标服务器端exports所分享的目录资料。

expartfs:重新读取expart配置,无需重启服务。

expartfs [-aruv] 
            -a:全部读取或者取消/etc/export配置。
            -r:重新读取export并更新/etc/exports /var/libnfs/xtab
            -u:卸载目录。
            -v:显示重读或卸载详细信息到屏幕

NFS配置实例:

配置:

host1(192.168.1.1):
[root@host1 nfs]# service nfs start                启动nfs服务。
Starting NFS services:                                     [  OK  ]            启动exportfs    
Starting NFS quotas:                                       [  OK  ]            启动quotas
Starting NFS mountd:                                       [  OK  ]            启动mountd
Starting NFS daemon:                                       [  OK  ]            启动nfsd
Starting RPC idmapd:                                       [  OK  ]            启动idmapd
[root@host1 ~]# echo '/tmp/nfs  192.168.1.2(rw,no_root_squash)' >> /etc/exports     写入配置,不使用root权限压缩。
[root@host1 ~]# mkdir -pv /tmp/nfs            创建共享文件夹。
[root@host1 ~]# exportfs -arv                读入配置。
exporting 192.168.1.2:/tmp/nfs                

host2(192.168.1.2):
[root@host2 ~]# showmount -e 192.168.1.1        查看192.168.1.1的export信息。
Export list for 192.168.1.1:                
/tmp/nfs 192.168.1.2                     192.168.1.1的内容。
[root@host2 ~]# mount -t nfs 192.168.1.1:/tmp/nfs /tmp      挂载共享文件夹。

测试:

[root@host2 tmp]# touch test        root身份创建test
[root@host2 tmp]# ll
total 0
-rw-r--r--. 1 root root    0 Apr 25  2016 test        可以看到user group为root

[root@host1 nfs]# ll
total 0
-rw-r--r--. 1 root root 0 Apr 25 19:32 test            服务端查看也为root

[root@host1 tmp]# echo '/tmp/nfs  192.168.1.2(rw,root_squash)' > /etc/exports         覆盖写入配置,使用root权限压缩。
[root@host1 tmp]# exportfs -ar    读入配置
[root@host1 tmp]# setfacl -m u:nfsnobody:rwx nfs/        设置nfs/的权限,添加acl

[root@host2 tmp]# touch test2        客户端创建文件test2
[root@host2 tmp]# ll
total 0
-rw-r--r--. 1 root root    0 Apr 25  2016 test
-rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 25 19:45 test2        可以看到user group为nfsnobody的默认属主属组。

[root@host1 ~]# echo '/tmp/nfs  192.168.1.2(rw,root_squash,anonuid=500)' > /etc/exports  覆盖写入配置,指定登陆uid。
[root@host1 ~]# setfacl -m u:xiao:rwx /tmp/nfs/  设置权限,添加acl
[root@host1 ~]# exportfs -ar        读入配置。

[xiao@host2 tmp]$ touch test3    客户端使用对应UID用户创建文件。
[xiao@host2 tmp]$ ll
total 0
-rw-r--r--. 1 root root    0 Apr 25  2016 test
-rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 25 19:45 test2
-rw-rw-r--. 1 xiao      xiao      0 Apr 25  2016 test3        user group 为 xiao

转载请注明:鲁金杰博客 » NFS

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址