跳转到内容

rsync 服务端:接收其他机器的备份 ​

OMV 可以充当 rsync 服务端(rsync 守护进程):其他机器用 rsync 命令把文件推送到 NAS,或者从 NAS 拉取。做完这一篇,你会有一个带账号密码的 rsync 模块,并在客户端上验证过上传和下载。

这篇讲的是 OMV 作为服务端。让 OMV 主动去同步别的机器,是 rsync 任务,两者别混淆。

先想想:真的需要 rsync 服务端吗 ​

如果对方机器能通过 SSH 连到 NAS,不需要 rsync 服务端:直接用 rsync over SSH,它有用户认证,传输还是加密的,只要给对方一个 SSH 用户和目标目录的写权限,见 SSH 与 SFTP 访问。

rsync 服务端适合这些情况:局域网内、对端是不方便装 SSH 的设备、想用「模块」把不同的备份隔离开。它的协议本身不加密传输内容,模块的用户名密码只用于认证。

rsync 服务端会在 873 端口对网络开放,传输不加密

  • 影响范围:开启后 TCP 873(可改)对网络开放。没勾选 验证用户 的模块,任何能连到这个端口的人,只要文件系统权限允许,就能读写。数据明文传输;模块用户的密码以明文保存在 OMV 的配置数据库和 /var/lib/openmediavault/rsyncd-<模块名>.secrets 里(文件权限 600)。
  • 前置条件:只在可信的局域网里用;每个模块都勾选 验证用户 并至少添加一个用户;用 允许主机 限定客户端;备份目标用专用的共享文件夹;不做端口映射。
  • 回退:取消模块的 已启动,或删除模块;不再需要时取消服务的 已启动,点击顶部黄色提示条上的 应用(Apply)。

开始之前 ​

  • 准备一个专用的共享文件夹,例如 backup-incoming,见 共享文件夹。默认权限就行:模块默认以 nobody:users 身份写入,属组 users 对默认的 2775 目录有写权限。
  • 客户端能连到 NAS 的 TCP 873 端口。

启用服务 ​

  1. 打开 服务 → Rsync → 服务器 → 设置(Services → Rsync → Server → Settings)。
  2. 勾选 已启动(Enabled)。端口(Port)默认 873。扩展选项(Extra options)是追加到 rsyncd.conf 全局部分的参数,一般用不上。
  3. 点击 保存(Save),再点击 应用。

创建模块 ​

  1. 打开 服务 → Rsync → 服务器 → 模块(Services → Rsync → Server → Modules),点击 创建(Create)。

  2. 填写表单:

    字段默认值说明
    已启动勾选取消勾选临时停用这个模块
    共享文件夹(Shared folder)模块对应的目录
    名称(Name)模块名,客户端用它来访问,可以和共享文件夹名不同
    用户(User,下拉框)nobody传输时使用的系统用户
    用户组(Group,下拉框)users传输时使用的系统用户组
    用户(Users,表格)空允许访问这个模块的 rsync 账号:名称加密码。这是模块自己的账号,不是 OMV 用户,密码也不是 Linux 登录密码
    使用 chroot(Use chroot)勾选传输前先把根切换到共享文件夹目录。代价是无法按名字映射用户和组,也无法跟随指向目录之外的符号链接
    验证用户(Authenticate users)不勾选勾选后客户端必须提供表格里的用户名和密码
    只读(Read-only)不勾选勾选后上传全部失败
    只写(Write-only)不勾选勾选后下载全部失败,适合「只收备份、不让别人取走」
    列出模块(List module)勾选客户端请求模块列表时,是否列出这个模块
    最大连接数(Max. connections)00 表示不限制
    允许主机、拒绝主机空逗号、空格或制表符分隔的主机名或 IP,两者冲突时允许优先;留空用默认
    扩展选项空追加到这个模块的 rsyncd.conf 参数
    标签(Tags)备注
  3. 保存,点击 应用。

一定要勾选「验证用户」,它默认是关的。勾选后,在 用户(表格)里至少添加一个账号:OMV 用这个表格生成配置里的 auth users,表格留空会生成一个空的 auth users,不要这样留着,下文的检查步骤会验证。

模块是以 用户 和 用户组 的身份读写文件的。默认的 nobody:users 不是 root,所以客户端用 -a 时想保留的属主和属组无法生效,新文件的属主会是 nobody、属组是 users。需要保留属主时,才考虑把 用户 改成 root,代价是以 root 身份写入,要想清楚。

在客户端上使用 ​

在客户端电脑(Linux、macOS 或 Windows 的 WSL)的终端里运行:

sh
# 列出这台 NAS 对外公开的模块(只列出「列出模块」勾选的)
rsync rsync://<NAS 地址>/

# 把本地目录推送到模块,会提示输入模块密码
rsync -av <本地目录>/ rsync://<模块用户名>@<NAS 地址>/<模块名>/

# 从模块拉取到本地
rsync -av rsync://<模块用户名>@<NAS 地址>/<模块名>/ <本地目录>/
  • -a 是归档模式,-v 输出详情。第一次用时加上 -n(试运行,只显示会做什么、不真的传输),确认无误再去掉。
  • 源路径末尾的 / 有区别:带 / 传目录里的内容,不带 / 连目录本身一起传。
  • 不要随手加 --delete:它会删除目标里源端没有的文件。风险见 rsync 任务 里关于删除选项的说明。
  • 脚本里不想交互输入密码,用 --password-file=<密码文件>,并把这个文件的权限设成 600。

检查结果 ​

  1. 在客户端运行 rsync rsync://<NAS 地址>/,应该看到你的模块名。

  2. 用模块账号推送一个小的测试文件,成功后到 OMV 的 shell(SSH 或本机控制台,root 身份)里看:

    sh
    ls -l <共享文件夹的绝对路径>

    文件应该在里面,属主属组默认是 nobody users。

  3. 验证认证真的生效:在客户端不带用户名访问模块,例如 rsync rsync://<NAS 地址>/<模块名>/,应该被拒绝或要求输入密码。如果能直接列出内容,说明认证没起作用,回头检查 验证用户 和用户表格。

  4. 在 诊断 → 系统日志 → 日志(Diagnostics → System Logs → Logs)里选 Rsync - 服务器,能看到连接记录。

常见问题 ​

@ERROR: auth failed on module。 用户名或密码不对。注意这是模块账号,不是 OMV 用户。

@ERROR: Unknown module。 模块名写错,或者模块没启用、没点应用。

上传失败,Permission denied。 模块的 用户 和 用户组 对共享文件夹的目录没有写权限,或者模块勾选了 只读。

客户端报连不上端口 873。 服务没启用,或者两台机器之间有防火墙。

想要加密。 改用 rsync over SSH。

参考资料 ​

  • OMV 官方文档:RSync
  • rsync 手册页:rsyncd.conf(5)
  • OMV 源码:srv/salt/omv/deploy/rsyncd/(rsyncd.conf 和 secrets 文件的生成规则)

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。