nfs是Network File System的缩写,即网络文件系统,是一种分布式文件系统协议,最初由Sun Microsystems公司开发。nfs允许一个系统在网络上与它人共享目录和文件,通过使用nfs,用户和程序可以象访问本地文件一样访问远端系统上的文件

注意:NFS一般是用于文件冷备份,即非用于线上实时备份的机制,如果需要线上文件多副本备份建议采用分布式文件存储组件,如FastDFS,ceph等

nfs安装

  1. 检查系统是否开启nfs服务
service nfs status
  1. 安装nfs
yum install -y nfs-utils
  1. 启动nfs服务
  • 启动rpcbind服务
service rpcbind start
  • 启动nfs服务
service nfs start
  • 查看nfs启动时监听端口
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    35846  status
    100024    1      tcp    38875  status
  1. 配置nfs开机启动
chkconfig nfs --level 345 on
chkconfig rpcbind --level 345 on
  1. 开始挂载

参考:http://www.cnblogs.com/rootq/articles/1310888.html 修改nfs服务器配置文件/etc/exports 格式示例(表示挂载NFS服务器的/dat和/bkpdisk目录,允许192.168.1.101访问且具有读写权限):

/dat 192.168.1.0/24(rw,sync,no_root_squash)
/bkpdisk 192.168.1.0/24(rw,sync,no_root_squash)
  • exports文件中一些选项的含义 :
指令 描述
ro 该主机对该共享目录有只读权限
rw 该主机对该共享目录有读写权限
root_squash 如果登录NFS主机使用共享目录的使用者是root,那么对于这个共享的目录来说,它具有root的权限,极不安全,不建议使用!
no_root_squash 当登录NFS主机使用共享目录的使用者是root时,其权限将被转换成为匿名使用者,通常它的UID与GID都会变成nobody身份
all_squash 客户机上的任何用户访问该共享目录时都映射成匿名用户
anonuid 将客户机上的用户映射成指定的本地用户ID的用户
anongid 将客户机上的用户映射成属于指定的本地用户组ID
sync 资料同步写入到内存与硬盘中
async 资料会先暂存于内存中,而非直接写入硬盘
insecure 允许从这台机器过来的非授权访问
  • 启动nfs后又修改了/etc/exports,不用重启该服务,使用exports命令即可:

    全部重新export一次

/usr/sbin/exportfs -rv

全部卸载

/usr/sbin/exportfs -au
exports [-aruv]
-a 全部mount或umount文件/etc/exports中的内容
-r 重新mount文件/etc/exports中的共享内容
-u umount目录
-v 在export的时候,将详细的信息输出到屏幕上
  1. 客户端挂载:
mkdir /dir101/bin/mount -t nfs -o port=0,vers=4 192.168.1.101:/dat /dir101

客户端软挂载:

/bin/mount -t nfs -o port=0,vers=4,soft,timeo=30,retry=3,intr 192.168.1.101:/dat /dir101

客户端解挂载

umount /dir101

如果nfs挂载磁盘后,nfs被关闭,那么执行df -h会卡死,解决,重启nfs或者通过mount | column -t把nfs挂载的目录umount 参考:http://bbs.chinaunix.net/thread-4151394-1-1.html 只输出本地挂载的文件系统, 一般是直连的

df -lh

列出你所挂载的文件系统

mount | column -t

常见问题

  1. 问题:执行service nfs start时报 Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno = Connection refused rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).

原因:rpcbind没有启动 解决方案:执行service rpcbind status后再执行service nfs start

  1. 问题:nfs挂载之后运行一段时间执行df -h时卡死

解决: 通过nfsstat -m查看正常挂载的目录情况,输出

/home/faier/svn-hd from 172.17.8.21:/home/faier/svn Flags:	rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.17.8.21,mountvers=3,mountport=43862,mountproto=udp,local_lock=none,addr=172.17.8.21/home/faier/svn-ts from 172.17.8.22:/home/faier/svn Flags:	rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.17.8.22,mountvers=3,mountport=28969,mountproto=udp,local_lock=none,addr=172.17.8.22/home/faier/script from 172.17.0.138:/home/faier/svn/script Flags:	rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.17.8.30,minorversion=0,local_lock=none,addr=172.17.0.138/home/faier/etc/env from 172.17.0.138:/home/faier/svn/etc/env Flags:	rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.17.8.30,minorversion=0,local_lock=none,addr=172.17.0.138/home/faier/svn-site from 172.17.0.149:/home/faier/svn Flags:	rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.17.8.30,minorversion=0,local_lock=none,addr=172.17.0.149/home/faier/svn-comm from 172.17.0.138:/home/faier/svn Flags:	rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.17.8.30,minorversion=0,local_lock=none,addr=172.17.0.138/home/faier/svn-flyer from 172.17.0.139:/home/faier/svn Flags:	rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.17.8.30,minorversion=0,local_lock=none,addr=172.17.0.139/home/faier/svn-opt from 172.17.0.141:/home/faier/svn Flags:	rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.17.0.141,mountvers=3,mountport=17932,mountproto=udp,local_lock=none,addr=172.17.0.141/home/faier/svn-arch from 172.17.0.144:/home/faier/svn Flags:	rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.17.8.30,minorversion=0,local_lock=none,addr=172.17.0.144

发现有version 3和version 4,但version 4有port参数,所以解决如下:

  • 将nfs按ver4挂载并且指定port=0:/bin/mount -t nfs -o port=0,vers=4 172.17.0.144:/home/faier/svn /home/faier/svn-arch
  • 将nfs按ver3挂载并且不用指定端口:/bin/mount -t nfs -o vers=3 172.17.0.144:/home/faier/svn /home/faier/svn-arch
  1. 问题:一台有nfs的服务器断网后,nfs客户端卡死,直到恢复网络后,依然没有恢复过来 参考:https://blog.csdn.net/lindao99/article/details/80000002

原因: 造成这种现象的原因是nfs服务器/网络挂了,nfs客户端默认采用hard-mount选项,而不是soft-mount,它们是区别是

  • soft-mount:当客户端加载NFS不成功时,重试retrans设定的次数,如果retrans次都不成功,则放弃此操作,返回错误信息“Connect time out”
  • hard-mount:当客户端加载NFS不成功时,一直重试,直到NFS服务器有响应,hard-mount是系统的缺省值 ,在待定hard-mount时,最好同时选intr,允许中断系统的调用请求,避免引起系统的挂起。当NVS服务器不能响应NFS客户端的hard-mount请求时,NFS客户端会显示“NFS server hostname not responding, still tring”

解决: 改成soft-mount模式,soft和hard模式

  • 当nfs的服务器端出现异常的时候,linux服务器的底层有重发机制,nfs客户端一直去向服务器端请求,判断服务器是否正常,一直阻塞。
  • 当客户端挂载的时候采用hard模式,服务器端出现异常,则客户端会一直发请求,直到服务器正常。
  • 当客户端挂载的时候采用soft模式,我们可以配置timeo和retry参数,配置超时时间,服务器端出现异常,客户端也会向服务器端发请求,当超过我们配置的时间,则会返回错误,不会一直阻塞。

hard模式挂载:

/bin/mount -t nfs -o port=0,vers=4 192.168.1.101:/dat /dir101

soft模式挂载

/bin/mount -t nfs -o port=0,vers=4,soft,timeo=30,retry=3,intr 192.168.1.101:/dat /dir101
  • timeo的单位是0.1秒,配置为30就是隔3秒客户端向服务器端请求
  • 断网命令:iptables -A OUTPUT -d 172.16.18.0/24 -j DROP
  • 恢复命令:iptables -F
  • 当访问到nfs服务异常的挂载点时,等待9秒超时会自动提示"df: `/dir101': Input/output error"