Linux 网络服务架设学习笔记(第三期)——文件共享服务(上篇):NFS 与 Rsync——网络文件系统与数据同步
Linux 网络服务架设学习笔记第三期——文件共享服务上篇NFS 与 Rsync——网络文件系统与数据同步本系列更多内容可见Linux常见服务器配置Linux系统管理入门系列更多文章欢迎访问Linux入门——系统管理1、Linux入门——系统管理2我的主页AOwhisky这里有更多运维系统性知识整理和其他有趣内容欢迎与我一起探讨学习~引言从“U 盘拷贝”到“网络共享”——让数据在服务器之间“流动”如果你有多台 Linux 服务器你可能会遇到这样的场景Web 服务器需要读取图片服务器上的静态资源日志服务器需要集中收集所有服务器的日志备份服务器需要定时从各台服务器拉取数据。如果每次都用 U 盘拷贝或 scp 手动传输效率低下且容易出错。Linux 提供了两种经典的解决方案NFSNetwork File System就像把一个文件夹“共享”到网络上客户端可以像访问本地目录一样远程访问服务器上的文件适合实时共享访问的场景。RsyncRemote Synchronize就像一位“智能搬运工”它能比较源和目的地的文件差异只传输变化的部分适合定期备份和同步的场景。NFS 和 Rsync 的角色不同但它们共同构成了 Linux 环境下文件共享和数据同步的基础设施。本期将系统学习NFS 服务器配置导出目录、客户端挂载、用户映射与权限控制Rsync 工具Shell 模式通过 SSH和 Daemon 模式rsyncd 服务的同步方案读完这一期你将具备在多台 Linux 服务器之间实现文件共享与远程同步的完整能力。— Compiled and Authored by Whisky — Augest 5 th, 2026目录NFS 网络文件系统1.1 NFS 概述与架构1.2 部署 NFS 服务器1.3 配置 NFS 导出/etc/exports1.4 客户端挂载 NFS 共享1.5 用户映射与权限控制1.6 持久化挂载与自动挂载Rsync 远程同步工具2.1 Rsync 概述与特点2.2 Shell 模式基于 SSH2.3 Daemon 模式rsyncd 服务2.4 配置 rsyncd 服务端2.5 客户端同步与密码认证2.6 同步策略增量、删除与排除NFS vs Rsync选型对比总结与速查手册1. NFS 网络文件系统1.1 NFS 概述与架构NFSNetwork File System网络文件系统最早由 Sun 公司开发用于在 UNIX/Linux 系统之间通过网络共享文件和目录。NFS 的架构是典型的C/S客户端/服务器模式┌─────────────────┐ ┌─────────────────┐ │ NFS 服务器 │ │ NFS 客户端 │ │ /shares/nfs │ ──────▶ │ /mnt/nfs │ │ 导出目录 │ 网络 │ 挂载点 │ │ 192.168.1.10 │ │ 192.168.1.20 │ └─────────────────┘ └─────────────────┘NFS 依赖RPCRemote Procedure Call远程过程调用协议来通信。RPC 负责将 NFS 服务端的端口信息注册并告知客户端。因此NFS 服务需要与 RPC 服务协同工作。白话理解NFS 让远程目录看起来像是本地的目录。你在客户端执行ls /mnt/nfs实际上是在访问服务器上的/shares/nfs目录就像插入了一个网络版的 U 盘。1.2 部署 NFS 服务器安装软件包[rootserver ~]# yum install -y nfs-utils创建共享目录并设置权限# 创建共享目录[rootserver ~]# mkdir -p /shares/nfs# 为了演示创建一个测试用户[rootserver ~]# useradd -u 1000 whisky[rootserver ~]# echo redhat | passwd --stdin whisky# 将目录所有者改为 whisky方便测试[rootserver ~]# chown whisky /shares/nfs启动 NFS 服务[rootserver ~]# systemctl enable nfs-server --now# 查看服务状态[rootserver ~]# systemctl status nfs-server# 查看 RPC 服务注册的端口[rootserver ~]# rpcinfo -p | grep nfs1000033tcp2049nfs1000034tcp2049nfs1000033udp2049nfs配置防火墙NFS 需要放行多个服务包括nfs、rpc-bind和mountd[rootserver ~]# firewall-cmd --permanent --add-servicenfs \--add-servicerpc-bind --add-servicemountd[rootserver ~]# firewall-cmd --reload1.3 配置 NFS 导出/etc/exportsNFS 通过/etc/exports文件定义哪些目录可以被哪些客户端访问以及访问权限。基本语法导出目录 客户端1(选项1,选项2) 客户端2(选项3,选项4)客户端表示方式方式示例说明主机名client.whisky.cloud通过 DNS 解析通配符域名*.whisky.cloud匹配域内所有主机IPv4 地址10.1.8.11单个 IPIPv4 网段10.1.8.0/24网段内所有主机IPv6 地址/网段fde2:6494:1e09:2::20单个或网段常用导出选项选项含义rw允许读写访问ro只读访问默认no_root_squash客户端 root 用户保持 root 权限不安全root_squash客户端 root 用户映射为nobody默认推荐sync同步写入数据写入磁盘后返回async异步写入性能更高但数据可能丢失编辑/etc/exports[rootserver ~]# vim /etc/exports/shares/nfs10.1.8.0/24(rw)使配置生效修改/etc/exports后使用exportfs命令重新加载# 重新加载所有导出[rootserver ~]# exportfs -r# 查看当前导出状态[rootserver ~]# exportfs -v/shares/nfs10.1.8.0/24(sync,wdelay,hide,no_subtree_check,secsys,rw,secure,root_squash,no_all_squash)1.4 客户端挂载 NFS 共享客户端安装软件包[rootclient ~]# yum install -y nfs-utils查看服务器导出的共享[rootclient ~]# showmount -e server.whisky.cloudExport listforserver.whisky.cloud: /shares/nfs10.1.8.0/24挂载 NFS 共享# 创建挂载点[rootclient ~]# mkdir /mnt/nfs# 挂载 NFS-t nfs 可省略[rootclient ~]# mount -t nfs server.whisky.cloud:/shares/nfs /mnt/nfs# 验证挂载[rootclient ~]# df -h /mnt/nfsFilesystem Size Used Avail Use% Mounted on server.whisky.cloud:/shares/nfs 20G1.2G 19G6% /mnt/nfs测试读写# 以 root 用户尝试写入默认 root_squash会被映射为 nobody[rootclient ~]# touch /mnt/nfs/root-filetouch: cannottouch/mnt/nfs/root-file:Permission denied# 以 whisky 用户写入UID 1000 匹配[whiskyclient ~]$touch/mnt/nfs/whisky-file[whiskyclient ~]$ls-l/mnt/nfs -rw-rw-r--1whisky whisky0Aug514:30 whisky-file1.5 用户映射与权限控制NFS 的权限基于UID/GID进行映射而不是用户名。场景行为客户端 UID 与服务器端 UID 相同以对应用户身份访问如 whisky 可以读写客户端 rootUID0默认被映射为nobodyroot_squash客户端 UID 在服务器端不存在显示为数字 UID如uid1005解决用户映射不一致的方法保持 UID 一致在所有客户端和服务器上使用相同的 UID如useradd -u 1000 whisky使用no_root_squash不推荐允许客户端 root 拥有 root 权限使用 NFS v4 的idmapd将用户名映射到 UID需配置⚠️生产环境警告除非绝对必要不要使用no_root_squash这会让客户端 root 用户在 NFS 共享上拥有完全控制权存在严重安全风险。1.6 持久化挂载与自动挂载在/etc/fstab中添加条目[rootclient ~]# echo server.whisky.cloud:/shares/nfs /mnt/nfs nfs defaults 0 0 /etc/fstab# 测试挂载[rootclient ~]# mount -a/etc/fstabNFS 挂载常用选项选项含义defaults使用默认选项rw/ro读写/只读_netdev网络可用后再挂载推荐bg后台重试如果服务器暂时不可用timeo60超时时间秒retrans3重传次数2. Rsync 远程同步工具2.1 Rsync 概述与特点RsyncRemote Synchronize是一款开源的、快速的、多功能的远程数据同步备份工具。核心优势特性说明增量同步只传输文件的变化部分“quick check”算法而非完整文件高效压缩支持在传输过程中压缩数据节省带宽灵活传输既支持本地同步也支持远程同步通过 SSH 或 rsync 服务保留属性可保留文件权限、时间戳、所有者、ACL 等删除同步支持--delete使目标与源完全一致Rsync 的“quick check”算法Rsync 默认仅同步大小或最后修改时间发生变化的文件。它不会逐字节比较文件内容而是通过元数据快速判断是否需要传输。源文件 → 比较大小和 mtime → 目标文件 ├─ 相同 → 跳过 └─ 不同 → 传输变更部分2.2 Shell 模式基于 SSHRsync 的shell 模式基于 SSH 协议传输数据无需额外配置服务端。基本语法# 推从本地上传到远程rsync[选项]源路径[user]host:目标路径# 拉从远程下载到本地rsync[选项][user]host:源路径 目标路径常用选项选项含义-a归档模式保留权限、时间戳、所有者等-v显示详细过程-z传输时压缩-n空运行dry-run仅显示将要执行的操作-P显示进度 支持断点续传--delete删除目标中源没有的文件--exclude排除特定文件或目录实战示例# 在客户端和服务端都要安装 rsync[rootclient ~]# yum install -y rsync[rootserver ~]# yum install -y rsync# 准备测试数据[whiskyclient ~]$mkdirbackup[whiskyclient ~]$touchbackup/file-{1..5}[whiskyclient ~]$echohellobackup/file-1# 首次同步推[whiskyclient ~]$rsync-avbackup/ rootserver.whisky.cloud:/backup/ sending incrementalfilelist ./ file-1 file-2 file-3 file-4 file-5 sent344bytes received115bytes918.00bytes/sec total size is5speedup is0.01# 再次同步无变化[whiskyclient ~]$rsync-avbackup/ rootserver:/backup/ sending incrementalfilelist sent142bytes received17bytes318.00bytes/sec total size is5speedup is0.03# 修改文件后同步只传输变化的文件[whiskyclient ~]$touchbackup/file-1[whiskyclient ~]$rsync-avbackup/ rootserver:/backup/ sending incrementalfilelist file-1 sent232bytes received55bytes574.00bytes/sec total size is5speedup is0.02路径末尾斜杠的陷阱写法行为rsync -av backup/ roothost:/dest/只复制目录内容到/dest/rsync -av backup roothost:/dest/复制目录本身到/dest/backup建议使用rsync -av source/ dest/时注意末尾斜杠决定了是否包含目录本身。2.3 Daemon 模式rsyncd 服务Daemon 模式需要配置 rsync 服务端rsyncd客户端通过 rsync 协议端口 873连接无需 SSH 支持。适用场景不需要 SSH 密钥或密码客户端可使用密码文件可精细控制每个模块的读写权限、IP 限制适合大规模备份和自动化同步2.4 配置 rsyncd 服务端安装 rsync-daemonCentOS 7 中需要安装rsync-daemon子包[rootserver ~]# yum install -y rsync-daemon配置文件/etc/rsyncd.conf该文件分为全局配置和模块配置两部分。[rootserver ~]# vim /etc/rsyncd.conf# 全局配置port873uidroot gidroot usechrootno max connections200pidfile/var/run/rsyncd.pid lockfile/var/run/rsync.lock logfile/var/log/rsyncd.log# 模块配置data[data]commentpublic data path/datareadonlyno hosts allow10.1.8.0/24 hosts deny0.0.0.0/32 authusersrsyncsecretsfile/etc/rsyncd.secrets参数说明参数作用path共享目录的路径read only只读yes或可读写nowrite only只允许上传yes或允许下载hosts allow允许访问的客户端 IP 网段auth users认证用户名多个用逗号分隔secrets file密码文件路径格式用户名:密码list是否显示在模块列表中默认 trueignore errors忽略 I/O 错误继续同步timeout连接超时时间秒创建密码文件[rootserver ~]# echo rsync:redhat /etc/rsyncd.secrets[rootserver ~]# chmod 400 /etc/rsyncd.secrets准备共享目录[rootserver ~]# mkdir -p /data[rootserver ~]# chmod 777 /data启动服务[rootserver ~]# systemctl enable rsyncd --now# 查看端口监听[rootserver ~]# ss -lntp | grep 873LISTEN05*:873 *:* users:((rsync,pid1234,fd4))# 防火墙放行[rootserver ~]# firewall-cmd --add-servicersyncd --permanent[rootserver ~]# firewall-cmd --reload2.5 客户端同步与密码认证查看服务端模块列表[rootclient ~]# rsync server.whisky.cloud::data public data查看特定模块内容[rootclient ~]# rsync server.whisky.cloud::data/上传文件到服务端# 交互式输入密码[rootclient ~]# rsync -av backup/ rsyncserver.whisky.cloud::data/Password:redhatsending incrementalfilelist ./ file-1... sent344bytes received115bytes918.00bytes/sec使用密码文件非交互# 创建客户端密码文件[rootclient ~]# echo redhat /etc/rsyncd.secrets[rootclient ~]# chmod 400 /etc/rsyncd.secrets# 使用 --password-file 选项[rootclient ~]# rsync -av --password-file/etc/rsyncd.secrets \backup/ rsyncserver.whisky.cloud::data/从服务端下载文件[rootclient ~]# rsync -av --password-file/etc/rsyncd.secrets \rsyncserver.whisky.cloud::data/file-1 ./downloaded-file-1同步删除使目标与源完全一致# 客户端删除本地文件后同步到服务端[whiskyclient backup]$rm-ffile-2# 不加 --delete服务端仍保留 file-2[whiskyclient backup]$rsync-av./ rsyncserver::data/# 加 --delete服务端也会删除 file-2与源保持一致[whiskyclient backup]$rsync-av--delete./ rsyncserver::data/ deleting file-22.6 同步策略增量、删除与排除场景命令示例增量备份保留旧文件rsync -av source/ dest/完全镜像删除多余文件rsync -av --delete source/ dest/排除特定文件rsync -av --exclude*.log source/ dest/排除多个文件rsync -av --exclude{*.log,tmp/} source/ dest/空运行测试rsync -avn --delete source/ dest/限速传输rsync -av --bwlimit1000 source/ dest/限制 1000 KB/s保留 ACL 和 SELinux 属性rsync -avAX source/ dest/排除文件示例# 同步 /var/www 但排除 logs 目录和 .tmp 文件[rootclient ~]# rsync -av --excludelogs/ --exclude*.tmp \/var/www/ rootserver:/backup/www/3. NFS vs Rsync选型对比维度NFSRsync使用场景实时共享访问定期同步备份文件访问方式客户端像本地目录一样读写通过命令手动或定时同步传输方式内核级 RPC 通信用户态SSH 或 rsync 协议增量传输❌ 每次读写都是完整 I/O✅ 只传输变化部分保留属性需 UID 一致可保留属主、权限、时间戳双向同步两端均可读写需配置单向同步源→目标网络依赖持续连接类似本地文件系统连接仅在同步时建立适用场景Web 共享存储、NFS 家目录数据备份、日志归档、镜像站点选型建议需要实时访问远程文件如 Web 服务器共享图片目录→NFS需要定时备份或同步数据如每天凌晨备份数据库→Rsync两者也可组合使用NFS 提供实时共享Rsync 用于备份 NFS 中的数据4. 总结与速查手册4.1 核心知识点一览主题关键点NFS 概念基于 RPC 的网络文件系统实现远程目录挂载NFS 服务端nfs-utils、/etc/exports、exportfs -rNFS 客户端showmount -e查看导出mount -t nfs挂载NFS 权限基于 UID 映射root_squash默认将 root 映射为 nobodyRsync 特点增量同步quick check支持 SSH 和 daemon 模式Rsync Shell 模式rsync -av source/ userhost:/dest/Rsync Daemon 模式/etc/rsyncd.conf认证用户密码文件端口 873同步策略--delete完全镜像--exclude排除文件4.2 NFS 命令速查表命令作用exportfs -r重新加载/etc/exportsexportfs -v查看当前导出的目录及选项showmount -e host查看服务器导出的共享mount -t nfs host:/path /local挂载 NFS 共享umount /local卸载 NFS 共享rpcinfo -p查看 RPC 服务注册信息systemctl status nfs-server查看 NFS 服务状态4.3 Rsync 命令速查表命令作用rsync -av source/ dest/本地/远程同步增量rsync -avn source/ dest/空运行预览操作rsync -av --delete source/ dest/完全镜像删除多余文件rsync -av --exclude*.log source/ dest/排除日志文件rsync -avz source/ userhost:/dest/压缩传输rsync host::module查看 daemon 模块列表rsync userhost::module/列出模块内容rsync -av --password-filepassfile source/ userhost::module/使用密码文件同步4.4/etc/exports选项速查选项含义推荐rw/ro读写/只读rw按需root_squash/no_root_squashroot 映射为 nobody / 保持 rootroot_squash✅sync/async同步/异步写入sync安全no_subtree_check不检查子目录提高性能✅ 建议加all_squash所有用户映射为 nobody高安全场景推荐配置/shares/nfs 10.1.8.0/24(rw,sync,root_squash,no_subtree_check)4.5/etc/rsyncd.conf配置速查参数作用port监听端口默认 873uid/gid访问目录时使用的身份path共享目录路径read only只读/读写auth users认证用户名secrets file密码文件权限 400hosts allow允许的 IP 网段4.6 常见错误排查错误原因解决方案mount.nfs: access denied客户端不在exports允许列表中修改/etc/exportsexportfs -rmount.nfs: Permission deniedroot_squash 导致使用非 root 用户访问或使用no_root_squash慎用rsync: connection refusedrsyncd 未启动或防火墙拦截启动rsyncd放行 873 端口ERROR: auth failed on module用户名或密码错误检查auth users和secrets filersync: ERROR: cannot read password file密码文件权限过松chmod 400密码文件NFS 挂载卡住/超时NFS 服务器不可达或 RPC 服务问题检查网络和rpcinfo -pRsync 同步时文件属主丢失非 root 运行 rsync使用 root 权限或确保 UID 一致4.7 思考与拓展NFS 导出目录时为什么推荐使用root_squash→ 防止客户端 root 用户获得共享目录的完全控制权减少安全风险。如果确实需要 root 权限应使用no_root_squash但需评估安全后果。Rsync 的--delete选项有什么风险→ 如果源目录意外删除了重要文件同步后目标也会被删除。建议先使用-ndry-run预览操作确认无误后再执行。NFS 和 Rsync 在性能上有什么区别→ NFS 是实时文件访问每次操作都涉及网络 I/O适合少量但高频的读写Rsync 是批量同步只传输变化部分适合大量数据的周期性传输。Rsync 的 shell 模式和 daemon 模式分别适用什么场景→ shell 模式基于 SSH适合小规模、临时同步daemon 模式适合大规模、自动化备份场景可配置认证、IP 限制和独立日志。4.8 生产环境最佳实践场景建议NFS 共享目录使用sync保证数据一致性root_squash必须保留NFS 性能优化在/etc/fstab中添加noatime选项减少访问时间更新Rsync 备份脚本加入--delete前先做-n试运行确认无误后再正式执行Rsync 密码管理密码文件权限设为 400并存储在安全目录定时同步使用crontab定时执行 Rsync如0 2 * * * rsync -av /data/ userbackup:/backup/NFS 高可用配合 Keepalived 或 DRBD 实现 NFS 服务的高可用下期预告NFS 和 Rsync 解决了 Linux 系统间的文件共享和同步问题但如果你的网络中有 Windows 客户端呢或者你需要更复杂的用户权限控制下一期我们将学习SMBSamba服务器——让 Linux 与 Windows 无缝共享文件以及VSFTPD——一款安全、高效的 FTP 服务器。敬请期待第四期— Compiled and Authored by Whisky — Augest 5 th, 2026