rsync 备份 Mac命令:rsync -aE --delete ~/Documents/ /Volumes/Backup/Documents/
-E 是 macOS 特有的那一半,漏掉它会悄悄丢失扩展属性和资源分支。
-a 是归档模式:递归,并保留权限、所有权、时间戳和符号链接。这是人人都知道的参数。-E 保留 macOS 扩展属性和资源分支。Finder 标签、隔离标记、自定义图标以及大量应用元数据都存放在那里。没有它,这些就会丢失,而且没有任何提示。--delete 会在文件从源端消失后,将其从目标中删除。正是它让副本成为镜像,也是最需要慎重考虑的参数。-v 用于输出,-n 用于试运行。含有 --delete 的命令,第一次一定要先试运行。~/Documents 会把文件夹本身复制到目标中,得到 /Volumes/Backup/Documents/Documents。~/Documents/ 复制的是它的内容,这几乎总是你想要的。在同时带有 --delete 的命令里,弄错这一点会删除目标中原有的其他内容。--exclude 用于不值得复制的内容:--exclude '.DS_Store'、--exclude 'node_modules'、--exclude 'Library/Caches'。macOS 自带的 rsync 版本足以胜任。如果你想要更新的上游版本,Homebrew 里有,而且它在 macOS 上处理 ACL 更好。
rsync 让目标看起来与源一样。那是副本,而副本不是历史记录。你上周二删除的文档,下次运行后就从备份中消失了。你后来覆盖掉的文件的好版本也一样,勒索软件在任务运行前碰过的一切也一样。
去掉 --delete 也解决不了。它只会让目标堆积你曾有过的所有文件,每个文件仍然只有一个版本,而且无法分辨哪些是当前的。
--link-dest 保留版本标准做法是每次运行都新建一个带日期的目录,并把未更改的文件硬链接到上一个目录,这样相同的文件不占任何空间:
DEST=/Volumes/Backup
TODAY=$(date +%F)
rsync -aE --delete \
--link-dest="$DEST/latest" \
~/Documents "$DEST/$TODAY"
ln -snf "$DEST/$TODAY" "$DEST/latest"
现在每个带日期的文件夹看起来都是完整备份,而只有更改过的文件占用空间。这大致就是 Time Machine 的构建思路。
两点注意。硬链接意味着副本并不独立:底层数据块损坏会影响所有共享它的快照。而且它需要支持硬链接的文件系统,所以在外置驱动器上可行,在大多数云文件夹中不行。
rsync 不会对静态数据进行任何加密。如果目标是云文件夹或会离开家门的驱动器,请在写入前加密:
tar -cJf - ~/Documents | openssl enc -aes-256-cbc -pbkdf2 -out /Volumes/Backup/documents.tar.xz.enc
那是一个看不到内部的归档:没有增量复制,不解开全部内容就无法恢复单个文件,而你和一切之间只隔着一个密码。这个取舍很重要,也是大多数人不再自己动手的地方。
macOS 上仍然有 cron,但 launchd 才是官方支持的方式。在 ~/Library/LaunchAgents/ 中放一个带 StartCalendarInterval 的 plist,就能每天运行你的脚本。macOS 会要求为运行它的程序授予“完全磁盘访问权限”,因为读取“文稿”和“桌面”受到保护。
无论你怎么定时,都让它把结果写到你真正会看到的地方,并检查备份是最近的:
find /Volumes/Backup -type f -newermt '-7 days' | head
静默的任务才是故障所在。它不会在你屏幕上报错停止,而是在四个月前的某个夜里悄悄停了。
上面的命令涵盖了复制。它们没有涵盖的,正是出问题那天你真正需要的:能挺过镜像运行的版本、仍能恢复单个文件的加密、用哈希检查每个数据块的读回,以及在驱动器一周没出现时告诉你的东西。
每一项都要花一个周末写脚本,之后还得由你维护。Copy Shelter 是同样的理念,并内置了这些部分,一个位置免费。
rsync 副本会丢失 Finder 标签?因为在 macOS 上单用 -a 不会带上扩展属性。加上 -E。如果还需要 ACL,请用 -A,并考虑 Homebrew 版本,它处理 ACL 比系统自带版本更可靠。
可以,写入 /Volumes 下装载的共享,或通过 SSH 直接写入 NAS。通过 SSH 更快,也不依赖共享是否已装载,而且很多 NAS 内置了 rsync。
sudo 吗?备份你自己的主文件夹不需要。但你需要为终端或 launchd 运行的程序授予“完全磁盘访问权限”,macOS 才会允许它读取“文稿”“桌面”和“下载”。
--delete 危险吗?它完全照你的要求做,危险就在这里。第一次先用 -n 试运行,并确保目标路径正确:带 --delete 的命令一旦打错字指向错误目录,就会删除那里的文件。
可以,这正是 rsync 的用途。再次运行,它只传输缺失或更改的内容。加上 --partial,传输到一半的大文件会被保留并续传。
下一篇:如何检查副本确实可读。