网络文件系统NFS,网络文件系统


NFS介绍

什么是NFS?

NFS是Network File System的缩写,即网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从NFS客户端的机器本地看,NFS服务端共享的目录就好像是客户自己的磁盘分区或者目录一样,而实际上确是远端的NFS服务端的目录。

NFS网络文件系统类似windows系统的网络共享、安全功能、网络驱动器映射,这也和linux系统里的samba服务类似。应用于互联网中小型集群架构后端作为数据共享,如果是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如Moosefs(mfs)、glusterfs、FastDFS。

NFS在企业中的应用场景

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件。一般是把网站用户上传的文件都放在NFS共享里,例如,BBS产品的图片、附件、头像,注意网站BBS程序不要放在NFS共享里,然后前端所有的节点访问存储服务之一,特别是中小网站公司应用频率更高。

NFS流程图

NFS原理图

NFS的RPC服务,在CentOS5.x下名称为portmap,在CentOS6.x下名称为rpcbind。

NFS服务端部署环境准备

NFS服务部署服务器准备

服务器系统

角色

ip

CentOS 6.6 x86_64

NFS服务端(nfs-server)

自定义

CentOS 6.6 x86_64

NFS客户端(nfs-client1)

自定义

CentOS 6.6 x86_64

NFS客户端(nfs-client2)

自定义

NFS SERVER端设置

NFS软件列表

部署NFS服务,需要安装下面的软件包:

nfs-utils:这个NFS服务主程序包括rpc.nfsd、rpc.mountd两个daemons和相关文档说明及执行命令文件等。

rpcbind:CentOS 6.x下面RPC的主程序(CentOS 5.x下面的portmap)

NFS可以被视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口映射工作,这个映射工作就是由rpcbind服务来完成的。因此,必须先启动rpcbind服务。

CentOS 6.6默认没有安装NFS软件包(CentOS 5默认已经安装)。

出现两个软件包,表示NFS服务端软件安装完毕。

启动NFS相关服务

工作中推荐使用/etc/rc.local进行服务的启动,不推荐使用chkconfig,目的是为了方便管理。

配置NFS服务端

NFS服务的默认配置文件路径为:/etc/exports,并且默认是空的。

exports配置文件格式

/etc/exports文件配置格式

NFS 共享目录    NFS客户端地址1(参数1,参数2,参数3…) 客户端地址1(参数1,参数2,参数3…)

NFS 共享目录    NFS客户端地址(参数1,参数2…)

 

 

 

客户端配置

启动rpcbind

 

 

在服务端删除/data中的文件/oldboy.txt,然后在客户端进行查看,文件已经不存在。

无法写入是因为权限的问题,解决办法如下。

 

 

客户端设置开机自动挂载

同样配置另外一台客户端。

故障排查

1、首先确认NFS服务端配置和服务是否正常。

最好服务端自己挂载自己看看是否成功。

这一步主要是检查服务端的NFS服务是不是正常的。

2、确认NFS客户端showmount是否正常。

如果有问题进行下面排查。

1)ping NFS服务端IP检查

2)telnet NFS服务端IP端口检查

如果出现No route to host很有可能是服务端防火墙引起。

此外,还需要注意服务端RPC服务启动顺序问题。

/etc/init.d/rpcbind start

rpcinfo -p localhost

/etc/init.d/nfs start

rpcinfo -p localhost

NFS配置参数权限

NFS配置文件权限参数说明

NFS服务器端的权限设置,即/etc/exports文件配置格式中小括号的参数。

参数名称

参数用途

rw

read-write,表示可读写权限*

ro

read-only,表示只读权限

sync

请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。数据安全不会丢,缺点,性能下降。

async

请求或写入数据是,先返回请求,再将数据写入到内存缓存和硬盘中,即异步写入数据。此参数可以提升NFS性能,但是会降低数据的安全。因此,一般情况下建议不用,如果NFS处于瓶颈状态,并且运行数据丢失的话可以打开此参数提升NFS性能。写入时数据会先写到内存缓冲区,等硬盘有空档再写入磁盘,这样可以提升写入效率,风险若服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决办法:服务器主板电池或加UPS不间断电源)。(电商秒杀是异步)

no_root_squash

访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本为无盘客户端准备的。用户应避免使用。

root_squash

对于访问NFS Server共享目录的用户如果是root的话,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份

all_squash

不管访问NFS Server共享目录的用户身份如何,它的权限都被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用。*

anonuid

参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。*

anongid

同anonuid,区别是把uid(用户id)换成gid(组id)。

推荐使用配置。

NFS服务总结

使得NFS Client端可写的服务端配置条件

当多个NFS客户端以NFS方式写入修改服务器端的文件系统时,需要具有以下权限:

1、NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限。

2、NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限。

3、每台机器都对应存在和nfs默认配置UID的相同UID65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认配置)。

当满足三个条件,多个NFS客户端才能具有互相写入,互相修改其他主机写入文件的权限。

NFS服务重要文件说明

/etc/exports

NFS服务主配置文件,配置NFS具体共享服务的地点,默认内容为空,以行为单位。

/usr/sbin/exportfs

NFS服务的管理命令。例如,可以加载NFS配置生效,还可以直接配置NFS共享目录,即无需配置/etc/exports实现共享。

exportfs不但可以加载配置生效,也可以通过命令直接共享目录。越过/etc/exports,但重启失效。

/usr/sbin/showmount

常用在客户端,查看NFS配置及挂载结果的命令。配置nfsserver,分别在服务端以及客户端查看挂载情况。

/var/lib/nfs/etab

NFS配置文件的完整参数设定的文件(有很多没有配置但是默认就有的NFS参数)。

/proc/mounts

客户端挂载参数

NFS客户端mount挂载命令    

NFS客户端挂载的命令

挂载命令

挂载的格式类型

NFS服务器提供的共享目录

NFS客户端要挂载的目录

mount

-t nfs

192.168.31.129:/data

/mnt(必须存在)

完整挂载命令为:mount -t nfs 192.168.31.129:/data /mnt

执行挂载的过程

NFS客户端mount挂载深入

NFS客户端mount挂载参数说明

在NFS服务端可以通过cat /var/lib/nfs/etab查看NFS服务端配置的参数细节。

在NFS客户端可以通过cat /proc/mounts查看mount的挂载参数细节。

NFS Client mount挂载参数列表

参数

参数功能

默认参数

fg

bg

当在客户端执行挂载时,可选择是前台fg还是在后台bg执行。若在前台执行,则mount会持续尝试挂载,直到成功或挂载时间超时为止,若在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的其它程序操作。如果网络联机不稳定,或是服务器常常需要开关机,建议使用bg比较好。

fg

soft

hard

当NFS Client以soft挂载Server后,若网络或Server出现问题,造成Client和Server无法传输资料时,Client会一直尝试到timeout后显示错误并且停止尝试。若使用soft mount的话,可能会在timeout出现时造成资料丢失,一般不建议使用。

若用hard模式挂载硬盘时,刚好和soft相反,此时Client会一直尝试连线到Server,若Server有回应就继续刚才的操作,若没有回应NFS Client会一直尝试,此时无法umount或kill,所以常常会配合intr使用。

hard

intr

当使用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,这避免出问题时系统整个被NFS锁死。

rsize

wsize

读出(rsize)与写入(wrize)的区块大小(block size),这个设置值可以影响客户端与服务端传输数据的缓冲存储量,一般来说,如果在局域网内(LAN),并且客户端与服务端都具有足够的内存,这个值可以设置大一点(65535bytes),提升缓冲区块将可提升NFS文件系统的传输能力。但设置的值也不能太大,最好是实现网络能够传输的最大值为限。

CentOS 5:默认1024

CentOS 6:默认131072

proto=udp

使用UDP协议来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用proto=tcp多传输的数据会有比较好的纠错能力

proto=tcp

man nfs查看上述信息。

优化:

下面是mount -o参数对应的选项列表

参数

参数意义

默认值

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

这个auto指的是"mount -a"时会不会被挂载的项目,如果不需要这个分区随时被挂载,可设置为noauto

auto

NFS客户端mount挂载优化

在企业工作场景,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suid、exec等权限,挂载的这类文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性。例如,很多木马篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的。

因此在挂载的时候用下面的命令很有必要。

mount安全挂载参数

mount -t nfs -o nosuid,noexec,nodev,rw 192.168.31.129:/data /mnt

通过mount -o指定挂载参数和在/etc/fstab里指定挂载参数效果是一样的。

mount挂载性能优化参数选项

1、禁止更新目录及文件时间戳挂载

mount -t nfs -o noatime,nodiratime 192.168.31.129:/data /mnt

2、安全加优化的挂载方式

mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.31.129:/data /mnt

3、默认的挂载方式(推荐)

mount -t nfs 192.168.31.129:/data /mnt

如果是本地文件系统

mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0

NFS服务内核优化

优化选项说明:

1、/proc/sys/net/core/rmem_default

该文件指定了接收套接字缓冲区大小的缺失值(以字节为单位),缺省设置:124928。

2、/proc/sys/net/core/rmem_max

该文件指定了接收套接字缓冲区大小的最大值(以字节为单位),缺省设置:124928。

3、/proc/sys/net/core/wmem_default

该文件指定了发送套接字缓冲区大小的缺失值(以字节为单位),缺省设置:124928。

4、/proc/sys/net/core/wmem_max

该文件指定了发送套接字缓冲区大小的最大值(以字节为单位),缺省设置:124928。

上述文件对应的具体内核优化命令:

企业场景NFS共享存储优化小结

1、硬件:sas、ssd硬盘,买多块,raid0、raid10。网卡吞吐量要大,至少千兆

2、NFS服务器端配置:/data

192.168.31.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)

3、NFS客户端挂载:rsize、wsize、noatime、nodirtime、nosuid、noexec、soft(hard、intr)

mount -t nfs -o nosuid,noexec,nodev,noatime,rsize=131072,wsize=131072 192.168.31.129:/data /mnt

mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072 192.168.31.129:/data /mnt

mount -t nfs -o noatime,nodiratime 192.168.31.129:/data /mnt

4、有关NFS服务的所有服务器内核优化

5、如果卸载的时候提示:umount:/mnt:device is busy,需要退出挂载目录后进行卸载,或是NFS Server宕机了,需要强制卸载mount -lf /mnt。

6、大型网站NFS网络文件系统替代软件,分布式文件系统Moosefs(mfs)、glusterfs、FastDFS。

NFS系统应用优缺点说明

作用:

NFS服务可以让不同的客户端挂载使用同一目录,作为共享存储使用,这样可以保证不同节点客户端数据的一致性,在集群架构环境中经常会用到。如果windows+linux可以用samba。

优点:

1、简单,容易上手,容易掌握。

2、NFS文件系统内数据是在文件系统之上的,即数据能看见。

3、方便,部署快速,维护简单,可控且满足需求。

4、可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的

5、稳定。

局限:

1、局限性是存在单点故障,如果nfs server宕机了所有客户端都不能访问共享目录

可以通过负载均衡及高可用方案弥补。

2、在大数据高并发的场合,NFS效率、性能有限(一般几千万pv的网站不是瓶颈,除非网站架构太差,2千万pv/日)。

3、客户端认证是基于ip和主机名的,权限是根据ID识别,安全性一般(用于内外则问题不大)。

4、NFS数据是明文的,NFS本身对数据完整性不作验证。

5、多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其NFS服务出现问题后,所有NFS客户端都挂掉状态(测试环境可以使用autofs自动挂载解决)。

6、大中小型网站(2千万PV以下)线上应用,都有用武之地。

showmount命令说明

短格式

长格式

用途及实例结果

-e

--exports

显示NFS服务器输出的目录列表

[root@web-lamp01 ~]# showmount -e 192.168.31.129

Export list for 192.168.31.129:

/data 192.168.31.0/24

-d

--directories

显示NFS服务器中提供共享的目录

-a

--all

以ip:/die格式显示NFS服务器的ip和可被挂载的目录

相关内容