本文讲解在 CentOS 5.x、CentOS 6.x 和 CentOS 7.x 环境下,如何安装与部署 NFS 服务。
注意:一台机器不要同时做 NFS 的服务端和 NFS 的客户端。如果同时作了 NFS 的服务端和客户端,那么在关机的时候,会一直夯住,可能十分钟之后甚至更久才能关闭成功。
NFS 工作原理简介
启动 NFS SERVER 之前,首先要启动 RPC 服务(CentOS 5.x 下为 portmap 服务,CentOS 6.x 和 CentOS 7.x 下为 rpcbind 服务,下同),否则 NFS SERVER 就无法向 RPC 服务注册了。
另外,如果 RPC 服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时 RPC 服务管理的NFS程序也需要重新启动以重新向RPC注册。
要特别注意的是:一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行 /etc/init.d/nfs reload 「针对CentOS 5.x 或 CentOS 6.x」 或 systemctl reload nfs.service 「针对CentOS 7.x」 或 exportfs -rv 即可使修改的 /etc/exports 生效。
NFS 服务所需的安装包
安装 NFS 和 RPC 「服务端、客户端都安装」
1 | [root@backup ~]# rpm -qa nfs-utils rpcbind |
查看用户信息
1 | [root@nfs01 ~]# tail /etc/passwd |
NFS 版本查看
服务端版本查看
1 | nfsstat -s |
客户端版本查看
1 | nfsstat -c |
NFS服务端搭建
配置exports
1 | [root@nfs01 ~]# mkdir /data |
其他配置示例:
1 | # 指定 IP 配置 |
启动rpcbind服务
CentOS 5.x 和 CentOS 6.x 启动方式
1 | [root@nfs01 ~]# /etc/init.d/rpcbind start |
CentOS 7.x 启动方式
1 | [root@nginx_cdn ~]# systemctl start rpcbind.service |
启动NFS
CentOS 5.x 和 CentOS 6.x 启动方式
1 | [root@nfs01 ~]# /etc/init.d/nfs start |
CentOS 7.x 启动方式
1 | [root@nginx_cdn ~]# systemctl start nfs.service |
加入开始自启动
CentOS 5.x 和 CentOS 6.x 环境
使用 /etc/rc.local
1 | [root@nfs01 ~]# tail /etc/rc.local |
使用chkconfig
1 | [root@nfs01 ~]# chkconfig rpcbind on |
查看rpc服务和NFS服务的开机启动顺序
1 | [root@nfs01 ~]# head /etc/init.d/rpcbind |
CentOS 7.x 环境
1 | [root@nginx_cdn ~]# systemctl enable rpcbind.service |
查看具体状态情况
1 | [root@nginx_cdn ~]# systemctl status rpcbind.service |
查看有哪些参数生效
1 | [root@nfs01 ~]# cat /var/lib/nfs/etab |
参数说明:
ro:只读设置,这样 NFS 客户端只能读、不能写(默认设置);
rw:读写设置,NFS 客户端可读写;
sync:将数据同步写入磁盘中,效率低,但可以保证数据的一致性(默认设置);
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;如果服务器重新启动,这种行为可能会导致数据损坏,但效率高;
root_squash:当客户端用 root 用户访问该共享文件夹时,将 root 用户映射成匿名用户(默认设置);
no_root_squash:客户端的 root 用户不映射。这样客户端的 root 用户与服务端的 root 用户具有相同的访问权限,这可能会带来严重的安全影响。没有充分的理由,不应该指定此选项;
all_squash:客户端所有普通用户及所属组都映射为匿名用户及匿名用户组;「推荐设置」
no_all_squash:客户端所有普通用户及所属组不映射(默认设置);
subtree_check:如果共享,如:/usr/bin之类的子目录时,强制NFS检查父目录的权限;
no_subtree_check:即使共享 NFS 服务端的子目录时,nfs服务端也不检查其父目录的权限,这样可以提高效率(默认设置);
secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,当使用async时,无需此设置;
anonuid=xxx:将远程访问的所有用户主都映射为匿名用户主账户,并指定该匿名用户主为本地用户主(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组为本地用户组(GID=xxx);
检查是否成功
1 | [root@nfs01 ~]# showmount -e 172.16.1.31 # 其中 172.16.1.31 为 NFS 服务端IP |
NFS客户端配置
启动rpcbind服务
CentOS 5.x 和 CentOS 6.x 环境
1 | [root@web01 ~]# /etc/init.d/rpcbind start |
CentOS 7.x 环境
1 | [root@nginx_proxy01 ~]# systemctl start rpcbind.service |
检查共享信息
1 | [root@web01 ~]# showmount -e 172.16.1.31 |
NFS挂载
在2台机器都挂载 NFS,好用于后面的测试。
1 | [root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt |
查看挂载信息
查询方式1
1 | [root@web01 ~]# df -h #有时可能会被卡主 |
查询方式2
1 | [root@web01 ~]# cat /proc/mounts # 优先使用,监控时使用该命令 |
测试
在客户端和服务端之间测试
「2个客户端,1个服务端」
1、任意客户端创建文件夹或创建文件并且输入数据,在服务端是否可以查看;
2、服务端创建文件夹或创建文件并且输入数据,在任意客户端是否可以查看;
3、在客户端A 删除客户端B 创建的文件
4、在客户端B 删除客户端A 创建的文件
加入开机自启动
如果是 CentOS 7 环境,那么必须保证 /etc/rc.d/rc.local 文件具有可执行权限,否则该脚本不会执行也不会生效。
开机自启动方式1
1 | [root@web01 mnt]$ ll /etc/rc.local |
开机自启动方式2
1 | [root@web01 mnt]$ cat /etc/fstab |
存在问题
加入了开机自启动,当重启 NFS 客户端机器时,如果此时 NFS 服务端机器已关机,或者网络存在问题等等。使 NFS 客户端连接 NFS 服务端失败,那么此时会造成 NFS 客户端机器起不来的情况。
因此为了避免该情况发生,不建议机器开机自启动就挂载 NFS。
如果一台机器必须挂载 NFS,那么我们就做好监控。当该机器未挂载 NFS 时就告警给我们,然后我们去手动挂载。
当然如果实际环境中你们的 NFS 服务极其稳定,且几乎不再改变 NFS 服务端地址,那么此时你也可以加入开机自启动。
这些都是根据实际具体情况具体分析的。