【Linux】部署NFS服务实现数据共享 ‍博主简介CSDN博客专家云计算领域优质创作者华为云开发者社区专家博主阿里云开发者社区专家博主交流社区运维交流社区 欢迎大家的加入 希望大家多多支持我们一起进步如果文章对你有帮助的话欢迎 点赞 评论 收藏 ⭐️ 加关注文章目录一、NFS简介与RPC简介1. NFS服务简介2. RPC协议简介3. NFS工作流程二、准备工作2.1 服务器信息2.2 防火墙配置2.3 selinux沙盒三、部署并启动 NFS 和 RPC 服务四、服务端配置共享目录五、客户端挂载共享目录及配置永久挂载5.1 查看NFS服务共享信息5.2 创建目录并进行临时挂载测试5.3 永久挂载5.4 取消挂载5.4.1 临时取消挂载5.4.2 永久取消挂载一、NFS简介与RPC简介1. NFS服务简介NFS是一种网络协议NFS依赖RPC才能工作。RHEL5.0上是NFS V3而RHEL6.0上是NFS V4NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”它是独立于操作系统容许不同硬件及操作系统的系统共同进行文件的分享。NFS在文件传送或信息传送过程中依赖于RPC协议。RPC远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的但NFS却能让我们通过网络进行资料的分享这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以这么理解RPC和NFS的关系NFS是一个文件系统而RPC是负责信息的传输。2. RPC协议简介RPCRemote Procedure Call远程过程调用它是一种通过网络从远程计算机程序上请求服务而不需要了解底层网络技术的协议。其工作在TCP/UDP的111端口。建立在Socket之上的主要是简化编程的工作在底层提供网络之间的通信。RPC采用客户机/服务器模式。请求程序就是一个客户机而服务提供程序就是一个服务器。首先客户机调用进程发送一个有进程参数的调用信息到服务进程然后等待应答信息。在服务器端进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达服务器获得进程参数计算结果发送答复信息然后等待下一个调用信息最后客户端调用进程接收答复信息获得进程结果然后调用执行继续进行。RPC远程过程调度NFS 协议本身并没有网络传输功能而是基于远程过程调用协议实现的提供一个面向过程的远程服务的接口可以通过网络从远程主机程序上请求服务而不需要了解底层网络技术的协议工作在 OSI 模型的会话层它可以为遵从 RPC 协议应用层协议提供端口注册功能事实上有很多服务NFS 和 NIS 等都可以向 RPC 注册端口RPC 使用网络端口 111 来监听客户端的请求3. NFS工作流程1.首先服务器端启动RPC服务并开启111端口2.然后还需要服务器端启动NFS服务并向RPC注册端口信息3.客户端启动RPCportmap服务向服务端的RPC(portmap)服务请求服务端的NFS端口4.服务端的RPC(portmap)服务反馈NFS端口信息给客户端。5.客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。挂载原理当我们在NFS服务器设置好一个共享目录/opt 后其他人是有权访问/opt这个共享目录的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点这个挂载点可以自己定义路径不同也可以如下图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/opt下的所有数据。二、准备工作2.1 服务器信息主机操作系统IP服务端口服务端centos172.16.11.201nfs、rpc2049、111客户端centos172.16.11.202nfs、rpc2049、1112.2 防火墙配置关闭防火墙服务# 关闭防火墙systemctl stop firewalld# 禁止防火墙开机自启systemctl disable firewalld如果是必须要开启防火墙可以使用两种方法开端口或服务# 开启nfs和rpc服务firewall-cmd--permanent--add-servicenfs firewall-cmd--permanent--add-servicerpc-bind# 重载防火墙规则firewall-cmd--reload# 放行端口# nfs端口为2049、rpc端口为111firewall-cmd--permanent--add-port2049/tcp firewall-cmd--permanent--add-port111/tcp firewall-cmd--permanent--add-port111/udp# 重载防火墙规则firewall-cmd--reload如果使用的是iptables防火墙可以使用以下命令iptables-AINPUT-ptcp--dport2049-jACCEPT iptables-AINPUT-ptcp--dport111-jACCEPT iptables-AINPUT-pudp--dport111-jACCEPT iptables-save/etc/sysconfig/iptables2.3 selinux沙盒# 临时关闭setenforce0# 永久关闭vim/etc/selinux/config# 将selinux修改为disabled修改配置文件永久生效要重启服务器三、部署并启动 NFS 和 RPC 服务两台都安装nfs-utils为 nfs 服务端、rpcbind为 nfs 客户端# yumyuminstall-ynfs-utils rpcbind# aptaptinstall-ynfs-kernel-server启动 nfs 服务并配置开机自启所有节点systemctlenable--nownfs查看服务状态systemctl status nfs systemctl status rpcbind四、服务端配置共享目录安装完成之后 nfs 会自动创建一个系统程序用户nfsnobody可使用命令cat /etc/passwd查看创建需要作为共享目录的目录并给nfs权限注意磁盘空间占用主节点创建即可# 创建一个需要共享的共享目录mkdir-p/data/nfs# 给此目录nfs用户权限chown-Rnfsnobody:nfsnobody /data/nfs配置共享目录/etc/exports定义哪些地址可以访问主节点配置NFS配置文件格式共享目录 [客户端1(参数)] [客户端2参数]共享目录NFS服务器需要共享的实际路径绝对路径客户端可以访问共享目录的服务器地址或网段。vim/etc/exports# 添加以下内容# 共享目录 允许访问的网段或IP(权限参数)# 示例允许 172.16.11.0/24 网段的所有机器以读写(rw)方式访问也可以采用ip方式/data/nfs172.16.11.0/24(rw,sync,no_subtree_check,no_root_squash)参数说明参数含义rw读写权限sync同步写入保证数据安全no_subtree_check禁用子树检查提升性能no_root_squash客户端 root 用户保持 root 权限重启服务端NFS和RPC服务systemctl restart nfs rpcbind客户端常用形式客户端说明172.16.11.202指定IP地址的主机172.16.11.0/24指定该网段所有主机172.16.10.*指定子网的所有主机www.xxx.com指定域名的主机*.xxx.com指定域中的所有主机*所有主机常用参数解析参数参数解析ro只读rw读写sync同时将数据写入到内存与硬盘中保证不丢失数据async优先将数据保存到内存然后再写入硬盘效率更高但可能会丢失数据root_squash当NFS客户端以root管理员访问时映射为NFS服务器的匿名用户no_root_squash当NFS客户端以root管理员访问时映射为NFS服务器的root管理员all_squash无论NFS客户端使用什么账户访问均映射为NFS服务器的匿名用户no_all_squash保留共享文件的UID和GID默认no_subtree_check禁用子树检查提升性能五、客户端挂载共享目录及配置永久挂载注意1、挂载目录服务端的数据会覆盖客户端的数据1、挂载目录服务端的数据会覆盖客户端的数据1、挂载目录服务端的数据会覆盖客户端的数据​执行mount挂载的为客户端2、如果卸载挂载提示设备正忙umount.nfs4: /data/test: device is busy可以使用umount -l /data/test不过存在一定风险容易丢失数据5.1 查看NFS服务共享信息客户端、服务端都可以执行指定的是nfs服务器的IP地址命令showmount[选项](参数/服务端IP)-d仅显示已被NFS客户端加载的共享目录-e显示NFS服务器上所有的共享目录。查看# 这个命令需要安装nfs-utlisshowmount-e172.16.11.201[rootlocalhost ~]# showmount -e 172.16.11.201Export listfor172.16.11.201: /data/nfs1172.16.11.0/245.2 创建目录并进行临时挂载测试在客户端创建要挂载的目录比如也在/data/nfs其他位置也可以mkdir/data/nfs临时挂载在客户端执行挂载目录命令mount -t指定挂载的文件类型nfs服务端的IP:服务端要共享的路径目录要挂载到本机的路径目录mount-tnfs172.16.11.201:/data/nfs /data/nfs如果遇到以下报错有可能是目录权限问题、服务端配置文件ip范围写的有问题、防火墙、selinux问题mount.nfs: access denied by server while mounting 172.16.11.201:/data/nfs# 挂载完成df -Th进行检查df-Th# 进入挂载目录写入或删除数据进行测试连通性cd/data/nfstouch123# 在挂载目录或nfs主服务器目录进行查看5.3 永久挂载这样只是临时挂载重启服务器之后就会消失所以需要在客户端上配置永久挂载# 永久挂载需确认好ip和类型配置错误会导致服务器重启不了vim/etc/fstab# 追加以下内容确认好自己的服务端ip和挂载路径172.16.11.201:/data/nfs /data/nfs nfs defaults,nofail,x-systemd.automount,x-systemd.requiresnetwork-online.target,x-systemd.device-timeout3000保存退出之后重启服务器可以进行测试一旦写错重启服务器将造成启动不了服务器所以要谨慎保存退出之后重启服务器可以进行测试一旦写错重启服务器将造成启动不了服务器所以要谨慎保存退出之后重启服务器可以进行测试一旦写错重启服务器将造成启动不了服务器所以要谨慎挂载选项详解defaults这是标准的挂载默认值集合通常包含rw读写、suid、dev、exec、auto允许mount -a挂载和nouser等。对于 NFS它还会启用一些基础的 NFS 行为但具体的 NFS 协议参数如rsize、wsize通常会由系统自动协商。nofail这是防止服务器重启失败的关键。它告诉systemd这个挂载点不是启动的“必需”项。即使 NFS 服务器连不上或挂载失败系统也会继续完成启动过程而不会卡住或进入紧急模式。x-systemd.automount按需挂载。系统启动时不会立刻去挂载这个 NFS而是等到第一次有人访问/data/nfs目录时才触发挂载动作。这能进一步加快启动速度并避免在启动阶段因网络未就绪而挂载失败。x-systemd.requiresnetwork-online.target保证网络就绪。它强制要求systemd在尝试挂载之前先等待network-online.target这个目标达成即网络接口已配置并在线。这解决了“系统以为网络好了其实还没好就去挂载 NFS 导致失败”的常见时序问题。x-systemd.device-timeout30限制等待时间。它规定systemd最多等待设备这里是网络存储30 秒。如果 30 秒后 NFS 服务器还不可用就放弃等待并继续启动流程。结合nofail使用可以避免因 NFS 服务器故障导致启动过程被拖延过久默认等待时间可能长达 90 秒。关于“0 0”结尾这是fstab的标准字段第一个0dump备份标志对 NFS 无意义设为0。第二个0fsck检查顺序NFS 是网络文件系统不需要本地磁盘检查设为0。5.4 取消挂载5.4.1 临时取消挂载umount客户端挂载点umount服务端ip:服务端共享目录 举例umount/data/nfsumount172.16.11.201:/data/nfs如果遇到取消挂载报错或卡住可能是还在使用中这种一般不会让取消挂载需要确认还用不用如果真的不用可以强制取消挂载umount-lf172.16.11.201:/data/nfs-f强制卸载它的作用是“强制”执行卸载操作。对于 NFS 来说当服务器端不可达例如宕机或网络断开时普通的umount可能会一直等待或报错。加上-f后系统会直接执行卸载不再等待远程服务器的响应。-l惰性卸载它的作用是“惰性”卸载。系统会立刻把这个文件系统从目录树里“摘”下来让新的访问无法进入。但是如果此时还有进程正在使用这个挂载点里的文件比如有程序打开了里面的文件系统不会强行中断它们而是会等这些进程释放引用后在后台悄悄完成最终的清理。5.4.2 永久取消挂载如果是配置了有永久挂载才需要用到这里先临时取消挂载按照上面的方法进入/etc/fstab中把172.16.11.201:/data/nfs /data/nfs nfs defaults,nofail,x-systemd.automount,x-systemd.requiresnetwork-online.target,x-systemd.device-timeout30 0 0这一行删除就可以了。