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

NFS

时间:2015-05-07 01:06:13      阅读:789      评论:0      收藏:0      [点我收藏+]

标签:nfs

nfs

Network File System,工作在内核中,无法跨平台。linux和Unix之间,linux和linux之间可以像本地磁盘一样实现远程共享。nfs实现对本地文件系统的调用却被映射到来到网络上的另一个主机上来。

rpc远程过程调用函数,一部分由本地程序完成,另一部分由远程主机上的函数完成。nfs的功能就是通过rpc完成的。跟文件相关的系统调用:read(),open(),write(),close()

跟文件相关的命令比如ls,查看文件的时候,会向内核发请求。如果访问的是另外一个主机的文件系统,但由于内核中有NFS模块的存在,它能理解用户的请求,并将用户的请求通过rpc封装,请求给真正提供文件系统的那个服务器端。而服务器端必须有进程专门监听在某个套接字上,用于接收请求。所以请求通过套接字会之间发送给运行在用户空间的服务进程,代为请求本地文件系统,进而在本地系统上完成命令的管理,并将管理后的结果先发送给服务进程。然后一步步发送给客户端。

nfs的特点在于:远程服务器所发来的不是一个特定的资源请求,而是一个函数的执行调用请求。

半结构化数据:能够进行自我描述的数据,比如XML(扩展标记语言)和HTML。XML能够支持用户自定义标签,并能够让接收端通过标签来识别数据的类型。但XML比较重量级,后来又出现了JSON这么一个轻量级的半结构化数据

nfs是sun研发。NFSv1;NFSv2基于udp;NFSv3基于tcp或者udp,无状态;NFSv4.0;v4.1;v4.2,又称为pNFS,允许并行存储

服务器端有多台主机,其中一台存储元数据,其他主机存储数据。

早期的nfs会产生一些问题,比如客户端上创建文件的用户和服务器端的用户ID号不一样,那客户端创建的文件的属主和属组,在两台主机上显示都不一样。最重要的一点是,客户端的root拥有的权限和在服务器端是一样的,这是相当不安全的。因此,客户端是不允许root用户直接访问的。也可以说允许root用户访问,但是root用户会映射为nobody用户,基本上就没什么权限可言了。此种设定沿用至今。

NIS协议:网络信息系统,NIS是明文传输的,因此建议在局域网中使用,并且需要多台。NIS现今已经很少使用

NFS仅支持ip做认证,并且NFS服务进程不负责认证,负责认证的是mountd,mountd会验证客户端是否在允许访问的列表中,如果在,就会发一个令牌般的东西给客户端,客户端就拿着这个去找服务进程。

idmapd是映射,客户端用户看到的文件的属主属组都是自己,而服务器端看来属主属组是nobody

至此,服务器端就会有三个进程:服务进程nfsd,mountd和idmapd

客户端也需要进程,比如客户端在访问一个文件时,此文件会加锁,但是客户端突然断电,这个锁应该怎么处理?客户端再次上线后,又改怎么处理,这也需要进程来完成,当然,这些都是非必须的。

nfs监听在2049/TCP和UDP

RPC是一个协议,mountd也需要监听在端口上,但是它监听的端口是需要向RPC注册的。RPC随机给它一个端口。

提供RPC服务的进程名为portmapper,portmapper监听在固定的111端口上。所以客户端向服务器端发请求时,一定是先找到111端口的,因为mountd是随机端口,客户端是找不到的。portmapper就会告诉客户端mountd的端口号。因此,服务器端想要正常工作就必须保证portmapper正常工作

 

1.1 安装

[root ~]# yum install nfs-utils
[root ~]# rpm -ql nfs-utils|less
/etc/nfsmount.conf
/etc/rc.d/init.d/nfs # 此脚本就能启动下面三个关键服务
/etc/rc.d/init.d/nfslock # 安全相关
/etc/rc.d/init.d/rpcgssd # 安全相关
/etc/rc.d/init.d/rpcidmapd # idmapd
/etc/rc.d/init.d/rpcsvcgssd
/etc/request-key.d/id_resolver.conf
/etc/sysconfig/nfs
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/nfs_cache_getent
/sbin/rpc.statd
/sbin/umount.nfs
/sbin/umount.nfs4
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd # 服务器端关键服务
/usr/sbin/rpc.mountd # 服务器端关键服务
/usr/sbin/rpc.nfsd # 服务器端关键服务
/usr/sbin/rpc.svcgssd
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/sbin/sm-notify
/usr/sbin/start-statd
[root ~]# rpcinfo -p
   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  42003  status
    100024    1   tcp  39481  status


1.2 启动服务

[root ~]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas: # 这是和磁盘配额相关的                   [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]


[root ~]# rpcinfo -p
   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  42003  status
    100024    1   tcp  39481  status
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  41145  mountd # 端口号是随机的,启动好几个进程实现并发效果的
    100005    1   tcp  38507  mountd
    100005    2   udp  32861  mountd
    100005    2   tcp  56541  mountd
    100005    3   udp  55818  mountd
    100005    3   tcp  46695  mountd
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl # 实现acl功能的
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  36746  nlockmgr
    100021    3   udp  36746  nlockmgr
    100021    4   udp  36746  nlockmgr
    100021    1   tcp  53601  nlockmgr
    100021    3   tcp  53601  nlockmgr
    100021    4   tcp  53601  nlockmgr


1.3 nfs配置

nfs的配置相当的简单,只需编辑/etc/exports文件即可,此文件就是nfs的主配置文件。可以使用man exports进行查看。该文件中一行就是一个nfs文件系统,说是文件系统其实是可以使用目录的。此文件默认为空,使用下面的格式给出这个文件系统(和选项)即可:

directory (or file system)   client1(option1, option2) client2(option1, option2)

就是共享目录加客户端列表。客户端可以为域名、主机名、IP地址、网络地址等。客户端和选项之间不能有空格,并且多个客户端之间通过空格分隔。

 

直接开始修改配置文件:

[root ~]# vim /etc/exports 
/tmp    172.16.0.0/16(rw)

使用最拙劣的方法使其生效:

[root ~]# service nfs restart

使用showmount命令进行查看(可以在远程主机上查看):

[root ~]# showmount -e 172.16.45.100
Export list for 172.16.45.100:
/tmp 172.16.0.0/16

客户端挂载使用:

[root ~]# mount -t nfs 172.16.45.100:/tmp /mnt
[root ~]# cd /mnt

1.4 命令和选项

rpcinfo命令用于查询portmapper是否启动,以及其他相关信息的。

查看NFS服务器端共享的文件系统:showmount -e NFSSERVER_IP

挂载NFS文件系统:mount -t nfs SERVER:/path/to/sharedfs  /path/to/mount_point

 

/etc/exports 

文件系统 客户端(选项) 客户端(选项)

客户端可以为IP、FQDN或DOMAIN、NETWORK

 

exportfs:维护exports文件导出的文件系统表的专用工具

export -ar重新导出所有的文件系统

export -au关闭导出的所有文件系统

export -u FS关闭指定的导出的文件系统

 

客户端选项:

有几个常用的选项可以对NFS实现进行定制。这些选项包括:

secure这个选项是缺省选项,要求使用1024以下的端口进行连接。指定insecure可以禁用这个选项。

rw这个选项允许NFS客户机进行读/写访问。缺省选项是只读的。

async这个选项可以改进性能,但是如果没有完全关闭NFS守护进程就重新启动了NFS服务器,这也可能会造成数据丢失。

no_wdelay这个选项关闭写延时。如果设置async,那么NFS就会忽略这个选项。

nohide如果将一个目录挂载到另外一个目录之上,那么原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用hide选项。

no_subtree_check这个选项关闭子树检查,子树检查会执行一些不想忽略的安全性检查。缺省选项是启用子树检查。

no_auth_nlm这个选项也可以作为insecure_locks指定,它告诉NFS守护进程不要对加锁请求进行认证。如果关心安全性问题,就要避免使用这个选项。缺省选项是auth_nlm或secure_locks。

mp(mountpoint=path)通过显式地声明这个选项,NFS要求挂载所导出的目录。

fsid=num这个选项通常都在NFS故障恢复的情况中使用。如果希望实现NFS的故障恢复,请参考NFS文档。

 

用户映射

通过NFS中的用户映射,可以将伪或实际用户和组的标识赋给一个正在对NFS卷进行操作的用户。这个NFS用户具有映射所允许的用户和组的许可权限。对NFS卷使用一个通用的用户/组可以提供一定的安全性和灵活性,而不会带来很多管理负荷。

在使用NFS挂载的文件系统上的文件时,用户的访问通常都会受到限制,这就是说用户都是以匿名用户的身份来对文件进行访问的,这些用户缺省情况下对这些文件只有只读权限。这种行为对于root用户来说尤其重要。然而,实际上的确存在这种情况:希望用户以root用户或所定义的其他用户的身份访问远程文件系统上的文件。NFS允许指定访问远程文件的用户——通过用户标识号(UID)和组标识号(GID),可以禁用正常的squash行为。

 

用户映射的选项包括:

root_squash这个选项不允许root用户访问挂载上来的NFS卷。

no_root_squash这个选项允许root用户访问挂载上来的NFS卷。

all_squash这个选项对于公共访问的NFS卷来说非常有用,它会限制所有的UID和GID,只使用匿名用户。缺省设置是no_all_squash。

anonuid和anongid这两个选项将匿名UID和GID修改成特定用户和组帐号。

 

开机自动挂载nfs

/etc/fstab

SERVER:/PATH/TO/EXPORTED_FS /mount_point nfs defaults,_netdev 0 0

_netdev:说明这是个网络设备,有超时时长。避免刚刚开机挂载时,由于服务器端宕机导致挂载不上从而开不了机的BUG。

 

客户端挂载时可以使用的特殊选项:

Client

Mounting remote directories

Before mounting remote directories 2 daemons should be be started first:rpcbind,rpc.statd

 

rsize 的值是从服务器读取的字节数。wsize 是写入到服务器的字节数。默认都是1024, 如果使用比较高的值,如8192,可以提高传输速度。 

 

The timeo value is the amount of time, in tenths of a second, to wait before resending a transmission after an RPC timeout. After the first timeout, the timeout value is doubled for each retry for a maximum of 60 seconds or until a major timeout occurs. If connecting to a slow server or over a busy network, better performance can be achieved by increasing this timeout value.

The intr option allows signals to interrupt the file operation if a major timeout occurs for a hard-mounted share.

 

1.5 nfs使用的场景

论坛被DNS解析为两台web服务器,论坛用户发帖的内容被保存在关系型数据库中,而用户发表的附件由于不是结构化数据,被保存在web服务器中。这样就会造成两台web服务器的附件内容并不同步,此时就可以将附件内容保存至NFS中了。但事实上,NFS的性能并不是很好,对性能要求高的站点都不会这么使用。

 


NFS

标签:nfs

原文地址:http://10042224.blog.51cto.com/10032224/1643607

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