跳转到内容

rsync 任务:本地与远程同步 ​

完成后,OMV 会按你设定的时间,把一个共享文件夹的内容同步到本机另一块盘上的共享文件夹,或者通过 SSH、rsync 守护进程同步到另一台机器;结果会写进日志,也可以发邮件。这是 OMV 核心自带的功能,不需要装插件。

先弄清楚:rsync 是同步,不是版本化备份 ​

rsync 让目标和源保持一致。它只管复制,不管历史:

  • 默认不删除目标里多出来的文件,所以目标会慢慢堆积已经在源里删掉的旧文件。
  • 源里的文件被误改、被勒索软件加密后,下一次同步会把坏版本复制过去,覆盖目标里的好版本。
  • 勾选「删除」后,源里删掉的文件,目标里也会被删掉。

需要「回到上周的版本」,请用有历史的工具:BorgBackup、restic、rsnapshot,或者在目标一侧再加一层 Btrfs 快照。策略层面的取舍见备份策略。

任务的三种组合 ​

入口是 服务 → Rsync → 任务(Services → Rsync → Tasks)。创建任务时先选类型(Type)和模式(Mode):

类型模式源目标典型用途
本地无源共享文件夹目标共享文件夹把数据同步到本机另一块盘
远程推送(Push)源共享文件夹目标服务器,填写远程地址把数据推到另一台机器
远程拉取(Pull)源服务器,填写远程地址目标共享文件夹把另一台机器的数据拉回本机

远程地址有三种写法,界面里字段的提示文字里也有:

写法含义
用户@主机:路径通过 SSH 传输,数据在网络上加密
用户@主机::模块 或 rsync://用户@主机:端口/模块连到对方的 rsync 守护进程(模块),传输不加密,只适合可信内网。对方怎么开见rsync 服务端

创建一个本地同步任务 ​

前提:源和目标两个共享文件夹已经存在,并且目标在另一块物理盘上。放在同一块盘上的「备份」挡不住盘坏。

  1. 打开 服务 → Rsync → 任务,点 创建(Create)。
  2. 确认 已启动(Enabled)勾选,类型 选 本地(Local)。
  3. 选好 源共享文件夹(Source shared folder)和 目标共享文件夹(Destination shared folder)。
  4. 在 执行的时间(Time of execution)下面设定时间。分、小时、月内第几天、月、周内第几天都是多选列表,* 表示每一个。默认值是你打开表单的时刻,即每天这个时间运行,请改成夜里。
  5. 勾选 命令输出用 Email 发送(Send command output via email),前提是已经配置好邮件通知。
  6. 先勾选 试运行(Trial run),保存。
  7. 点页面顶部黄色提示条上的 应用(Apply),任务才会真正生成。
  8. 选中任务,点工具栏的 运行(Run),看任务对话框里的输出,确认列出的文件符合预期。
  9. 回到任务里取消 试运行,保存并再次应用。

如果页面顶部还有黄色提示条(有未应用的更改),运行会提示配置已修改,先应用再运行。

选项对照 ​

表单里的选项最终会变成 rsync 命令行参数:

界面(官方中文)rsync 参数默认说明
试运行(Trial run)--dry-run关只显示会做什么,不做改动
抑制非错误信息(Suppress non-error messages)--quiet关少输出
打包模式(Archive mode)--archive开包含下面五项
递归到目录 / 保存权限 / 保存修改时间 / 保存用户组 / 保存拥有者--recursive 等开打包模式的组成部分
压缩(Compress)--compress关跨公网时有用,局域网通常没必要
保存 ACLs(Preserve ACLs)--acls关目标文件系统要支持 ACL
保留扩展属性(Preserve extended attributes)--xattrs关同上
保留传输了一部分的文件(Keep partially transferred files)--partial关大文件中断后可续传
删除(Delete)--delete关见下面的警示
扩展选项(Extra options)原样追加空参考 rsync 手册,写错会让任务失败

「删除」选项会在目标上删文件

  • 影响范围:勾选 删除(Delete)后,接收一侧(本地任务和推送任务里是目标,拉取任务里是本机的目标共享文件夹)上存在、而发送一侧没有的文件会被删除。rsync 没有回收站,删了就是删了。
  • 常见翻车场景:源和目标选反了;源目录是空的或只剩一部分(盘没挂上、有人清空了目录);源里的文件被误删或被勒索软件加密后同步了一次;在扩展选项里写了 --delete-excluded 或 --remove-source-files,后者甚至会删源文件。
  • 前置条件:任务脚本在源或目标文件系统没有挂载时会直接退出并报错,所以盘掉线不会被当成空目录;但挂载着的空目录不受保护。目标一侧最好另有一份快照或第二份备份。
  • 怎么回退:删掉的文件无法从 rsync 找回,只能从目标一侧的快照或另一份备份恢复。所以平时保持 删除 关闭;确实需要镜像时,先用 试运行 看输出里的 deleting 行,确认无误再取消试运行。

远程任务:通过 SSH 同步到另一台机器 ​

通过 SSH 必须用公钥验证。任务里的验证(Authentication)选 密码(Password)只对 rsync 守护进程有效,界面提示它不用于 SSH 这类远程 shell。

  1. 打开 系统 → 证书 → SSH(System → Certificates → SSH),点 创建(Create)生成一对密钥,类型保持默认即可。任务脚本是非交互的,私钥不能设口令。

  2. 在同一页选中这对密钥,点 安装(Install),在弹出的「安装公钥到远程机器」对话框里填远程机器的主机名、端口、用户名和密码,点 复制(Copy)。远程机器需要暂时允许密码登录。也可以自己把公钥追加到远程用户的 ~/.ssh/authorized_keys。

  3. 先在 OMV 上手动登录一次远程机器,让 root 记住它的主机密钥。 官方文档说明,没有记录主机密钥时任务不会运行。在 OMV 的 shell 以 root 身份执行:

    sh
    ssh <远程用户>@<远程主机>

    看到「Are you sure you want to continue connecting」时输入 yes,然后 exit 退出。是否能登录成功不重要,目的是写入 known_hosts。

  4. 创建任务:类型 选 远程,模式 选 推送,源共享文件夹 选本机的共享文件夹,目标服务器(Destination server)填 用户@主机:路径,验证 选 公钥(Public key),SSH 证书(SSH certificate)选刚才的密钥,SSH 端口(SSH port)按对方设置填写。

  5. 同样先 试运行,再 应用 后运行。

远程目录要提前建好,远程用户要对它有写权限。

计划、日志和邮件 ​

  • OMV 把任务写进 /etc/cron.d/openmediavault-rsync,每个任务对应 /var/lib/openmediavault/cron.d/ 下的一个脚本,以 root 身份运行。这些文件由 OMV 生成,每次应用都会重写,不要手改。
  • 上一次运行还没结束时,新的运行会直接退出,不会叠加。
  • 输出写入 /var/log/rsync.log,在 诊断 → 系统日志(Diagnostics → System Logs)的下拉列表里选 Rsync - 任务。日志按周轮转,保留 4 份。
  • 同一时间点不要堆太多任务。备份、SMART 长测、Btrfs scrub、SnapRAID 同步错开安排,见计划任务。

检查结果 ​

  1. 试运行输出的文件列表符合预期,没有意外的 deleting 行。

  2. 取消试运行后手动运行一次,输出末尾出现 The synchronisation has completed successfully.。

  3. 在 OMV 的 shell 里用只读命令对比源和目标(路径用 存储器 → 共享文件夹(Storage → Shared Folders)里的绝对路径):

    sh
    diff -rq <源目录> <目标目录>

    没有输出表示两边一致。目标里多出的文件会以 Only in 开头列出。

  4. 往源里放一个测试文件,等下一次计划运行后确认它出现在目标里;收到了邮件。

  5. 从目标里复制一个文件回来并打开,确认内容完整。这一步才是在验证备份。

常见问题 ​

运行时提示 Source storage device not mounted 或 Destination storage device not mounted。 源或目标所在的文件系统没有挂载,先到 存储器 → 文件系统(Storage → File Systems)检查。

点「运行」提示配置已更改。 点黄色提示条上的 应用,再运行。

报 Permission denied 或 Operation not permitted。 本地任务以 root 运行,一般不是权限问题;检查目标是不是 NTFS、exFAT 这类不支持 Linux 权限和属主的文件系统。如果共享文件夹就在文件系统根上,rsync 复制 aquota.user、aquota.group 时也可能报这个错,可以在扩展选项里写 --exclude='aquota.user' --exclude='aquota.group'。

远程任务提示 Host key verification failed。 还没有让 root 记住远程主机密钥,按上面第 3 步操作。

远程任务一直要密码。 公钥没装到远程用户、私钥设了口令,或者远程 SSH 禁用了公钥登录。

想同时同步多个目录。 一个任务只有一个源和一个目标,每个目录建一个任务。

参考资料 ​

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