外观
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 端口。
启用服务
- 打开
服务 → Rsync → 服务器 → 设置(Services → Rsync → Server → Settings)。 - 勾选 已启动(Enabled)。端口(Port)默认 873。扩展选项(Extra options)是追加到
rsyncd.conf全局部分的参数,一般用不上。 - 点击 保存(Save),再点击 应用。
创建模块
打开
服务 → Rsync → 服务器 → 模块(Services → Rsync → Server → Modules),点击 创建(Create)。填写表单:
字段 默认值 说明 已启动 勾选 取消勾选临时停用这个模块 共享文件夹(Shared folder) 模块对应的目录 名称(Name) 模块名,客户端用它来访问,可以和共享文件夹名不同 用户(User,下拉框) nobody传输时使用的系统用户 用户组(Group,下拉框) users传输时使用的系统用户组 用户(Users,表格) 空 允许访问这个模块的 rsync 账号:名称加密码。这是模块自己的账号,不是 OMV 用户,密码也不是 Linux 登录密码 使用 chroot(Use chroot) 勾选 传输前先把根切换到共享文件夹目录。代价是无法按名字映射用户和组,也无法跟随指向目录之外的符号链接 验证用户(Authenticate users) 不勾选 勾选后客户端必须提供表格里的用户名和密码 只读(Read-only) 不勾选 勾选后上传全部失败 只写(Write-only) 不勾选 勾选后下载全部失败,适合「只收备份、不让别人取走」 列出模块(List module) 勾选 客户端请求模块列表时,是否列出这个模块 最大连接数(Max. connections) 0 0 表示不限制 允许主机、拒绝主机 空 逗号、空格或制表符分隔的主机名或 IP,两者冲突时允许优先;留空用默认 扩展选项 空 追加到这个模块的 rsyncd.conf参数标签(Tags) 备注 保存,点击 应用。
一定要勾选「验证用户」,它默认是关的。勾选后,在 用户(表格)里至少添加一个账号: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。
检查结果
在客户端运行
rsync rsync://<NAS 地址>/,应该看到你的模块名。用模块账号推送一个小的测试文件,成功后到 OMV 的 shell(SSH 或本机控制台,root 身份)里看:
shls -l <共享文件夹的绝对路径>文件应该在里面,属主属组默认是
nobody users。验证认证真的生效:在客户端不带用户名访问模块,例如
rsync rsync://<NAS 地址>/<模块名>/,应该被拒绝或要求输入密码。如果能直接列出内容,说明认证没起作用,回头检查 验证用户 和用户表格。在
诊断 → 系统日志 → 日志(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 文件的生成规则)