本文发布于Cylon的收藏册,转载请著名原文链接~
NFS介绍
什么是NFS
NFS是 Network File System 网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如Web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
一般情况下,Windows网络共享服务或samba服务用于办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,如果是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如:Moosefs(mfs)、GlusterFS、FastDFS。
NFS的历史介绍
第一个网络文件系统被称为File Access Listener,由Digital Equipment Corporation(DEC)在1976年开发。
NFS是第一个构建于IP协议之上的现代网络文件系统。在20世纪80年代,它首先作为实验的文件系统,由Sun Microsystems在内部完成开发。NFS协议归属于Request for Comments(RFC)标准,并且随后演化为NFSv2。作为一个标准,由于NFS与其他客户端和服务器的互操作能力很好而发展快速。
之后,标准继续演化,成为NFSv3,在RFC1813中有定义。这一新的协议比以前的版本具有更好的可扩展性,支持大文件(超过2GB),异步写入,并且将TCP作为传输协议,为文件系统在更广泛的网络中使用铺平了道路。在2000年,RFC 3010(由RFC 3530修订)将NFS带入企业级应用。此时,Sun引入了具有较高安全性、带有状态协议的NFSv4(NFS之前的版本都是无状态的)。今天,NFS版本的4.1(由RFC 5661定义)增加了对跨越分布式服务器并行访问的支持(称为PNFS extension)。
NFS系统已经历了近30年的发展。它代表了一个非常稳定的(及可移植)网络文件系统,具备可扩展、高性能等特性,并达到了企业级应用质量标准。由于网络速度的增加和延迟的降低,NFS系统一直是通过网络提供文件系统服务的有竞争力的选择,特别是在中小型互联网企业中,应用十分广泛。
NFS在企业中的应用场景
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里,例如:BBS产品的图片、附件、头像(注意网站BBS程序不要放在NFS共享里),然后前端所有的节点访问这些静态资源时都可读取NFS存储上的资源。NFS是当前互联网系统架构中最常用的数据存储服务之一,前面说过,中小型网站公司应用频率更高,大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统,比如Moosefs(mfs)、GlusterFS、FastDFS等。
企业生产集群为什么需要共享存储角色
例如:A用户传图片到Web1服务器,然后让B用户访问这张图片,结果B用户访问的请求分发到了Web2,因为Web2上没有这张图片,这就导致它无法看到A用户上传的图片,如果此时有一个共享存储,A用户上传图片的请求无论是分发到Web1还是Web2上,最终都会存储到共享存储上,而在B用户访问图片时,无论请求分发到Web1还是Web2上,最终也都会去共享存储上找,这样就可以访问到需要的资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通PC服务器配置NFS网络文件系统实现。
当集群中没有NFS共享存储时,用户访问图片的情况如图所示。
如果集群中有NFS共享存储,用户访问图片的情况如图所示。
中小型互联网企业一般不会买硬件存储,因为太贵,大公司如果业务发展很快的话,可能会临时买硬件存储顶一下网站的压力,当网站并发继续加大时,硬件存储的扩展相对就会很费劲,且价格成几何级数增加。例如:淘宝网就曾替换掉了很多硬件设备,比如,用LVS+Haproxy替换了netscaler负载均衡设备,用FastDFS、TFS配合PC服务器替换了netapp、emc等商业存储设备,去IOE正在成为互联网公司的主流。
NFS系统原理介绍
NFS系统挂载结构图解与介绍
在NFS服务器端设置好一个共享目录/video后,其他有权限访问NFS服务器端的客户端都可以将这个共享目录/video挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定),不同客户端的挂载点可以不相同。
客户端正确挂载完毕后,就可以通过NFS客户端的挂载点所在的/v/video或/video目录查看到NFS服务器端/video共享出来的目录下的所有数据。在客户端上查看时,NFS服务器端的/video目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别,根据NFS服务器端授予的NFS共享权限以及共享目录的本地系统权限,只要在指定的NFS客户端操作挂载/v/video或/video的目录,就可以将数据轻松地存取到NFS服务器端上的/video目录中了。
什么是RPC
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,它会随机取用一些未被使用的端口来作为传输之用,其中CentOS 5.x的随机端口都小于1024,而CentOS 6.x的随机端口都是较大的。
因为端口不固定,这样一来就会造成NFS客户端与NFS服务器端的通信障碍,因为NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信,才能交互数据。
要解决上面的困扰,就需要通过远程过程调用RPC(Remote Proce-dure Call)服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的。这个RPC服务类似NFS服务器端和NFS客户端之间的一个中介,流程如图10-7所示。
拿房屋中介打个比喻吧:假设我们要找房子,这里的我们就相当于NFS客户端,中介介绍房子,就相当于RPC服务,房子所有者房东就相当于NFS服务,租房的人找房子,就要找中介,中介要预先存有房子主人的信息,才能将房源信息告诉租房的人。
那么RPC服务如何知道每个NFS的端口呢?
当NFS服务器端启动服务时会随机取用若干端口,并主动向RPC服务注册取用的相关端口及功能信息,如此一来,RPC服务就知道NFS每个端口对应的NFS功能了,然后RPC服务使用固定的111端口来监听NFS客户端提交的请求,并将正确的NFS端口信息回复给请求的NFS客户端,这样一来,NFS客户端就可以与NFS服务器端进行数据传输了。
在启动NFS Server之前,首先要启动RPC服务(CentOS 5.8下为portmap服务,CentOS 6.6下为rpcbind服务,下同),否则NFS Server就无法向RPC服务注册了。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。要特别注意的是,一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行/etc/init.d/nfs reload或exportfs-rv即可使修改的/etc/exports生效。
NFS的工作流程原理
当访问程序通过NFS客户端向NFS服务器端存取文件时,其请求数据流程大致如下:
- 1)首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
- 2)NFS服务器端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)。
- 3)此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据。
- 4)NFS客户端把数据存取成功后,返回给前端访问程序,告知用户存取结果,作为网站用户,就完成了一次存取操作。
因为NFS的各项功能都需要向RPC服务(rpcbind服务)注册,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号(port number)、PID、NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务询问才能找到正确的端口。也就是说,NFS需要有RPC服务的协助才能成功对外提供服务。从上面的描述,我们不难推断,无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务,NFS服务必须在RPC服务启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。
注意: NFS的RPC服务,在CentOS 5.X下名称为portmap,在CentOS 6.X下名称为rpcbind。
安装NFS服务
搭建NFS环境准备
克隆虚拟机
克隆的虚拟机存在的网络问题
原因分析:
使用VM的克隆功能,会为新产生的虚拟机配置一个与原始虚拟机网卡MAC地址不同的网卡。对于CentOS这样的Linux系统,会把运行时的网卡MAC地址记入/etc/udev/rules.d/70-persistent-net.rules文件中。这样克隆好的新系统里也保存了这个记录。
当新系统启动时,由于vm已经为其配置了不同的MAC地址,因此系统会在启动扫描硬件时把这个新的MAC地址的网卡当做是eth1,并且增加记入上述文件中。而此时配置文件里的/etc/sysconfig/network-scripts/ifcfg-eth0里记录的还是原来的MAC地址,而这个MAC地址在新系统里是不存在的,所以无法启动。
解决方法1
- 删除里面的uuid,因为这个是唯一的值
- 更改HWaddr为eth1的值
重启系统后
解决方法2
1.编辑eth0的配置文件:vi /etc/sysconfig/network-scripts/ifcfg-eth0
,删除HWADDR地址那一行及UUID的行
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
IPV6INIT=no
USERCTL=no
HWADDR=00:0c:29:08:28:9f
UUID=cee39dbb-6a10-4425-9daf-768b6e79a9c9
2.清空 /etc/udev/rules.d/70-persistent-net.rules
>/etc/udev/rules.d/70-persistent-net.rules
3.重启系统
注: 两种方法更改后重启网卡是不行的,必须重启系统
安装NFS
要部署NFS服务,需要安装下面的软件包:
nfs-utils
:NFS服务的主程序,包括rpc.nfsd
、rpc.mountd
这两个daemons和相关文档说明,以及执行命令文件等。rpcbind
:CentOS 6.X下面RPC的主程序。NFS可以视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。
NFS安装的三种方式
检查软件是否安装
rpm -qa nfs-utils rpcbind
yum安装
yum install nfs-utils rpcbind -y
通过系统光盘里的rpm包安装,命令 nfs-utils-1.2.3-64.el6.x86_64
yum grouplistgrep -i nfs
yum groupinstall "NFS file server" -y
启动NFS相关服务
启动rpcbind服务
因为NFS及其辅助程序都是基于RPC(Remote Procedure Call)协议的(使用的端口为111),所以首先要确保系统中运行了rpcbind服务。
/etc/init.d/rpcbind start
/etc/init.d/rpcbind status #<==检查rpcbind服务状态
rpcinfo -p localhost #<==rpcbind服务未启动检查rpcinfo信息的报错
$ ps -ef|egrep "rpc|nfs"
rpcuser 901 1 0 06:43 ? 00:00:00 rpc.statd <==检查文件一致性
rpc 1071 1 0 07:24 ? 00:00:00 rpcbind
root 1101 2 0 07:24 ? 00:00:00 [rpciod/0]
root 1110 1 0 07:24 ? 00:00:00 rpc.rquotad
root 1115 1 0 07:24 ? 00:00:00 rpc.mountd
root 1122 2 0 07:24 ? 00:00:00 [nfsd4]
root 1123 2 0 07:24 ? 00:00:00 [nfsd4_callbacks]
root 1124 2 0 07:24 ? 00:00:00 [nfsd]
root 1125 2 0 07:24 ? 00:00:00 [nfsd]
root 1126 2 0 07:24 ? 00:00:00 [nfsd]
root 1127 2 0 07:24 ? 00:00:00 [nfsd]
root 1128 2 0 07:24 ? 00:00:00 [nfsd]
root 1129 2 0 07:24 ? 00:00:00 [nfsd]
root 1130 2 0 07:24 ? 00:00:00 [nfsd]
root 1131 2 0 07:24 ? 00:00:00 [nfsd]
root 1158 1 0 07:24 ? 00:00:00 rpc.idmapd
问:如何让rpcbind比nfs先启动?
一般都是将启动命令放入rc.local中
配置NFS
nfs配置文件
提示:NFS默认配置文件/etc/exports其实是存在的,但是没有内容,需要用户自行配置
$ cat /etc/exports
# NFS共享的目录 共享给谁(权限) NFS客户端地址1(参数1,参数2) NFS客户端地址2(参数1,参数2)
/data 192.168.59.*(rw,sync)
/data 10.1.1.1(rw,sync)
客户端地址 | 具体地址 | 说明 |
---|---|---|
授权单一客户端访问NFS | 10.0.0.30 | 一般情况下生产环境中此配置不多 |
授权整个网段可访问NFS | 10.0.0.0/24 | 其中24位255.255.255.0,指定网段为生产环境中最常见的配置。配置简单,维护方便 |
授权整个网段可访问NFS | 10.0.0.0/24 | 其中24位255.255.255.0,指定网段为生产环境中最常见的配置。配置简单,维护方便 |
授权整个网段可访问NFS | 10.0.0.* | 指定网段的另外写法(不推荐使用) |
授权某个域名客户端访问 | nfs.bodboy.com | 生产环境中一般情况下不常用。(域名可在hosts文件中解析) |
授权整个域名客户端访问 | *.oldboy.com | 生产环境中一般情况下不常用 |
常用格式说明 | 要共享的目录 客户端IP地址或IP段(参数1,参数2…) |
---|---|
配置例一 | /data 10.0.0.0/24(rw,sync) #<– 允许客户端读写,并且数据同步写到服务器端磁盘里,注意,24 和 ( 之间不能有空格 |
配置例二 | /data 10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000) #<–允许客户端读写,并且数据同步写到服务器端的磁盘里,并指定客户端的用户UID和GID。早期生产环境的一种配置,适合多客户端共享一个NFS服务单目录,如果所有服务器的nfsnobody账户UID都是65534,则本例没什么必要了。早期CentOS5.5的系统默认情况下nfsbobody的UID不一定是65534,此时如果这些服务器共享一个NFS目录,就会出现访问权限问题 |
配置例三 | /home/oldbody 10.0.0.0/24(ro) #<– 只读并共享用途:例如在生产环境中,开发人员有查看盛传服务器日志的需求,但有不希望给开发生产服务器的权限,那么就可以给开发提供某个测试服务器NFS客户端上查看某个生产服务器日志目录(NFS共享)的权限,当然这不是唯一的放法,例如可以把程序记录的日志发送到测试服务器供开发查看或者通过收集日志等其他方式展现 |
参数选项 | 说明 |
---|---|
ro |
只读访问 |
rw |
读写访问 |
sync |
请求或写入数据时,数据同步写入到NFS服务器的硬盘后才返回。 优点,数据安全不会丢,缺点,性能比不启用该参数要差 |
async | 写入数据会先写到内存缓存区,直到硬盘有空挡才会再写入磁盘,这样可以提升写入效率!风险若为服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决方法:服务器主板点出或加UPS不间断电源) |
all_squash |
不管访问NFS服务器共享目录的用户身份如歌,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。在早期多个NFS客户端同时读写NFS服务器数据时,这个参数很有用 在生产中配置NFS的重要技巧: 1)确保所有客户端服务器对NFS共享目录具备想用的用户访问权限 a.all_squash 把所有客户端都压缩成固定的匿名用户(UID相同)b.就是anonuid,anongid指定的UID和GID用户 2)所有的客户端和服务器端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同) |
no_all_squash |
访问NFS服务器共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原是为无盘客户端准备的。用户应该避免使用 |
root_squash |
如果访问NFS服务器共享目录是root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份 |
anonuid=xxx |
参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多NFS客户端时,如多台webserver共享一个NFS目录,通过这个参数可以使得不同的NFS客户端写入的数据对所有NFS客户端保持永阳的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可 |
anonuid |
同uid |
配置服务器端
$ /etc/init.d/nfs reload = exportfs -rv(平滑生效)
reload = exportfs -rv
(平滑生效)位置
检查挂载信息
$ showmount -e 127.0.0.1
Export list for 127.0.0.1:
/data 192.168.59.*
执行挂载命令
$ mount -t nfs 192.168.59.133:/data /mnt
查看挂载结果
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 9.1G 1.5G 7.2G 17% /
tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 190M 27M 153M 16% /boot
192.168.59.133:/data 9.1G 1.5G 7.2G 17% /mnt
配置客户端
开启rpcbind
$ /etc/init.d/rpcbind start
正在启动 rpcbind:[确定]
将rpcbind服务设置为开机自启动
$ vi /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/etc/init.d/rpcbind start
查看挂载信息
$ showmount -e 192.168.59.133
Export list for 192.168.59.133:
/data 192.168.59.*
设置挂载
$ mount -t nfs 192.168.59.133:/data /mnt
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 9.1G 1.4G 7.2G 17% /
tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 190M 27M 153M 16% /boot
192.168.59.133:/data 9.1G 1.5G 7.2G 17% /mnt
切换到挂载的目录
$ cd /mnt
查看nfs服务器文件列表
$ ls
a.log
解决不能写的问题
$ vi /var/lib/nfs/etab
/data 192.168.59.*(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
$ grep 65534 /etc/passwd
nfsnobody❌65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
# 将目录所属用户设置为nfsnobody
$ chown -R nfsnobody /data
# 查看设置结果
$ ls -l /
drwxr-xr-x. 2 nfsnobody root 4096 4月 8 21:54 data
# 在客户端创建一个文件
$ touch b.txt
# 在服务器端查看
$ ls
b.txt
重启后挂载失效
在 /etc/rc.loacl
中挂载,不要在fstab中,因为linux启动过程,fstab先启动。网络是后启动的,网络磁盘是挂不上的
挂载服务器断
mount -t nfs 192.168.59.133:/data /mnt
$ cat /proc/mounts
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=235908k,nr_inodes=58977,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,seclabel,relatime 0 0
/dev/sda3 / ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0
none /selinux selinuxfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=235908k,nr_inodes=58977,mode=755 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /boot ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
nfsd /proc/fs/nfsd nfsd rw,relatime 0 0
192.168.59.133:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=4096,wsize=1024,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.59.133,minorversion=0,local_lock=none,addr=192.168.59.133 0 0
$ cd /mnt
$ umount /mnt
umount.nfs: /mnt: device is busy
umount.nfs: /mnt: device is busy
$ umount -lf /mnt
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 9.1G 1.5G 7.2G 17% /
tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 190M 27M 153M 16% /boot
参数 | 参数功能 | 默认参数 |
---|---|---|
fg/bg | 当在客户端执行挂载时,可选择时前台(fg)还是后台(bg)执行。若在前台执行,则mount会持续尝试挂载,直到成功或挂载时间超时为止,若在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的其他程序操作。如果网络联机不稳定,或是服务器常常需要开关机,建议使用bg比较妥当 | fg |
soft/hard | 当NFS客户端以soft挂载服务器时,若网络或服务器出现问题,造成客户端与服务器之间无法传输资料,客户端就会一直尝试,直到timeout(超时时间)后显示错误才停止。若使用soft mount的话,可能会在timeout出现时造成资料丢失,故一般不建议使用。若用hard模式挂载硬盘时,刚与soft相反,此时客户端会一直尝试连线倒服务器,若服务器有回应就继续刚才的操作,若没有回应NFS客户端会一直尝试,此时无法umount或kill,所以常常会配合intr使用 | hard |
intr | 当使用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,这避免出问题时系统整个被NFS锁死,建议使用intr | 无 |
rsize/wsize | 读出(rsize)与写入(wsize)的区块大小(block size),这个设置值可以影响客服端与服务器传输数据的传冲存储量,一般来说,如果在局域网内,别且客户端与服务器端都具有足够的内存,这个值可以设置大一点,比如65535(bytes),提升缓冲区块将提升NFS文件系统的传输能力。但设置的值也不要太大,最好以网络能够传输的最大值为限 | CentOS5X:默认值rsize=1024 wsize=1024 CentOS6:默认值 rsize=131072 wsize=131072 |
proto | 使用UDP协定来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用proto=tcp多传输的数据会有比较好的纠错能力 | proto=tcp |
通过man nfs查看上述参数信息。如果追求极致,可以用如下参数挂载
mount -t nfs -o fg,hard,intr,rsize=1111,wsize=1111 10.0.0.7:/data /mnt
如果考虑简单、易用为原则,直接选择默认值
mount -t nfs 10.0.0.7:/data /mnt
参数 | 参数意义 | 系统默认值 |
---|---|---|
suid/nosuid |
当挂载的文件系统上有任何SUID的程序时,只要使用nosuid就能够取消设置SUID功能 | suid |
rw/ro |
可以指定文件系统是只读或可写 | rw |
dev/nodev | 是否可以保留装置文件的特殊功能?一般来说只有/dev才会有特殊的装置,因此可选择nodev | dev |
exec/noexec |
是否具有执行文件权限?如果想要挂载的文件时普通的资源区(例如:图片、附件),那个可以选择noexec | exec |
user/nouser | 是否允许用户拥有文件的挂载与卸载功能?如果要保护文件系统,最好不要为用户提供挂载与卸载功能 | nouer |
auto/noauto | 这个auto是指“mount -a”时会不会被挂载的项目,如果不需要这个分区随时被挂载,可以设置为noauto auto | |
default |
这个是fstab里面的默认值,包括rw、suid、dev、exec、auto、nouser、async默认情况下大部分都是默认值 | |
noatime/atime |
atime:在每一次数据访问时,会永不更新访问文件的inode时间戳,在高并发情况下,建议通过加上noatime来取消这个默认项,已到提升I/O性能,优化I/O的目的 noatime:访问文件不更新文件的inode时间戳,高并发环境,推荐显示应用该选项,可提高磁盘I/O性能 |
atime |
sync/async |
该参数与async相反。有I/O操作时,会同步处理I/O即吧数据同步写入硬盘。次参数会牺牲一点I/O性能,但是,换来的时断电后数据的安全性。 sync:涉及文件I/O的操作都是异步处理,即不会写到磁盘,此参数会提高性能,但会降低数据安全。一般情况,生产环境不推荐使用。除非对性能要求很高,对数据可靠性不要求场合 |
问:在企业生产环境中,NFS客户端挂载有没有必要加某些参数,如:noexec、nosuid、bg、soft、rsize、wsize等参数,有书上说建议加rsize、wszie这两个参数
这个问题属于mount挂载优化内容(有些参数也适合其他文件系统),一般来说要适当加挂载参数,但是,最好先做测试,用数据来说话,才能更好的确定到底是挂载还是不挂载。
有关安全挂载参数选项
在工作环境,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视频)不需要执行suid、exec等权限。挂载的这个文件系统时能作为数据存取只用,无法执行程序,对于客户端来讲增加了安全性,例如:很多木马篡改文件都是由上传入口上传的程序倒存储目录然后执行的。 因此在挂载的时候用下面的命令很有必要
mount -t nfs -o noexec,nosuid,nodev,rw 10.0.0.7:/data /mnt
注:通过mount -o指定挂载参数与/etc/fstab里指定挂载参数的效果是一样的。
挂载性能优化参数
禁止更新目录及文件时间戳挂载
mount -t nfs -o noatime,nodiratime 10.0.0.7:/data /mnt
安全加优化的挂载方法如下
mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 10.0.0.7:/data /mnt
NFS优缺点
优点:
- 简单易上手,容易掌握
- 数据可见
- 部署快速,维护简单,且可控,满足需求就是最好的
- 可靠,从软件层面上来看,数据可靠性高,经久耐用。数据实在文件系统之上的。
- 服务非常稳定
缺点:
- 存在单点故障,服务器宕机,所有的客户端都不能访问共享目录
- 在大数据高并发的场合,NFS效率、性能有限(2000W/日以下的PV网站不是瓶颈。除非网站架构设计太差)
- 安全性一般等
本文发布于Cylon的收藏册,转载请著名原文链接~
链接:https://www.oomkill.com/2016/04/nfs-network-filesystem/
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。