我使用 rsync 来备份多个系统,要么备份到外部硬盘驱动器,要么通过网络备份到另一台机器。这个想法是维护原始文件系统的副本,其中包含一些内容,例如 /dev、/proc、/mnt 以及未排除的内容,然后在目的地(即使用 btrfs 或 zfs)进行快照。为此,我使用以下命令
rsync -avP --delete --exclude /dev/* --exclude /proc/* --exclude /mnt/* etc. etc. / backup@fileserver:/mnt/array/backup/machine/
效果相当好。但是,我刚刚注意到 rsync 并不能可靠地删除目标上的内容。因此,目标上的文件数量比源上任何时候存在的文件都要多,在一种情况下,备份比源大 100 GB。剩下的文件似乎大多是各种软件和库的旧版本。例如,在原始计算机上, /usr/include/qt/QtWidgets/ 包含
5.9.2
QAbstractButton
qabstractbutton.h
....
但在备份目标上,同一文件夹包含:
5.6.0
5.6.1
5.7.0
5.7.1
5.8.0
5.9.0
5.9.1
5.9.2
QAbstractButton
qabstractbutton.h
rsync 似乎可以很好地复制新文件,但忘记删除所有旧文件。奇怪的是,有些文件确实被删除了(rsync 在同步时总是报告删除了大量文件),但似乎很多文件并没有被删除。结果,我的备份占用的空间比应有的要多得多,而且由于所有额外的文件,它们可能比原始分区占用更多的空间,因此无法直接恢复,而且平面文件包数据库之类的东西都搞砸了,包含许多旧版本包的重复条目。
对这里可能发生的事情有什么想法吗?我是否需要传递一些其他标志给 rsync,以便它实际上删除它应该删除的所有内容?
答案1
一些关于尝试的建议来自手册页的内容(关于 的部分--delete
)。有很多警告和警告。这些你都考虑过了吗?
仅适用于“正在同步的目录”。我想这意味着他们必须复制父/祖先目录。
同样,它不适用于明确排除的任何内容:
--delete-excluded
除非您使用该选项或将规则标记为仅在发送端匹配,否则从传输中排除的文件也不会被删除。
如果发送方检测到任何 I/O 错误,则将自动禁止删除目的地的任何文件。用 覆盖
--ignore-errors
。先试试
--dry-run
?结合--verbose
并仔细检查问题目录中发生的所有情况。如果使用不当,此选项可能会很危险!首先尝试使用 --dry-run 选项 (-n) 运行来查看要删除哪些文件是一个非常好的主意。
因此,请考虑尝试--delete-excluded
、--ignore-errors
和/或--dry-run
/ --verbose
...不一定是“修复”,但至少可能会收集有用的数据。
另外,看看--delete-before
旗帜。这应该在实际传输之前执行接收方删除。同样,这可能无法解决所有问题,但可能会有所启发。看看它是否也有助于减少磁盘空间的使用会很有趣。