我不知道如何不解释就提出这个问题。假设我使用 rsync 将驱动器 a 备份到驱动器 b。驱动器 a 发生故障,所有数据都丢失,当 rsync 关闭时,它发现驱动器 a 已被删除,因此它删除了驱动器 b。
我正在尝试编写一个 rsync 脚本以避免发生这种情况。这实际上发生在我认识的某个人身上,所以这是有可能的。
答案1
在你描述的场景中(源驱动器发生故障),rsync 将不是删除任何内容,因为:
- 默认情况下,rsync 不会删除任何内容直到你传递“--delete”选项
- 甚至传递“--delete”选项,如果无法访问源磁盘,rsync 将不会删除目标文件. 来自手册页:
如果发送方检测到任何 I/O 错误,则将自动禁用目标上的任何文件删除功能。这是为了防止发送方的临时文件系统故障(例如 NFS 错误)导致目标上大量文件删除。您可以使用 --ignore-errors 选项覆盖此设置。
源故障后,清除目标数据的唯一方法是:
- 具有高级 rsync 选项的 mangle(请参阅手册页)
- 源故障导致文件系统看似一致,但却是空的(这是一个非常罕见的可能性)
无论如何,我赞成使用 rsnapshot + 硬链接的建议。我使用此设置进行备份,非常方便。
答案2
基本上,这个“你认识的人”大概使用 rsync 运行此命令:
sudo rsync -av --delete /src /target
但是,这种情况极不可能发生,除非他增加了这个--ignore-errors
选项。
无论如何,如果你只考虑源驱动器可能出现故障,你错过了备份的要点。如今,云是你的朋友。
为了回答您的问题,您可以使用的最佳解决方案是避免驱动器故障删除目标使用 rsync 的-b
选项--backup-dir=DIR
进行增量备份。例如:
sudo rsync -avb --delete --backup-dir=/backup/incremental /src /target
上面,在更新过程之前/target
,将要更新的原始文件复制到。现在要在 删除的已删除文件只需重命名并放置在 中即可。/backup/incremental
/src
/target
/backup/incremental
将使用 rsync 的第一个命令视为带有-n
=--dry-run
选项的硬拷贝:
sudo rsync -avn /src /target
答案3
哦,你可以设置 rsync 不删除无关文件。默认情况下它不会删除无关文件。因此,如果驱动器 a 中的所有文件都消失了,它们应该没问题。
https://unix.stackexchange.com/questions/5451/delete-extraneous-files-from-dest-dir-via-rsync
答案4
您可以尝试使用快照。这使用 rsync 创建基于硬链接的备份。在服务器上,可以访问多个备份而不会浪费空间。因此,当您的驱动器 A 被擦除时,只有最新的备份会“擦除”数据,但旧快照仍将保留数据。
另一件事是直接使用选项--backup
并:--backup-dir
rsync
-b,--备份
使用此选项,每个文件传输或删除时,预先存在的目标文件都会被重命名。您可以使用 --backup-dir 和 --suffix 选项控制备份文件的存放位置以及附加的后缀(如果有)。
请注意,如果你不指定 --backup-dir,则 (1) 将隐含 --omit-dir-times 选项,并且 (2) 如果 --delete 也有效(没有 --delete-excluded),rsync 将在所有现有排除项的末尾添加一个用于备份后缀的 lqprotectrq 过滤规则(例如 -f "P~”)。这将防止删除以前备份的文件。请注意,如果您提供自己的过滤规则,则可能需要手动将自己的排除/保护规则插入到列表的更高位置,以便它具有足够高的优先级才能有效(例如,如果您的规则指定了 oq 的尾随包含/排除cq,自动添加的规则永远都不会被达到)。
–备份目录=DIR
与 --backup 选项结合使用,这会告诉 rsync 将所有备份存储在接收端的指定目录中。这可用于增量备份。您还可以使用 --suffix 选项指定备份后缀(否则在指定目录中备份的文件将保留其原始文件名)。