nfs是Network File System的缩写,即网络文件系统,是一种分布式文件系统协议,最初由Sun Microsystems公司开发。nfs允许一个系统在网络上与它人共享目录和文件,通过使用nfs,用户和程序可以象访问本地文件一样访问远端系统上的文件
注意:NFS一般是用于文件冷备份,即非用于线上实时备份的机制,如果需要线上文件多副本备份建议采用分布式文件存储组件,如FastDFS,ceph等
nfs安装
- 检查系统是否开启nfs服务
service nfs status
- 安装nfs
yum install -y nfs-utils
- 启动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
- 配置nfs开机启动
chkconfig nfs --level 345 on
chkconfig rpcbind --level 345 on
- 开始挂载
参考: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的时候,将详细的信息输出到屏幕上
- 客户端挂载:
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
常见问题
- 问题:执行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
- 问题: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
- 问题:一台有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"