NFS概述-配置NFS服务器
1、NFS服务端概述:
NFS,是Network File System的简写,即网络文件系统。nfs主要是linux系统之间使用,samba是liunx与windows之间共享存储, NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,如图 4-18 所示。
图 4-18 NFS网络文件系统拓扑图
2、NFS工作原理
2.2什么是RPC,(Remote Procedure Call)
因为NFS支持的功能相当多,而不同的功能都会使用不同的进程来启动,每启动一个进程就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,它会随机取用一些未被使用的端口来作为传输之用,CentOS6.x以上版本的随机端口都是较大的
因为端口不固定,这样一来就会造成NFS客户端与NFS服务端的通信障碍,因为NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信,才能交互数据。要解决上面的困扰,就需要通过远程过程调用RPC服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的。这个RPC服务类似NFS服务端和NFS客户端之间的一个中介,流程如下图所示
Rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器:
Rpc.mount:主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。
它会读取NFS的配置文件/etc/exports来对比客户端权限
Portmap:主要功能是进行端口映射工作
2.3.NFS实现原理:
1.用户进程访问NFS客户瑞,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP的方式传递给NFS服务揣。
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
6.idmap进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
注意:rpc是一个远程过程调用,那么使用nfs必须有rpc服务
3、安装NFS:
[root@exrcise1 ~]# yum -y install nfs-utils rpcbind(portmap是centos5的讲法) #使用Yum安装NFS。
3.1.启动rpc服务
[root@exrcise1 ~]# systemctl start rpcbind #启动rpcbind 。
[root@exrcise1 ~]# systemctl enable rpcbind
3.2.检查rpc服务状态
[root@exrcise1 ~]# 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
3.3.启动NFS服务
[root@exrcise1 ~]# systemctl start nfs #启动NFS。
[root@exrcise1 ~]# systemctl enable nfs #设置NFS开机自动启动。
[root@exrcise1 ~]# rpcinfo -p
[root@exrcise1 ~]# netstat -antpu | grep 2049 #再次查看端口监听状态
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 :::2049 :::* LISTEN +
3.4.修改配置文件
[root@exrcise1 ~]# cat /etc/exports #NFS的主配置文件(一开始为空文件)。
[root@exrcise1 ~]# vim /etc/exports
/opt/nfstest 192.168.245.*(rw)
表示共享的目录 开放网段,*代表所有网段 (rw)表示访问权限。
#网段地址与权限之间没有空格
[root@exrcise1 ~]# systemctl restart nfs #修改配置文件后重启服务
3.5.显示服务端可配置项
语法: showmount -e NFS服务器IP
[root@exrcise1 ~]# which showmount
/usr/sbin/showmount
[root@exrcise1 ~]# rpm -qf /usr/sbin/showmount
nfs-utils-1.3.0-0.68.el7.2.x86_64
[root@exrcise1 ~]# showmount -e 192.168.245.130
Export list for 192.168.245.130:
/opt/nfstest 192.168.245.*
3.6.客户端挂载方法:
mount -t nfs nfs服务端IP:/路径/ /本地路径
挂载NFS服务的共享设备:
[root@exrcise2 ~]# mount -t nfs 192.168.245.130:/opt/nfstest/ /opt/
[root@exrcise2 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.7G 4.0G 5.2G 44% /
tmpfs 996M 80K 996M 1% /dev/shm
/dev/sda1 485M 39M 421M 9% /boot
/dev/sr0 3.7G 3.7G 0 100% /mnt
192.168.245.130:/opt/nfstest/ 9.7G 4.0G 5.3G 43% /opt
3.7.实现开机自动挂载NFS服务共享设备:
[root@exrcise2 ~]# vim /etc/fstab
192.168.245.130:/opt/nfstest /opt/web1 nfs defaults 0 0
3.8.验证写入权限:
[root@exrcise2 ~]# touch /opt/a.txt #在NFS共享设备上创建文件。
touch: 无法创建"/opt/a.txt": 权限不够
3.9.解决方法:
设置访问权限一般包含2部分
(1) 服务本身权限
(2) 目录访问权限
nfs默认使用nfsnobody用户,需要安装nfs才有的
[root@master opt]# grep nfs /etc/passwd
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
10. 修改权限
[root@exrcise1 ~]# chmod 777 -R /opt/nfstest/ #生产上一般不允许这样操作
或
[root@exrcise1 ~]# chown nfsnobody.nfsnobody -R /opt/nfstest/
11. 再次验证写入权限:
[root@exrcise2 ~]# touch /opt/a.txt
[root@exrcise2 ~]# ll !$
ll /opt/a.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 5月 24 2016 /opt/a.txt
实例1:常见报错
[root@exercise2 ~]# mount -t nfs 192.168.245.130:/opt/nfstest /opt
mount: 文件系统类型错误、选项错误、192.168.245.130:/opt/nfstest 上有坏超级块、
缺少代码页或助手程序,或其他错误
(对某些文件系统(如 nfs、cifs) 您可能需要
一款 /sbin/mount.<类型> 助手程序)
有些情况下在 syslog 中可以找到一些有用信息- 请尝试
dmesg | tail 这样的命令看看。
原因:主要还是因为没有安装nfs才导致系统无法识别-t nfs
解决方案:yum install -y nfs-utils
4.服务端共享参数
ro | 只读 |
---|---|
rw | 读写 |
sync | 同步读写,资料同步写入到内存与硬盘当中 |
async | 异步读写,资料会先暂存于内存当中,再隔段时间写入硬盘,这样可以应对更高的访问量,但有可能会丢失数据 |
root_squash | 客户端,root用户访问,映射成如nfsnobody用户的权限。(默认) |
no_root_squash | 客户端,root用户访问,映射成nfs服务器的root用户权限。 |
all_squash | 无论什么用户访问,都会映射成nfsnobody用户的权限。(常用) |
no_all_squash | 无论什么普通用户访问,都不会映射成nfsnobody用户的权限(默认) |
anonuid | 配置all_squash使用,指定NFS的用户UID,但必须存在系统里 |
anongid | 配置all_squash使用,指定NFS的用户GID,但必须存在系统里 |
4.1.NFS支持动态装载配置文件:
[root@exrcise1 ~]# systemctl reload nfs
相当于
[root@exrcise1 ~]# exportfs -rv #重新读取配置文件不中断服务。
[root@exrcise1 ~]# man exports #查看帮助手册
4.2.查看默认挂载参数
[root@exrcise1 opt]# cat /var/lib/nfs/etab
/opt/nfstest 192.168.245.*(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)
例1:sync与async的区别
例2:root_squash与no_all_squash
注:所有访问者创建的文件所有者与所属组都是本身,一般配合rw只读
例3:all_squash
注:所有访问者创建的文件所有者与所属组都是nfsnobody,一般配合ro只读
例4:anonuid与anongid
[root@home3 web2]# useradd -u 888 -g 888 ljr
useradd:“888”组不存在
[root@home3 web2]# groupadd -g 888 ljr
[root@home3 web2]# useradd -u 888 -g 888 ljr
[root@home3 web2]# id ljr
uid=888(ljr) gid=888(ljr) 组=888(ljr)
[root@home3 web2]# ll
总用量 0
-rw-r--r-- 1 ljr ljr 0 8月 16 17:34 b1.txt
-rw-rw-r-- 1 ljr ljr 0 8月 16 17:34 b2.txt
-rw-r--r-- 1 ljr ljr 0 8月 16 17:36 b3.txt
4.3.NFS配置权限设置常用参数关系图解:
5.客户端挂载
5.1.查看默认挂载参数
[root@exrcise1 nfstest]# cat /proc/mounts
5.2.强制卸载
[root@exercise2 opt]# umount /opt
umount.nfs4: /opt: device is busy
[root@exercise2 opt]# umount -lf /opt
5.3.故障案例:
背景:因为一些原因(磁盘故障),整个磁盘(文件系统)变为只读,创建文件,提示Read-only file system
排查:查询具体哪个分区只读,排查出是分区只读
解决:mount -o rw,remount 分区
[root@exercise2 opt]# mount -o ro -t nfs 192.168.245.130:/opt/nfstest /opt
[root@exercise2 opt]# grep /opt /proc/mounts
192.168.245.130:/opt/nfstest /opt nfs4 **ro**,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.245.131,local_lock=none,addr=192.168.245.130 0 0
[root@exercise2 opt]# mount -o rw,remount /opt #以读写的形式重新挂载
[root@exercise2 opt]# grep /opt /proc/mounts
192.168.245.130:/opt/nfstest /opt nfs4 **rw**,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.245.131,local_lock=none,addr=192.168.245.130 0 0
6、NFS优缺点分析:
6.1、NFS优点:
1、简单容易掌握
2、方便快速部署简单维护容易
3、所有数据都能看得见
6.2、NFS缺点:
1、局限性是存在单点故障,多机器挂载服务器时,如果NFSserver宕机了所有客户端都不能访问共享目录,连接管理维护麻烦。
##### 我们可以通过rsync来进行数据的同步。或者是通过负载均衡的高可用方案。 ######
2、在高并发的场合,NFS 效率性能有限( 一般应用于千万级PV 以下 访问量。)
3、服务器共享文件的客户端认证是基于IP和主机名的 , 安全性一般(但用于内网则问题不大)
4、NFS数据是明文的,对数据完整性不做验证(一般是存放于内网,提供内网的服务器使用。所以安全性相对不是一个问题)
6.3、生产应用场景:
1.中小型网站(2000万pv以下)线上应用,都有用武之地。门户网站也会有其他方面的应用。
2.更加大型的并发访问量站点,需要更加高级的存储架构(nas,GlusterFS,HDFS),甚至专用的硬件存储设施(CDN机房)来配合完成。
3.可以将静态数据尽可以往前端推,减少后端存储压力,还可以将存储里的静态资源通过CDN缓存(jpg\png\mp4\avi\css\js)
7、nfs+autofs实现触发式共享文件
所谓触发挂载,简单来说就是用到的时候,就自动挂载,用不到的时候就不挂载。而且一般在自动挂载后5分钟不使用,将会自动卸载。触发挂载依赖于autofs服务,autofs是一个后台程序,当使用某文件时,自动支持该系统,不使用则不支持。
7.1、安装auto服务
[root@master2 opt]# yum install -y autofs
[root@master2 opt]# vim /etc/autofs.conf #查看主配置文件
#
# Define default options for autofs.
#
[ autofs ]
#
# master_map_name - default map name for the master map.
#
#master_map_name = auto.master
#
# timeout - set the default mount timeout in secons. The internal
# program default is 10 minutes, but the default installed
# configuration overrides this and sets the timeout to 5
# minutes to be consistent with earlier autofs releases.
#
timeout = 3 #此配置表示不使用挂载点后的3s就会卸载,默认是300s
。。。。。。。。
7.2、新建父目录
[root@master2 opt]# mkdir test
7.3、编辑/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
/opt/test /etc/auto.nfs #/opt/test为触发挂载的父目录,/etc/auto.nfs为要挂载的配置文件
7.4、新建自动触发挂载文件
[root@master2 test]# vim /etc/auto.nfs
autotest 192.168.245.204:/opt/nfstest # autotest 为触发挂载的子目录
7.5、重启服务
[root@master2 opt]# systemctl restart autofs
7.6、验证是否能自动挂载
[root@master2 opt]# cd test
[root@master2 test]# ll
总用量 0
[root@master2 test]# cd autotest
[root@master2 autotest]# ll
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 2月 15 14:34 a2.txt
root@master2 autotest]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 18G 1.1G 17G 6% /
devtmpfs 479M 0 479M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.7M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 197M 97M 100M 50% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /mnt
192.168.245.204:/opt/nfstest 18G 4.7G 14G 26% /opt/test/autotest
退出使用目录,等待3秒后
[root@master2 autotest]# cd /opt
[root@master2 opt]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 18G 1.1G 17G 6% /
devtmpfs 479M 0 479M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.7M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 197M 97M 100M 50% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /mnt
8.NFS客户端挂载优化(mount -o 参数)。
8.1.安全优化
suid,nosuid | 当挂载的文件系统上有任何SUID的程序时,可以使用nosuid取消SUID的功能 |
---|---|
rw,ro | 可以指定文件系统是只读或可写 |
exec,noexec | 是否具有执行文件的权限?一般选择noexec |
user,nouser | 是否允许用户进行文件系统的挂载与卸载功能?如果要保护文件系统,最好不要提供给用户这个功能 |
auto,noauto | 这个auto指的是“mount -a ”时会不会被挂载的项目,如果不需要这个分区随时被挂载,设置为noauto |
8.2.性能优化
async | 异步同步,此参数会提高I/O性能,但会降低数据安全(除非对性能要求很高,对数据可靠性不要求的场合。一般生产环境,不推荐使用)。 |
---|---|
noatime | 取消更新文件系统上的inode访问时间,提升I/O性能,优化I/O目的,推荐使用 |
nodiratime | 取消更新文件系统上的directory inode访问时间,高并发环境,推荐显式应用该选项,提高系统性能。 |
intr | 可以中断不成功的挂载。 |
rsize/wsize | 读取(rsize)/写入(wsize)的区块大小(block size),这个设置值可以影响客户端与服务端传输数据的缓冲存储量。一般来说,如果在局域网内,并且客户端与服务端都具有足够的内存,这个值可以设置大一点,比如说65535(bytes),提升缓冲区块将可提升NFS文件系统的传输能力。但设置的值也不要太大,最好是实现网络能够传输的最大值为限。 |
8.3.NFS内核优化建议
下面是优化选项说明。
/proc/sys/net/core/rmem_default:该文件指定了接收套接字缓冲区大小的默认值(以字节为单位),默认设置:124928。
/proc/sys/net/core/mem_max:该文件指定了接收套接字缓冲区大小的最大值(以字节为单位),默认设置:124928。
/proc/sys/net/core/wmem_default:该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928。
/proc/sys/net/core/wmem_max:该文件指定了发送套接字缓冲区大小的最大值(以字节为单位),默认设置:124928。
[root@exercise2 opt]# head /proc/sys/net/core/[rw]mem_{default,max}
> /proc/sys/net/core/rmem_default <
212992
> /proc/sys/net/core/wmem_default <
212992
> /proc/sys/net/core/rmem_max <
212992
> /proc/sys/net/core/wmem_max <
212992
上述文件对应的具体内核优化命令如下:
cat >>/etc/sysct1.conf<<EOF
net.core.wmem default =8388608
net.core.rmem default 8388608
net.core.rmem max 16777216
net.core.wmem max 16777216
EOF
挂载选项用法,如图 4-21 所示:
[root@exrcise2 ~]# mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072,intr 192.168.1.63:/opt/nfstest /opt
图 4-21 挂载选项用法
或者写到挂载文件/etc/fstab里:
192.168.1.63:/opt/nfstest /mnt nfs noatime,nodiratime,rsize=131072,wsize=131072,intr 0 0
t.core.wmem default =8388608
net.core.rmem default 8388608
net.core.rmem max 16777216
net.core.wmem max 16777216
EOF
挂载选项用法,如图 4-21 所示:
[root@exrcise2 ~]# mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072,intr 192.168.1.63:/opt/nfstest /opt
[外链图片转存中…(img-6VcBOtcb-1672671059337)]
图 4-21 挂载选项用法
或者写到挂载文件/etc/fstab里:
192.168.1.63:/opt/nfstest /mnt nfs noatime,nodiratime,rsize=131072,wsize=131072,intr 0 0