NFS

一、NFS简介
NFS(Network FileSystem)网络文件系统
主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似,只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站,会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS,Moosefs(mfs),GlusterFS,FastDFS。
1、NFS存储优点
NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。
2、NFS存储局限
存在单点故障, 如果构建高可用维护麻烦。
NFS数据明文, 并不对数据做任何校验。
客户端挂载无需账户密码,安全性一般(内网使用)
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服务
 
二、安装 NFS
CentOS 7.X版本安装 :
1、关闭Firewalld防火墙
# systemctl disablefirewalld
# systemctl stopfirewalld
2、关闭selinux
# sed -ri'#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
# setenforce 0
3、安装NFS:
# yum -y installnfs-utils
 
三、配置NFS服务器
NFS服务程序的配置文件为/etc/exports默认该文件里没有任何内容。
按照共享目录的路径允许访问的NFS客户端(共享权限参数)格式,定义要共享的目录与相应的权限。
如果想要把/data目录共享给172.16.1.0/24网段内的所有主机
##主机都拥有读写权限
##在将数据写入到NFS服务器的硬盘中后才会结束操作,最大限度保证数据不丢失
##将所有用户映射为本地的匿名用户(nfsnobody)
exports配置文件格式
# vim /etc/exports 
/data   172.16.1.0/24(rw,sync,all_squash)
#/etc/init.d/nfsreload
注意: NFS客户端地址与权限之间没有空格
第一部分:/data            --指定共享目录信息
第二部分:172.16.1.0/24  --指定了一个网段信息,表示允许指定的网段主机挂载到我本地的共享目录上
第三部分:(rw,sync)       --表示定义共享参数信息,
     rw   表示读写,对共享目录设置的权限
     sync  同步,数据会先写入到NFS服务器内存中,会立刻同步到磁盘里面
在NFS服务器上建立用于NFS文件共享的目录,并设置对应权限
# mkdir /data
# chown -Rnfsnobody.nfsnobody /data
NFS共享目录会记录至/var/lib/nfs/etab,如果该目录不存在共享信息,请检查/etc/exports是否配置错误
4、启动服务
在使用NFS服务进行文件共享之前,需要使用RPC(RemoteProcedure Call远程过程调用, 服务将NFS服务器的IP地址和端口号信息发送给客户端。
因此,在启动NFS服务之前,需要先重启并启用rpcbind服务程序,同时都加入开机自启动
先启动rpcbind  再启动nfs-server 顺序不能颠倒
# systemctl restartrpcbind
# systemctl restartnfs-server
# systemctl enablerpcbind
# systemctl enablenfs-server
5、检查服务
检查端口
# netstat -lntp
Active Internetconnections (only servers)
Proto Recv-Q Send-QLocal Address      Foreign Address    State      PID/Program name                 
tcp        0     0 0.0.0.0:2049           0.0.0.0:*     LISTEN      -                    
tcp        0     0 0.0.0.0:111            0.0.0.0:*     LISTEN      653/rpcbind
检查共享的内容
NFS服务开启后,默认的参数文件位置,注意:修改此文件,对nfs服务没有任何影响
# cat/var/lib/nfs/etab 
/data172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,all_squash)
检查匿名用户对应的真实账户,并授权共享目录为nfsnobody
# grep"65534" /etc/passwd
nfsnobody:x:65534:65534:AnonymousNFS User:/var/lib/nfs:/sbin/nologin
 
四、客户端配置
客户端只启动rpcbind服务
NFS客户端的配置步骤先使用showmount -e查看远程服务器rpc提供的可挂载nfs信息
其输出格式为“共享的目录名称允许使用客户端地址”。
客户端创建一个挂载目录,使用mount命令并结合-t参数, 指定要挂载的文件系统的类型
说明:如果nfs软件不安装、无法使用showmount 命令、客户端无法识别nfs 文件系统类型。
# yum install nfs-utils-y
# systemctl enablerpcbind
# systemctl startrpcbind
使用showmount-e查看远程服务器rpc提供的可挂载nfs信息 showmount使用,需要安装nfs-utils软件
showmount -e172.16.1.31
Export list for172.16.1.31:
/data 172.16.1.0/24
在NFS客户端创建一个挂载目录,使用mount命令并结合-t参数, 指定要挂载的文件系统的类型, 并在命令后面写上服务器的IP地址, 以及服务器上的共享目录,最后需要写上要挂载到本地系统(客户端)的目录。
# mkdir /data
# mount -t nfs172.16.1.31:/data /data/
# df -h
文件系统                 容量  已用  可用已用% 挂载点
172.16.1.31:/data         50G 2.6G   48G    6% /data
测试客户端
使用客户端往nfs存储写入
# echo "123"> /data/test
检查nfs服务端是否存在客户端创建的新文件
# cat /data/test.txt
如果希望NFS文件共享服务能一直有效,则需要将其写入到fstab文件中
# vim /etc/fstab
172.16.1.31:/data /datanfs defaults 0 0
如果不希望使用NFS共享, 可进行卸载umount
# umount /nfsdir
注意:卸载的时候如果提示”umount.nfs:/nfsdir: device is busy”
切换至其他目录, 然后在进行卸载。
NFS Server宕机,强制卸载umount -lf /nfsdir
 
五、NFS参数详解
NFS配置文件
执行manexports命令,然后切换到文件结尾,可以快速查看如下样例格式:
访问权限选项:
 设置输出目录只读:ro
 设置输出目录读写:rw
用户映射选项:
  all_squash:   将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
  no_all_squash: 与all_squash取反(默认设置);
  root_squash:  将root用户及所属组都映射为匿名用户或用户组(默认设置);
  no_root_squash:与rootsquash取反;
  anonuid=xxx:  将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
  anongid=xxx:  将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其它选项
 secure:   限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
 insecure: 允许客户端从大于1024的tcp/ip端口连接服务器;
 sync:     将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
 async:    将数据先保存在内存缓冲区中,必要时才写入磁盘;
 wdelay:   检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
 no_wdelay: 若有写操作则立即执行,应与sync配合使用;
 subtree:  若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
 no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
关于权限的分析
1. 客户端连接时候,对普通用户的检查
  a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;
 b. 如果NFSserver上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;
 c.如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody;
2. 客户端连接的时候,对root的检查
 a.如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;
 b.如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;
 c.如果没有明确指定,此时root用户被压缩为nfsnobody;
 d.如果同时指定no_root_squash与all_squash 用户将被压缩为nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组;
NFS内核优化:
/proc/sys/net/core/rmem_default        指定了接收套接字缓冲区大小的默认值  默认设置:124928
/proc/sys/net/core/rmem_max                指定了接收套接缓冲区大小的最大值默认设置:124928
/proc/sys/net/core/wmem_deault        指定了发送套接缓冲区大小的默认值  默认设置:124928
/proc/sys/net/core/wmem_max                指定了发送套接缓冲区大小的最大值  默认设置:124928
具体内核优化命令为:
cat >>/etc/sysctl.conf << EOF
net.core.wmem.default=8388608
net.core.rmem.default=8388608
net.core.wmem_max=16777216
net.core.rmem_max=16777216
EOF
sysctl -p