NFS客户端挂载
挂载命令 |
挂载的类型格式 |
NFS服务器提供的共享目录 |
NFS客户端挂载点 |
mount |
-t nfs |
172.16.1.31:/data |
/mnt |
grep mnt /proc/mounts
172.16.1.31:/data /mnt nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.7,local_lock=none,addr=172.16.1.31 0 0
参数 |
参数功能 |
默认参数 |
fg/bg |
当在客户端执行挂载时,可选择是在前台(fg)还是后台(bg)执行.若在前台执行,则mount会持续尝试挂载,直到成功或挂载超时为止,若在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的其他程序操作.如果网络联机不稳定,或是服务器常常需要开关机,建议使用bg |
fg |
soft/hard |
当NFS client以soft挂载Server时,若网络或Server出现问题,造成Client和Server无法传输资料,Client就会一直尝试,直到超时(timeout)后显示错误才停止.若使用soft mount,可能会在超时出现时造成资料丢失,一般不建议使用.若用hard模式挂载硬盘,和soft相反,此时Client会一直尝试连线到Server,若Server有回应就继续刚才的操作,若没有回应NFS Client会一直尝试,此时无法unmount或kill,所以常常配合intr使用 |
hard |
intr |
当时用hard模式挂载的资源超时时,若指定有intr参数们可以在超时后把它中断掉,避免出问题时系统整个被NFS锁死,建议使用intr |
无 |
rsize/wsize |
读出与写入的区块大小(block size),这个设置值可以影响客户端与服务器端传输数据的缓冲存储量,提升缓冲区块将可提升NFS文件系统的传输能力,最好以网络能够传输的最大值为限 |
默认值rsize=131072 wsize=131072 |
proto=tcp |
使用UDP来传输资料,在LAN中有比较好的性能.若要跨越Internet,使用tcp多传输的数据会有比较好的纠错能力 |
proto=tcp |
参数 |
参数意义 |
系统默认值 |
suid/nosuid |
当挂载的文件系统上有任何suid的程序时,只要使用nosuid就能够取消设置suid的功能 |
suid |
rw/ro |
可以指定文件系统是只读(ro)还是可写(rw) |
rw |
dev/nodev |
是否可以保留装置文件的特殊功能,一般来说只有/dev才会有特殊的装置,因此可以选择nodev |
dev |
exec/noexec |
是否具有执行文件的权限,如果想要挂载的仅是普通资源数据区(如图片、附件),可以选择noexec |
exec |
user/nouser |
是否允许用户进行文件的挂载与卸载功能,如果要保护文件系统,最好不要提供挂载与卸载功能 |
nouser |
auto/noauto |
执行mount -a时,此文件是否被主动挂载,如果不需要分区随时被挂载,可以设置为noauto |
auto |
- mount -o参数说明
- async:涉及文件系统I/O的操作都是异步处理,即不会同步写入磁盘,此参数会提高性能,但会降低数据安全性.一般情况下,生成环境不推荐使用,除非是在对性能要求很高,对数据可靠性不要的场合
- sync:和async相反.有I/O的操作都会同步处理,即把数据同步写入硬盘.此参数会牺牲一点I/O性能,但是,换来的是断电后数据的安全性
- 仅适合ext2、ext3、fat、vfat和ufs等文件系统
- atime:在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项
- ro:以只读的方式挂载一个文件系统
- rw:以可写的方式挂载一个文件系统
- auto:能够被自动挂载,通过-a参数(加载文件/etc/fstab中配置的所有信息,查看是否正确配置)
- noauto:不会自动挂载文件系统
- defaults:是/etc/fstab第四列挂载参数的默认值,包括rw、suid、dev、exec、auto、nouser、async
- exec:允许文件系统执行二进制文件,取消这个参数,可以提升系统安全性
- noexec:在挂载的文件系统中不允许直接执行任何二进制的程序,仅对二进制程序有效,即使设置了noexec,shell、php程序还是可执行的
- noatime:访问文件时不更新文件的inode时间戳,高并发环境下推荐显式应用该选项,可以提高系统I/O性能
- nodiratime:不更新文件系统上的directory inode时间戳,高并发环境下推荐显式应用该选项,可以提高系统I/O性能
- suid:允许suid和sgid位生效
- nouser:禁止一个普通用户挂载该文件系统
- remount:尝试重新挂载一个已经挂载了的文件系统
- dirsync:目录更新时同步写入磁盘
NFS客户端挂载优化
mount -t nfs -o nosuid,noexec,nodev,rw 172.16.1.34:/data/ /mnt
mount -t nfs -o noatime,nodiratime,rw 172.16.1.34:/data/ /mnt
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072,rw 172.16.1.34:/data/ /mnt
- 关于noatime和nodiratime:这两个选项是在读写磁盘时,不更新文件和目录的时间戳(不更新文件系统中对应inode信息),可以减少和磁盘系统的交互,提升读取和写入磁盘的效率,更新文件时间戳对于工作数据必要性不大,最大的问题时增加了访问磁盘I/O的次数,以致拖慢系统性能
NFS内核优化
- /proc/sys/net/core/rmem_default:该文件指定了接收套接字缓冲区大小的默认值(以字节为单位),默认设置:124928
- /proc/sys/net/core/rmem_max:该文件指定了接收套接字缓冲区大小的最大值(以字节为单位),默认设置:124928
- /proc/sys/net/core/wmem_default:该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928
- /proc/sys/net/core/wmem_max:该文件指定了发送套接字缓冲区大小的最大值(以字节为单位),默认设置:124928
vim /etc/sysctl.conf
/proc/sys/net/core/rmem_default = 8388608
/proc/sys/net/core/rmem_max = 8388608
/proc/sys/net/core/wmem_default = 16777216
/proc/sys/net/core/wmem_max = 16777216
NFS客户端开机启动自动挂载
/bin/mount -t nfs 172.16.1.31:/data /mnt
- 如果放在fstab中,理论上开机启动过程中,fstab会优于网络被Linux系统加载.网络没启动时执行fstab会导致连接不上NFS服务器端,无法实现开机挂载.而且,即使是本地的文件系统,fstab中最后两列要设置0 0.否则有可能倒是无法启动服务器的问题
NFS服务宕机后给NFS客户端带来的问题
- 多台客户机挂载一个NFS服务器时,连接管理维护麻烦(耦合度高).尤其是NFS服务器端出现问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂载,正式环境可修复NFS服务或强制卸载)
- 解决方法:
- 在
cat /proc/mounts
找到挂载点,执行unmount -lf /data方式卸载
- mount挂载时增加soft或intr,不让客户端持续呼叫NFS服务器
- 在fstab第四列defaults增加intr后soft
defaults,intr或者defaults,soft
NFS系统优缺点
- 优点
- 简单、容易上手、容易掌握
- NFS文件系统内的数据在文件系统之上的,即数据时看得见的
- 部署快速,维护简单方便,且可控
- 数据可靠性高
- 服务稳定
- 缺点
- 存在单点故障,如果NFS Server宕机了,所有客户端都不能访问共享目录
- 在大数据高并发的场合,NFS效率、性能有限(2000万/PV)
- 客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(内网则问题不大)
- NFS数据是明文,NFS本身不对数据完整性进行校验
- 多台客户机挂载一个NFS服务器时,耦合度高
showmount
- 一般用于从NFS客户端检查NFS服务器端共享目录的情况
短格式 |
长格式 |
实例 |
-e |
--exports |
显示NFS服务器输出的目录列表 |
-d |
--directories |
显示NFS服务器中提供共享的目录 |
-a |
--all |
以ip:dir格式显示NFS服务器的IP地址和可被挂载的目录 |
exportfs
RPC
rpcinfo [-n 端口号] -u 主机名 程序号 [版本号]
rpcinfo [-n 端口号] -t 主机 程序号 [版本号]
rpcinfo -p [主机]
rpcinfo -b 程序号 版本号
rpcinfo -d 程序号 版本号
rpcinfo -p 172.16.1.31
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
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100024 1 udp 60264 status
100024 1 tcp 54320 status
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
NFS服务器端防火墙控制
iptables -A INPUT -s 172.16.1.0/16 -j ACCEPT
iptables -A INPUT -i eth1 -s 172.16.1.0/16 -p tcp -dport 111 -j ACCEPT
NFS自动挂载部署
autofs
autofs可以实现当个用户访问NFS的时候再进行挂载,如果指定时间内没有用户访问NFS,autofs就会将挂载点自动卸载
autofs可以解决NFS服务器和客户端紧密耦合的问题,就是NFS服务器宕机引起的一系列问题
缺点
- 只有用户请求时才挂载,所以当高并发访问时,开始请求的瞬间需要执行挂载,性能较差,因此,在高并发场景中,宁愿保持继续挂载也不会使用aotufs实现自动挂载,但是在非高并发环境中,或者并发很低的环境可使用
配置NFS客户端通过autofs实现自动挂载
# 1.
yum install autofs -y
# 2.
systemctl start autofs
# 3.
cp /etc/auto.master{,.ori}
# 4.
vim /etc/auto.master
#
# Sample auto.master file
# This is a 'master' automounter map and it has the following format:
# mount-point [map-type[,format]:]map [options]
# For details of the format look at auto.master(5).
#
/misc /etc/auto.misc # 定义了一个挂载点/misc,需要在/etc/auto.misc中定义挂载动作,并且设置挂载超时时间为60秒
#
# NOTE: mounts done from a hosts map will be mounted with the
# "nosuid" and "nodev" options unless the "suid" and "dev"
# options are explicitly given.
#
/net -hosts
#
# Include /etc/auto.master.d/*.autofs
# The included files must conform to the format of this file.
#
+dir:/etc/auto.master.d
#
# Include central master map if it can be found using
# nsswitch sources.
#
# Note that if there are entries for /net or /misc (as
# above) in the included master map any keys that are the
# same will not be seen as the first read key seen takes
# precedence.
#
+auto.master
/mnt /etc/auto.misc --timeout 60
# 5.
vim /etc/auto.misc
nfsdata -fstype=nfs 172.16.1.31:/data
# nfsdata为一个共享目录的切入点,-fstype为指定挂载类型参数,后面的信息为NFS共享目录设备
# 6.
unmount -lf /mnt # 卸载原有挂载的目录信息
# 7.
mkdir -p /mnt/nfsdata
# 8.
chown -R nfsnobody.nfsnobody /mnt
# 9.
systemctl restart autofs
# 10. 利用共享目录挂载的切入点实现自动挂载
cd /mnt/nfsdata
touch test.text
# 11. 在NFS服务器查看结果
ls /data