搭建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的工作流程
先启动rpcbind服务
再启动nfs服务
nfs向rpcbind服务注册启动的端口
客户端请求nfs服务先到rpcbind服务返回nfs的端口给到客户端
客户端拿着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共享目录具备相同的用户访问权限
all_squash把所有客户端都压缩成固定的匿名用户(UID相同)。
就是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