NFS简介:
NFS(Network File System)即网络文件系统,最早是由Sun Microsystems在内部作为实验完成开发,是第一个构建于IP协议之上的网络文件系统,主要功能是通过TCP/IP在不同主机系统之间共享资源(文件或目录)。
NFS客户端可以通过挂载的方式将NFS服务器共享的数据目录挂载到本地,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
NFS网络文件系统有点类似Samba服务。samba主要用于在windows和unix之间共享资源,资源包括文件、打印机等等。而NFS一般用于Unix系统之间的资源共享,当然也可以共享到Windows。
为什么使用NFS:
硬件存储本身就很贵的,而随着公司业务的不断发展,网站并发继续加大时,硬件存储的扩展升级成本高,成几何倍的增长,这对于中小型企业来说是一笔不菲的开销。
所以一般中小型网站就会选择NFS进行数据共享,如果大型网站很有可能会用到更复杂的分布式文件系统,例如:MFS(Moosefs)、GlusterFS、FastDFS 等
NFS系统经历了近30年的发展, 已经是一个非常稳定、可移植、可扩展、高性能 的企业级应用,所以在中小型企业中使用的比较广泛。
NFS的原理:
在NFS服务器上设置好一个共享目录/data/server后,具有访问权限的NFS客户端都可以将/data/server这个共享目录挂载到本地的某个挂载点,这个挂载点可以自己随意指定。
客户端正确挂载完成后,就可以通过NFS客户端挂载点所在的目录查看NFS服务器共享出来的/data/server目录下的所有数据。在客户端查看时,这个共享目录就相当于客户端本地磁盘上的目录,几乎感觉不到有何区别。
根据NFS服务器端设置的权限以及/data/server共享目录的本地系统权限,只要在指定的NFS客户端挂载共享目录, 就可以将数据轻松的存取到NFS服务器上的/data/server共享目录中。
NFS是通过TCP/IP来进行服务端和客户端之间的数据传输,两者之间要传输数据就要有相对应的端口来进行传输。
但是这里有一个问题,就是NFS的端口是不固定的,因为NFS有很多的功能,而不同的功能都会使用不同的端口,NFS服务在启动时会随机选择端口,所以NFS服务器无法固定端口。
既然NFS服务器的端口不固定,NFS客户端又怎么知道服务器端使用的是那个端口呢 ?
所以就需要通过RPC服务来帮忙(Remote Procedure Call,远程过程调用)简称RPC
当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开起111端口,如果客户端有请求,那服务端的RPC就会将记录的NFS端口信息告知客户端。
也就是说RPC的主要功能就是记录NFS功能所对应的端口号,并且在NFS客户端请求时将对应的端口信息返给NFS客户端,从而确保客户端可以连接到正确的NFS端口,才能实现数据传输/数据交互的目的。
在启动NFS之前,首先要启动RPC服务,否则NFS就无法向RPC注册了。另外,如果RPC服务重新其从,原来注册好的NFS端口就会丢失,因此NFS服务也需要重启以重新向RPC注册端口信息。
要特别注意的是,修改了NFS的配置文件之后是不需要重启的,执行命令 /etc/init.d/nfs reload 或者 exportfs -rv 即可使NFS服务的配置文件/etc/exportfs生效。
无论是NFS客户端还是NFS服务器端,都需要先启动RPC服务。
NFS客户端无需启动NFS,但是需要启动RPC服务。
客户端NFS和服务端NFS通讯过程
1)首先服务器端启动RPC服务并开启111端口
2)启动NFS服务并向RPC注册端口信息
3)客户端向服务端的RPC请求服务端的NFS端口
4)服务端的RPC服务反馈NFS端口信息给客户端。
5)客户端通过获取到的NFS端口来建立和服务端的NFS连接并进行数据的传输。
NFS服务器端部署
我这里服务器端系统是 CentOS7,客户端是CentOS6。
关闭防火墙
[root@localhost ~]# systemctl stop firewalld.service #关闭防火墙
[root@localhost ~]# systemctl disable firewalld.service #禁止防火墙开机启动
关闭SELinux
[root@localhost ~]# setenforce 0 #临时关闭
#修改配置文件 vim /etc/selinux/config
SELINUX=disabled
服务端需要的软件包 nfs-utils rpcbind
nfs-utils 是NFS服务的主程序包
rpcbind 是RPC服务的程序包
centos6和centos7默认没有安装nfs(centos5已经默认安装了), 所以需要我们手动安装。可以使用 yum -y install nfs-utils rpcbind 命令安装。
采用yum方式安装, 只需要安装 nfs-utils,yum会自动安装rpcbind。
1.查看系统系信息
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2.检查系统是否安装了nfs
[root@localhost ~]# rpm -qa nfs-utils rpcbind
3.安装nfs
[root@localhost ~]# yum -y install nfs-utils rpcbind
[root@localhost ~]# rpm -qa nfs-utils rpcbind #如果出现nfs和rpc开头的两个软件包,表示nfs已经安装好了
rpcbind-0.2.0-47.el7.x86_64
nfs-utils-1.3.0-0.61.el7.x86_64
4.启动rpc服务
在启动nfs服务前, 要先启动rpc
[root@localhost ~]# systemctl start rpcbind #启动rpc
[root@localhost ~]# systemctl enable rpcbind #将加入开机启动那个
查看是否启动成功
[root@localhost ~]# systemctl status rpcbind #查看rpc运行状态
[root@localhost ~]# systemctl list-unit-files | grep rpcbind # 查看rpc是否加入开机启动
[root@localhost ~]# rpcinfo -p localhost #查看nfs服务向rpc注册的端口信息,因为nfs还没启动,所以没有太多的端口。
[root@localhost ~]# rpcinfo -p localhost 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
5.启动nfs服务
[root@localhost ~]# systemctl start nfs #启动nfs
[root@localhost ~]# systemctl enable nfs #将nfs加入开机启动
查看是否启动成功
[root@localhost ~]# systemctl status nfs #查看服务运行状态
[root@localhost ~]# systemctl list-unit-files | grep nfs.service #查看是否将nfs服务加入开机运行
[root@localhost ~]# rpcinfo -p localhost #查看nfs服务向rpc注册的端口信息,和刚才没启动nfs的时相比较,现在监听了更多的端口。
[root@localhost ~]# rpcinfo -p localhost 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 37652 status 100024 1 tcp 45595 status 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 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 100021 1 udp 58685 nlockmgr 100021 3 udp 58685 nlockmgr 100021 4 udp 58685 nlockmgr 100021 1 tcp 41537 nlockmgr 100021 3 tcp 41537 nlockmgr 100021 4 tcp 41537 nlockmgr
NFS服务的主要任务是共享文件系统数据,而文件系统数据的共享离不开权限问题。
所以NFS服务器启动时最少需要两个不同的进程,一个是管理nfs客户端是否能够登入的rpc.nfsd主进程,另一个用于管理nfs客户端是否能够取得对应权限的rpc.mountd进程。
如果还需要管理磁盘配额,则nfs还需要加载rpc.rquotad进程。
[root@localhost ~]# ps -ef | grep rpc rpc 11095 1 0 02:26 ? 00:00:00 /sbin/rpcbind -w rpcuser 11160 1 0 02:59 ? 00:00:00 /usr/sbin/rpc.statd root 11170 2 0 02:59 ? 00:00:00 [rpciod] root 11174 1 0 02:59 ? 00:00:00 /usr/sbin/rpc.idmapd root 11180 1 0 02:59 ? 00:00:00 /usr/sbin/rpc.mountd root 11812 10857 0 03:28 pts/2 00:00:00 grep --color=auto rpc
[root@localhost ~]# ps -ef | grep nfs root 11185 2 0 02:59 ? 00:00:00 [nfsd4_callbacks] root 11191 2 0 02:59 ? 00:00:00 [nfsd] root 11192 2 0 02:59 ? 00:00:00 [nfsd] root 11193 2 0 02:59 ? 00:00:00 [nfsd] root 11194 2 0 02:59 ? 00:00:00 [nfsd] root 11195 2 0 02:59 ? 00:00:00 [nfsd] root 11196 2 0 02:59 ? 00:00:00 [nfsd] root 11197 2 0 02:59 ? 00:00:00 [nfsd] root 11198 2 0 02:59 ? 00:00:00 [nfsd] root 11814 10857 0 03:30 pts/2 00:00:00 grep --color=auto nfs
NFS 服务的配置文件
NFS服务的默认配置文件路径 /etc/exportfs 并且默认是空的,需要用户自行配置。
/etc/exportfs 文件配置的格式:
NFS共享目录 NFS客户端地址1 (参数1,参数2,只读还是可写) NFS客户端地址2 (参数1,参数2,......)
参数说明:
NFS共享目录:是服务器端的本地目录,是我们想要共享给网络上其他主机使用的目录。假如我要共享的是/data/server目录,那么此选项可以就直接写/data/server
NFS客户端地址:客户端地址能够设置一个网段,也可以设置为单个主机,
参数:如读写权限(rw,同步更新sync,压缩来访账户all_squash,压缩后的匿名账号anonuid=uid,anongid=gid等等..)
生产环境常见配置实例:
配置实例1: /data/server 192.168.1.11(rw,sync)
###括号前不能有空格 rw表示可读写,sync表示同步更新到磁盘,同步将内存内的文件写入到磁盘空间,保证数据不丢失,但会影响性能。
配置实例2:/data/server 192.168.1.11/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
###生产环境中常用的一种配置,适合多客户端共享一个NFS目录。all_squash 也就是说不管客户端是以什么样的身份来进行访问的,都会被压缩成为all_squash后面所接的用户和群组身份。这边用anonuid、anongid编号来表示。
配置实例3:/data/server 192.168.1.11/24(ro)
###表示只能读权限
NFS权限设置
NFS配置权限设置,即/etc/exports文件配置格式中小括号()里的参数集。
rw 表示可读写
ro Read-only表示只能读权限
sync 写入数据时数据同步写入到NFS server的硬盘中后才会返回,数据安全不会丢失。
async 写入数据时先写到内存缓冲区,直到硬盘有空档时才会再写到磁盘,这样可以提升写入效率,但是如果服务器宕机,缓冲区的数据没来得及写入到磁盘,这些数据将会丢失。
no_root_squas 访问nfs server共享目录的用户如果是root的话,它对该目录具有root权限。这个配置原本为无盘用户准备的。(正常情况应避免使用!)
root_squash 对于访问NFS server共享目录的用户,如果是root的话会被压缩成为nobody用户身份。
all_squash 不管访问nfs server共享目录的用户身份如何包括root,它的权限都将被压缩成为匿名用户,同时他们的udi和gid都会变成nobody或nfsnobody账户的uid,gid。在多个nfs客户端同时读写nfs server数据时,这个参数很有用***可以确保大家写入的数据的权限是一样的。
但不同系统有可能匿名用户的uid,gid不同。因为此处我们需要服务端和客户端之间的用户是一样的。比如说:服务端指定匿名用户的UID为65534,那么客户端也一定要存在65534这个账号才可以
anonuid anonuid就是匿名的uid和gid。说明客户端以什么权限来访问服务端,在默认情况下是nfsnobody。uid65534.
anongid 同anongid,就是把uid换成gid而已。
客户端来访问的用户
客户端访问服务端默认是使用nfsnobody这个用户来进行访问的。uid和gid为65534。服务器默认共享时,也是加上了all_squash这个参数。
并制定anonuid为65534(也就是nfsnobayd用户)。当然如果系统中nfsnobody是其他的uid,那么就有可能造成访问权限出现问题。
所以最好我们可以通过一设置一个用户来访问,统一UID、GID。
查看客户端挂载情况
有两个重要的文件/var/lib/nfs/etab、/var/lib/nfs/rmtab这两个文件就能够查看服务器上共享了什么目录,到底有多少客户端挂载了共享,能查看到客户端挂载的具体信息。
1、/var/lib/nfs/etab这个文件能看到服务器上共享了哪些目录,执行哪些人可以使用,并且设定的参数为何。
2、/var/lib/nfs/rmtab这个文件就是能够查看到共享目录被挂载的情况。
NFS配置实例
实例:共享/data/server目录给192.168.1.11
[root@localhost ~]# mkdir -p /data/server #创建共享目录 [root@localhost ~]# ll -d /data/server drwxr-xr-x 2 root root 6 Mar 13 15:12 /data/server/ #注意现在共享的目录的权限为只有root才有写权限。 [root@localhost ~]# chown nfsnobody.nfsnobody /data/server/ #更改目录所属主和所属组。 [root@localhost ~]# ll -d /data/server drwxr-xr-x 2 nfsnobody nfsnobody 6 Mar 13 15:12 /data/server/ #现在nfsnobody用户有读写权限了。
添加NFS配置文件
[root@localhost ~]# cat /etc/exports # Shared /data/server directory to 192.168.1.11 /data/server 192.168.1.11(rw,sync) [root@localhost ~]# systemctl reload nfs #重新加载nfs [root@localhost ~]# showmount -e localhost #服务器本地确认是否共享正常 Export list for localhost: /data/server 192.168.1.11
权限说明:在配置文件中设置了权限rw。只表明了网络端的主机能够有权限去服务器端去写文件,但还需要通过服务器端的本地目录的权限。
并且客户端往服务端去写文件的用户身份是nfsnobody、nfsnobody UID=65534。那么也就是说客户端需要通过两层的权限来控制的。NFS配置文件—>共享目录文件的权限。
查看NFS服务的版本
服务器端 nfsstat -s | grep Server
[root@localhost server]# nfsstat -s | grep Server Server rpc stats: Server nfs v4: Server nfs v4 operations:
现在就是让客户端来进行挂载就可以了。
--------------------------------------------------------
NFS客户端
我这里客户端是CentOS6
NFS客户端只需要启动rpc服务即可。
关闭防火墙
[root@localhost ~]# /etc/init.d/iptables stop #关闭防火墙
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@localhost ~]# chkconfig iptables off #禁止防火墙开机启动
关闭SELinu
[root@localhost ~]# setenforce 0 #临时关闭
#修改配置文件 vim /etc/selinux/config
SELINUX=disabled
1.查看系统系信息
[root@localhost ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
2.检查系统是否安装了rpc
[root@localhost ~]# rpm -qa nfs-utils rpcbind
3.安装rpc
[root@localhost ~]# yum -y install nfs-utils rpcbind [root@localhost ~]# rpm -qa nfs-utils rpcbind #如果出现nfs和rpc开头的两个软件包,表示nfs已经安装好了 nfs-utils-1.2.3-78.el6_10.1.x86_64 rpcbind-0.2.0-16.el6.x86_64
4.启动rpc服务
在启动nfs服务前, 要先启动rpc
[root@localhost ~]# /etc/init.d/rpcbind start #启动rpc Starting rpcbind: [ OK ] [root@localhost ~]# chkconfig rpcbind on #将rpc加入开机启动那个 [root@localhost ~]# chkconfig --list | grep rpcbind #查看rpc是否加入开机启动 rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
查看是否启动成功
[root@localhost ~]# /etc/init.d/rpcbind status rpcbind (pid 2310) is running... [root@localhost ~]# netstat -anput | grep rpc tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2310/rpcbind tcp 0 0 :::111 :::* LISTEN 2310/rpcbind udp 0 0 0.0.0.0:111 0.0.0.0:* 2310/rpcbind udp 0 0 0.0.0.0:789 0.0.0.0:* 2310/rpcbind udp 0 0 :::111 :::* 2310/rpcbind udp 0 0 :::789 :::* 2310/rpcbind
[root@localhost ~]# rpcinfo -p localhost #查看nfs服务想rpc注册的端口信息,客户端只启动rpc服务即可。
[root@localhost ~]# rpcinfo -p localhost 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
NFS客户端挂载
查看服务器端的共享信息
[root@localhost ~]# showmount -e 192.168.1.21 Export list for 192.168.1.21: /data/server 192.168.1.11
挂载服务器共享出来的目录
[root@localhost ~]# mkdir /data/client # 要先创建挂载点 [root@localhost ~]# mount -t nfs 192.168.1.21:/data/server /data/client #把共享目录挂载到本地
#mount 命令格式如下:
mount -t 类型 device localedir(本地目录)
以上这个命令device=192.168.1.21:/data/server 类型为nfs
查看磁盘情况
[root@localhost ~]# df -TH Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root ext4 19G 831M 17G 5% / tmpfs tmpfs 523M 0 523M 0% /dev/shm /dev/sda1 ext4 500M 29M 445M 7% /boot 192.168.1.21:/data/server nfs 19G 1.2G 18G 7% /data/client
查看挂载情况
[root@localhost client]# mount -l /dev/mapper/VolGroup-lv_root on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) /dev/sda1 on /boot type ext4 (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) 192.168.1.21:/data/server on /data/client type nfs (rw,vers=4,addr=192.168.1.21,clientaddr=192.168.1.11)
查看更详细的挂载信息 cat /proc/mounts
[root@localhost client]# cat /proc/mounts rootfs / rootfs rw 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,relatime 0 0 devtmpfs /dev devtmpfs rw,relatime,size=499224k,nr_inodes=124806,mode=755 0 0 devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /dev/shm tmpfs rw,relatime 0 0 /dev/mapper/VolGroup-lv_root / ext4 rw,relatime,barrier=1,data=ordered 0 0 /proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0 /dev/sda1 /boot ext4 rw,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 192.168.1.21:/data/server /data/client nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.11,minorversion=0,local_lock=none,addr=192.168.1.21 0 0
测试
1.在nfs服务器端, 进入/data/server共享目录, 创建test-nfs.txt文件
[root@localhost server]# pwd /data/server [root@localhost server]# touch test-nfs.txt
2.在nfs客户端,进入/data/client挂载目录,创建test-nfs222.txt文件
[root@localhost client]# pwd /data/client [root@localhost client]# touch test-nfs222.txt [root@localhost client]# ls test-nfs222.txt test-nfs.txt [root@localhost client]# ll total 0 -rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 14 2019 test-nfs222.txt -rw-r--r-- 1 root root 0 Mar 14 2019 test-nfs.txt
test-nfs.txt 是在服务器端以root创建的,所以权限是root。
test-nfs222.txt 是在客户端以root创建的,但是文件的权限被压缩成nfsnobody用户了。
[root@localhost server]# cat /etc/exports # Shared /data/server directory to 192.168.1.11 /data/server 192.168.1.11(rw,sync) [root@localhost server]# showmount -e localhost Export list for localhost: /data/server 192.168.1.11 [root@localhost server]# cat /var/lib/nfs/etab /data/server 192.168.1.11(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
从/var/lib/nfs/etab 这个文件中我们可以看到, 在共享的时候即使我们只指定了rw和rsync这两参数, nfs也会默认有很多参数。其中就有all_squash,这个参数在客户端的作用就是不管你用什么用户创建的文件,都会被强制压缩成nfsnobody。
客户端NFS挂载参数
我们客户端挂载NFS也可以设置很多参数的,-o 后面的参数。
客户端挂载可以设置:不可执行、读写权限、断开后RPC呼叫方式、读写区块大小等。
一般来说当nfs服务器提供的只是普通数据(图片html,css,jss,视频等)应该不需要执行suid,exec等权限,
由于是共享目录不存在设备所以也不存在挂载设备dev,因此在客户端挂载的时候,可以加上给你这几个命令挂载。
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.1.21:/data/server /data/client
可使用挂载参数:
suid 允许设置suid
nosuid 不允许在共享文件系统中设置suid ,默认是suid
rw 读写权限
ro 只读
dev 保留设备文件的特殊功能
nodev 不保留(一般来说只有/dev才会有特殊的设备文件,因此可以选在nodev),默认是dev
exec 允许执行任何二进制文件
noexec 不允许在共享文件系统中直接执行任何二进制文件,默认是exec
user 允许用户拥有文件的挂载与卸载的功能
nouser 不允许用户拥有文件的挂载与卸载功能(如果要保护文件系统,最好不要为用户提供挂载与卸载的功能),默认是nouser
auto 这个auto指的是"mount -a"时会不会自动挂载的项目,
noauto 不自动挂载,默认是auto
针对一些高并发的情况,还有一些可以进行优化的参数:
fg
bg
当执行挂载时,该挂载行为是在前台(fg)还是在后台(bg)执行。若在前台执行,则mount会持续尝试链接,直到成功或time out为止。
若为在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的程序操作。
如果网络联机不稳定,或是服务器常常需要开关机。建议使用bg比较妥当。默认为fg
soft
hard
使用挂载时会使用RPC呼叫。如果是hard的情况,那么当两者之间有任何一台主机离线,那RPC会持续呼叫,直到对方恢复联机为止。
而soft,只是在RPC time out后重复呼叫。而非持续呼叫。因此系统的延迟会不这么明显,如果服务器经常开开关关的话,建议使用soft。
在生产环境中推荐使用hard,intr这样的方式来挂载。默认为hard
intr
当使用hard方式挂载时,若加上intr参数,则RPC的持续呼叫是可以被中断的
rsize
wsize
读出(rsize)和写入(wsize)的区块大小。这个设置值可以影响客户端与服务器端传输数据的缓冲存储容量。
一般来说,如果在局域网内(LAN),并且客户端与服务器都具有足够的内存,这个值可以设置大一点,比如说32768,提升缓冲区块将可提升NFS文件系统的传输能力。
但设置的值也不要太大,最好是实现网络能够传输的最大值为限。默认rsize=1024,wsize=1024
proto=udp
使用UDP协议来传输数据,在内网中会有较好的性能,但是在Internet的话,使用proto=tpc传输的数据会有较好的纠错能力。默认是proto=tcp
NFS客户端如何挂载才最佳
命令格式如下:
mount –t nfs –o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.21:/data/server /data/client
1) noexec,nosuid,nodev,因为共享存放的是简单资料,不需要suid位不需要执行,没有设备文件。
2) hard,intr,bg 当NFS链接断了之后会一直去监测服务端的NFS服务直到恢复之后重新连接。
3) rsize=32768 wsize=32768 调优NFS传输的区块大小。
4) 基本参数:rw 读写权限。
如何设置开机自动挂载
1.通过把 mount –t nfs 192.168.1.21:/data/server /data/client 这条命令写到/etc/rc.local中,让它开机就执行。
2.在/etc/fstab(系统开机启动分区加载项)添加我们的NFS配置:
192.168.1.21:/data/serve /data/client nfs defaults 1 1
但在生产环境中,对于共享的NFS目录,一般不会配置到/etc/fstab里。
因为在客户端主机重启时如果由于网络等原因连接不上nfs server时,就会导致客户机无法启动的厄运发生。
有两种方式实现开机自动挂载,但这里建议采用第一种,如果因为网络原因没有连接到NFSserver那么第二中有可能会导致系统无法启动的故障。
如果卸载时提示:"umount.nfs: /data/client: device is busy",需要退出挂载目录再进行卸载,如果NFS 服务器宕机了,则需要强制卸载,可执行命令:umount -lf /data/client
强制卸载:umount –lf /data/client
NFS客户端挂载优化:
1.有关系统安全挂载参数选项
在企业工作场景,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视烦),不需要执行suid、exec等权限,
挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性,例如:很多***篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的。
因此在挂载的时候,用下面的命令很有必要
mount -t nfs -o nosuid, noexec ,node, rw 10.0.0.7:/data /mnt
通过 mount -o 指定挂载参数与在 /etc/fstab里指定挂载参数的效果是一样的。网络文件系统和本地的文件系统效果也是一样的。
2.mount挂载性能优化参数选项
下面介绍几个在企业生产环境下,NFS性能优化挂载的例子
1)禁止更新目录及文件时间戳挂载,命令如下:
mount -t nfs -o noatime,nodiratime 10.0.0.7:/data /mnt
2)安全加优化的挂载方式如下
mount -t nfs -o nosud,noexec,node,noatime,noduratime,intr,rsize=131072,wsize=131072 10.0.0.7:/data /mnt
3)默认的挂载方式如下
mount -t nfs 10.0.0.7:/data /mnt
WSIZE和RSIZE的大小最好是1024的倍数,对于NFSv2来说,8192是RSIZE和 WSIZE的最大数值,如果使用的是NFSv3,则可以尝试设置32768,如果是NFSv4可以到65536或更大。
如果在客户端挂载时使用了这两个参数,可以让客户端在读取和写入数据时,一次性读写更多的数据包,这可以提升访问性能和效率。
除此之外,还有 noatime,mxtiratimc 性能优化选项,
这两个选项是说在读写磁盘的时候不更新文件和目录的时间戮(即不更新文件系统中文件对应 inode 信息),这样就可以减少和磁盘系统的交互,提升读取和写入磁盘的效率,
因为磁盘是机械的,每次读写都会消耗磁盘I/O,而更新文件时间戳对于工作数据必要性不大,最大问题是增加了访问磁I/O的次数,拖慢系统性能。
以下是NFS网络文件系统优化挂载的参数建议:
在CentOS6 x86_64服努器端和客户端环境下,可使用如下命令参数:
m
mount-t nf -o noatimc,nodiratime,nosuid,noexec,nodev,rsize=131072,wsize=131072 10.0.0.7:/data /mnt
经过实际测试,CentOS6 x86_64默认的挂载参数性能还是不错的。
mount -t nfs 10.0.0.7:/data /mnt
注意:非性能的参数越多,速度可能会越慢。根据具体的业务需要以及实际测试效果选择挂载参数。
3.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
4.企业生产场景NFS共享存储优化小结
硬件:sas/ssd磁盘,买多块, raid0/raid10。网卡吞吐量要大,至少干兆(多块bond)。
NFS服务端配置:/data 10.0.0.7(rw,sync,all_squash,anonuid=65534,anongid=65534)
NFS客户端挂载优化配置命令:
mount -t nfs -o nosuid,noexec,nodev,noatmme,nodiratime,rsize=131072,wsize=131072 10.0.0.7:/data /mnt #兼顾安全性能
大型网站NFS网络文件系统的替代软件为 分布式文件系统Moosefs(mfs)、GlusterFS、FastDFS。
NFS优缺点
NFS优点:
1、简单容易掌握
2、方便快速部署简单维护容易
3、从软件层面上看,数据可靠性高,稳定性强。
NFS局限:
1、局限性是存在单点故障,如果NFSserver宕机了所有客户端都不能访问共享目录,#####我们可以通过rsync来进行数据的同步。或者是通过负载均衡的高可用方案。######
2、在高并发的场合,NFS效率性能有限(一般几千万以下pv的网站不是瓶颈,除非网站架构太差。)
3、服务器共享文件的客户端认证是基于IP和主机名的安全性一般(但用于内网则问题不大)
4、NFS数据是明文的,对数据完整性不做验证(一般是存放于内网,提供内网的服务器使用。所以安全性相对不是一个问题)
5、多机器挂载服务器时,连接管理维护麻烦。尤其NFS服务端出问题后,所有客户端都挂掉状态(可使用autofs自动挂载解决。)
生产应用场景
中小型网站(2000万pv以下)线上应用,都有用武之地。门户网站也会有其他方面的应用,
因为门户网站的并发量是超级的大。所以有更加会用专业的存储来做这件事情。
-------------------------------完结-----------------------------------
参考书籍:《跟老男孩学linux运维 Web集群实战》
参考博文:https://blog.51cto.com/atong/1343950