当备份文件时,如果这些文件仅存在于源文件中,如何让 ddrescue 与 rsync 一起运行以拯救不可读的文件?
我认为在备份磁盘上运行的主要程序必须与用于盘片磁盘的 ddrescue“合并”。
我有很多磁盘出现故障。我想挽救这些文件,因为它们可能不存在于其他地方。
我想将 rsync 与 ddrescue 合并。如果我的磁盘上有数百万个文件,检查所有文件的输入/输出错误并手动修复它们会很麻烦。
当出现输入/输出错误时,如何让 rsync 运行 ddrescue?
答案1
如果源媒体不稳定,请先解决该问题(转储并替换它,或从备份中恢复,无论如何),然后再执行任何其他操作,包括定期备份,使用 rsync 或其他任何方式。
ddrescue
并非设计为标准备份程序的一部分,也不建议将其用于任何常规程序。它用于块设备恢复仅有的。
dd
如果您想在备份过程中转储块设备的映像,请使用它,如果它引发任何错误,您就知道,是时候使用这些备份了。
说到备份,我不认为 rsync 可以单独被视为备份工具。以前的备份快照的历史记录在哪里(这样您就可以存储多个过去版本的数据,例如昨天、两天前、一周前和一个月前,所有版本都可用)?它们的清理在哪里?问题报告在哪里?它可以成为备份解决方案的一部分,该解决方案可以完成所有这些工作并使用 rsync 传输文件,但不能单独使用。与 RAID 一样,rsync 不是备份 — 而是一个纯粹的同步工具,这次是在文件级别。
答案2
免责声明:如果您尝试恢复有价值的东西,请使用正确的工具。ddrescue
在尝试恢复之前,使用磁盘的完整映像是正确的方法。使用正确的工具!
然而,你可能正在寻找:
rsync --partial
即使源上出现读取错误,它也会将文件保留在目标中(而不是删除尝试的副本)。这与 的行为相匹配scp
。
--ignore-errors
可能会产生类似的副作用,--partial
但值得注意的是,它还具有其他副作用,例如,如果您还使用--remove-sent-files
或,则会从源位置删除文件--remove-source-files
(这可能不是您想要的 - 特别是如果您后来意识到您想尝试ddrescue
特定的损坏文件)。我确信还有其他副作用。
rsync
和与scp
块级工具几乎没有任何共同之处ddrescue
,因此它们会将文件截断为第一次读取错误,但rsync
随后会删除部分复制的文件,除非您要求通过标志保留它--partial
。
如果您只想复制一个文件(不会被截断为第一次读取错误),您实际上可以使用ddrescue
:
ddrescue --sparse ./corrupt-file ./recovered-file
或者dd
:
dd if=corrupt-file of=recovered-file conv=noerror,sync
truncate --reference corrupt-file recovered-file
但ddrescue
在重试失败的块方面做得更好!
如果您有足够的耐心进行数百次重试,现代磁盘实际上非常擅长恢复坏块。
但是,上述结果可能不如使用ddrescue
整个分区,因为文件系统会阻碍并阻止读取部分损坏的块(即,即使只有一个少量或一个部门那是腐败的整个堵塞将会出现读取错误)
为了更直接地回答您的问题,您可以将 stderr 导入rsync
,sed
然后ddrescue
对每个失败的文件运行,然后rsync
使用恢复的文件替换部分文件。