NFS服务

概述

NFS(Network File System)即网络文件系统,在局域网内在操作系统间实现文件共享,使用mount命令将共享的文件系统挂载到指定挂载点,将NFS服务共享的文件系统作为本地文件系统使用。
NFS 服务软件包:1、rpcbind ( CentOS 5.x 之前为 portmap,CentOS 6.x 之后 rpcbind )
         2、nfs-utils (提供 rpc.nfsd 及 rpc.mountd 等进程,exportfs、showmount等命令)

NFS执行原理:

NFS客户端请求NFS服务时,首先通过客户端rpcbind服务向服务端rpcbind服务请求服务端NFS服务的相关信息,获得相关信息后,NFS客户端向NFS服务端发起服务请求请求。
NFS服务并没有提供数据传输的功能,而是通过使用RPC(Remote Procedure Call,远程过程调用)来实现。

NFS服务为什么要配合rpcbind服务使用?

一、NFS服务不同功能会启动不同进程,这些进程启用的端口号(tcp端口和udp端口)是随机的,而不是固定端口号。
二、当NFS客户端发起服务请求时,无法获得NFS服务端部分进程的端口号,因此NFS选用rpcbind服务(默认TCP端口111)传递建立连接所需的信息。

NFS服务执行过程:

1、启动rpcbind服务,rpcbind服务使用tcp端口111与其他主机的rpcbind服务进行通信
2、启动nfs服务,nfs服务会向rpcbind服务进行注册,并发送nfs服务端口等信息(因此rpcbind服务必须先于NFS服务启动)
3、nfs客户端需要连接nfs服务器时,客户端nfs服务通过客户端rpcbind服务,从服务端rpcbind服务获得服务端nfs服务相关端口信息
4、nfs客户端向nfs服务端发起服务请求,与nfs服务端建立连接(连接建立后,nfs服务使用RPC协议进行数据传输)

NFS服务配置文件为/etc/exports,默认为空;服务默认属主属组nfsnobody,nfsnobody

[root@nfs01 ~]$ vim /etc/exports
/data        172.16.1.0/24(rw,async, all_squash,anonuid=1033)      #括号中参数的作用分别为:可读写,数据写入先磁盘缓存再写入硬盘,限制客户端使用默认nfs用户执行操作,指定nfs默认用户的uid(默认uid为65534) 
#共享目录     允许使用共享目录主机的IP地址段及权限

参数: 

rw          可读写 read write
ro           只读 read only
sync           数据直接写到磁盘,不适用磁盘缓存,数据安全性高,读写速度较慢
async         数据先写入缓存,再由缓存写入硬盘,数据安全性较低,读写速度快
all_squash       不管客户端什么用户,到服务端都是nfsnobody #(squash 压制,抑制,限制)
anonuid       匿名用户的UID,nfs默认使用uid为65534的nfsnobody账户
anongid       匿名用户的GID,nfs默认使用uid为65534的nfsnobody账户组

rpm -qa nfs-utils rpcbind        #查看是否安装软件包
yum install -y nfs-utils rpcbind    #安装软件包nfs-utils rpcbind

[root@nfs01 ~]$ systemctl start rpcbind.service      #启动rpcbind服务
[root@nfs01 ~]$ systemctl enable rpcbind.service     #开机自启rpcbind服务

[root@nfs01 ~]$ rpcinfo -p       #查看nfs服务启动前的rpc服务信息
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

[root@nfs01 ~]$ systemctl start nfs      #启动nfs服务
[root@nfs01 ~]$ systemctl enable nfs     #开机自启nfs服务
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@nfs01 ~]$ rpcinfo -p           #查看nfs服务启动后的rpc服务信息
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 39420 status
100024 1 tcp 14790 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 36100 nlockmgr
100021 3 udp 36100 nlockmgr
100021 4 udp 36100 nlockmgr
100021 1 tcp 33406 nlockmgr
100021 3 tcp 33406 nlockmgr
100021 4 tcp 33406 nlockmgr

服务配置:

服务端:
[root@nfs01 ~]$ vim /etc/exports
/data 172.16.1.0/24(rw,sync)          #以可读写,同步写入方式将data目录挂载到172.16.1.0/24网段的主机上
[root@nfs01 ~]$ mkdir -p /data         #创建nfs服务目录
[root@nfs01 ~]$ chown -R nfsnobody.nfsnobody /data         #修改nfs服务目录属主属组为nfsnobody(nfs服务默认用户),也可使用自建账户,使用自建账户需各服务器

[root@nfs01 ~]# systemctl reload nfs     #nfs服务平滑重启
[root@nfs01 ~]$ exportfs -r          #重新读取NFS服务配置信息
#上两条命令作用相同,第一条服务重启会重启读取配置文件,第二条直接重新读取nfs配置文件

[root@nfs01 ~]$ showmount -e           #查看共享目录
Export list for nfs01:
/data 172.16.1.0/24

[root@nfs01 ~]$ cat /var/lib/nfs/etab     #挂载时详细配置参数文件
/data	172.16.1.0/24(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,ro,secure,root_squash,no_all_squash)
#以上为服务端挂载目录默认配置参数,配置文件/etc/exports中修改参数后,会同步到/var/lib/nfs/etab文件中。

客户端
[root@web01 ~]$ showmount -e 172.16.1.31              #查看nfs01的共享目录
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web01 ~]# mount -t nfs 172.24.184.31:/data /data      #将nfs共享目录挂载到/data目录下

[root@web01 ~]# cat /proc/mounts |grep nfs             #客户端挂载NFS文件系统的详细信息
nfsd /proc/fs/nfsd nfsd rw,relatime 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
172.24.184.31:/data /data nfs4 rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.24.184.41,local_lock=none,addr=172.24.184.31 0 0

 

客户端配置开机自启:

方法一:编辑/etc/rc.local,CentOS 7中需给/etc/rc.d/rc.local文件添加x权限
[root@web01 ~]$ ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 8月 2 15:53 /etc/rc.local -> rc.d/rc.local

[root@web01 ~]$ tail -1 /etc/rc.d/rc.local
/usr/bin/mount -t nfs 172.16.1.31:/data /data     #在脚本或配置文件中使用命令的全路径格式
[root@web01 ~]$ chmod +x /etc/rc.d/rc.local       #CentOS 7.X中,/etc/rc.d/rc.local文件默认无x权限,使用时需为其添加x权限

方法二:编辑/etc/fstab,
[root@web01 ~]$ tail -3 /etc/fstab 
172.16.1.31:/data	/data	nfs	defaults,soft 0 0         #soft使得客户端与服务端连接超时(105s)后,停止连接
172.16.1.31:/data	/data	nfs	defaults,intr 0 0         #intr使得hard在连接超时(105s)后停止连接
172.16.1.31:/data	/data	nfs	defaults,hard,intr 0 0      #intr使得hard在连接超时(90s))后停止连接
#/etc/fstab 中,defaults包括 rw、suid、dev、exec、auto、nouser and async

NFS为网络文件系统,系统启动时读取/etc/fstab配置文件在网络服务启动之前,因此需其他服务(C6:netfs C7:remote-fs.target)配合才可通过/etc/fstab实现开机自启。

systemctl start remote-fs.target          #启动remote-fs.target
systemctl enable remote-fs.target          #开机自启remote-fs.target
systemctl status remote-fs.target

NFS服务默认用户修改:

1、在NFS服务端及所有客户端创建具有相同uid的相同账户

useradd -s /sbin/nologin -u 1033  -M   nfstest               #添加nfstest用户,uid=1033,shell为/sbin/nologin,不为用户创建家目录

2、nfs服务端配置文件

[root@nfs01 ~]# cat /etc/exports
/data 172.24.184.0/24(rw,async,anonuid=1033,anongid=1033)     #anonuid指定nfs默认账户的uid,anongid指定nfs默认账户的gid,若只指定uid,gid将使用nfs服务默认gid(65534)

3、nfs服务共享目录属主属组修改

root@nfs01 ~]# chown -R nfstest.nfstest /data             #-R递归修改/data目录属主属组

NFS服务优化

客户端挂载优化:

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

客户端卸载共享目录

1、提示“umount.nfs4: /data: device is busy”,需要退出挂载目录再进行卸载
2、nfs服务端宕机时,使用umount -lf /data 强制卸载


NFS服务端内核优化:

cat>>/etc/sysctl.conf<<eof
net.core.wmem_default = 8388608 
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
eof

linux修改内核参数后,需执行  sysctl -p  使修改生效

君子务本,本立而道生
原文地址:https://www.cnblogs.com/00huajiang/p/11362799.html