搭建nfs

服务器端和客户端都要安装: 
yum install nfs-utils rpcbind -y


启动RPC
[root@nfs01 ~]# systemctl start rpcbind.service 
[root@nfs01 ~]# systemctl enable rpcbind.service 
[root@nfs01 ~]# systemctl list-unit-files|grep rpcbind.service 

启动NFS
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl enable nfs
[root@nfs01 ~]# systemctl list-unit-files|grep nfs.service
[root@nfs01 ~]# netstat -lntup|egrep "rpc|nfs"

编辑配置文件
[root@nfs01 ~]# tail -1 /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)

#创建nfs的用户并授权给nfs目录
[root@nfs01 ~]# groupadd -g 65534 nfsnobody
[root@nfs01 ~]# useradd -u  65534 -g nfsnobody nfsnobody
[root@nfs01 ~]# mkdir -p /data
[root@nfs01 ~]# chown nfsnobody.nfsnobody /data

[root@nfs01 ~]# systemctl reload nfs #《==生产场景必须要实现平滑重启。
[root@nfs01 ~]# exportfs -r
上述二者等价,选一个即可。

[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24   #《==看到共享的目录了


挂载:
[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt

开机自启动挂载:

nfs服务的开机自启动不能放在/etc/fstab里面。原因是因为nfs是网络文件系统,而机器开机的时候先加载的是/etc/fstab文件,再加载的网卡,这样子网络没起来,就挂载不上nfs。

我们放进/etc/rc.local里面实现开机 自启动挂载。
把挂载的命令放入/etc/rc.local中,以实现开机自动挂载。命令如下:

[root@web01 mnt]# chmod +x /etc/rc.d/rc.local
[root@web01 mnt]# echo "/bin/mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
[root@web01 mnt]# tail -1 /etc/rc.local
/bin/mount -t nfs 172.16.1.31:/data /mnt

nfs的工作流程

  1. 先启动rpcbind服务

  2. 再启动nfs服务

  3. nfs向rpcbind服务注册启动的端口

  4. 客户端请求nfs服务先到rpcbind服务返回nfs的端口给到客户端

  5. 客户端拿着rpcbind服务给的nfs的端口请求传输数据

NFS网络文件系统

启动NFS服务,而且还有启动很多端口。

NFS功能,需要很多服务。每个服务都有端口,而且经常变化。

如何让客户端找到这些端口呢?就需要一个经纪人(rpc服务)

NFS服务涉及的服务:

1、NFS服务(有很多进程和端口),把自己的端口告诉RPC。

2、RPC服务(对外固定端口111)

客户端请求NFS服务,先找RPC 111,查到NFS的端口,发给客户。

nfs的权限

rw 可读写
ro 只读
sync 写到磁盘才算完成,安全 慢
async 异步写到远程缓冲区,快 不安全
no_root_squash NFS客户端使用共享目录的用户,如果是root 的话,所有的操作均在服务器端映射为root用户,拥有共享目录的root权限!
root_squash 在登入 NFS 主机export目录的使用者如果当root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 设置的uid和gid那个身份。
all_squash 不管客户端什么用户,到服务端都是匿名用户
anonuid 匿名用户的UID
anongid 匿名用户的GID

在生产中配置NFS的重要技巧

1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限

  1. all_squash把所有客户端都压缩成固定的匿名用户(UID相同)。

  2. 就是anonuid,anongid指定的UID和GID的用户。

2)所有的客户端和服务端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)

挂载时可加的参数

默认挂载

mount -t nfs 172.16.1.31:/data /data

详细挂载情况:

[root@web02 ~]# grep data /proc/mounts 
172.16.1.31:/data /data nfs4 rw,relatime,vers=4.1,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.8,local_lock=none,addr=172.16.1.31 0 0

mount -o的参数说明

async:涉及文件系统I/O的操作都是异步处理,即不会同步写到磁盘,此参数会提高性能,但会降低数据安全。一般情况,生产环境不推荐使用。除非对性能要求很高,对数据可靠性不要求的场合※。

sync:该参数和async相反。有I/O操作时,都会同步处理I/O,即把数据同步写入硬盘。此参数会牺牲一点I/O性能,但是,换来的是掉电后数据的安全性

dirsync:目录更新时同步写入磁盘。

atime:在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项。

noatime:访问文件时不更新文件的inode时间戳,高并发环境下,推荐显式应用该选项,可以提高系统I/O性能※。

nodiratime:不更新文件系统上的directory inode时间戳,高并发环境,推荐显式应用该选项,可以提高系统I/O性能※。

ro:以只读的方式挂载一个文件系统。

rw:以可写的方式挂载一个文件系统。※

auto:能够被自动挂载通过-a选项。

noauto:不会自动挂载文件系统。

defaults:这是fstab里第四列挂载参数的默认值,包括rw、suid、 dev、 exec、 auto、 nouser、 and async,默认情况大部分都是默认值。

exec:允许文件系统执行二进制文件,取消这个参数,可以提升系统安全。

noexec :在挂载的文件系统中不允许直接执行任何二进制的程序,注意,仅对二进制程序有效,即使设置了noexec、shell,php程序还是可以执行的※。

nosuid:不允许特殊权限suid和sgid位生效,提升安全※。

suid:允许suid和sgid位生效。

nouser:禁止一个普通用户挂载该文件系统,这是默认挂载时的默认选项。

remount:尝试重新挂载一个已经挂载了的文件系统,这通常被用来改变一个文件系统的挂载标志,从而使得一个只读文件系统变的可写,这个动作不会改变设备或者挂载点。当系统故障时进入single或rescue模式修复系统时,会发现根文件系统经常会变成只读文件系统,不允许修改,此时该命令就派上用场了。具体命令为:mount -o remount,rw /,表示将根文件系统重新挂载使得可写。single或rescue模式修复系统时这个命令十分重要※。

nfs客户端挂载优化

[root@web02 ~]# grep data /proc/mounts 
172.16.1.31:/data /data nfs4 rw,relatime,vers=4.1,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.8,local_lock=none,addr=172.16.1.31 0 0

以下是NFS网络文件系统优化挂载的参数建议。

在CentOS7.6 x86_64服务器端和客户端环境下,可使用如下命令参数:
mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rsize=524288,wsize=524288  172.16.1.31:/data  /mnt
#######
mount -t nfs -o noatime,nosuid,noexec 172.16.1.31:/data  /mnt
注意:非性能的参数越多,速度可能会越慢。

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

sysctl -p

results matching ""

    No results matching ""