通过慢速连接修补非常大的二进制文件

通过慢速连接修补非常大的二进制文件

为了备份,我通过相对缓慢的上游连接传输了一个非常大的二进制文件(传输耗时 2 周),方法是将其 rsync 到已挂载的 cifs 共享上(这样我就可以按块访问它)。2 周后,rsync 显示错误(不幸的是无法保存它),但文件大小匹配。另外

tail -c 1000000000 myfile.img|md5sum # and
head -c 1000000000 myfile.img|md5sum

匹配,因此文件的开头和结尾是相同的。

由于我的下行速度更快,我再次下载了完整映像并对整个映像进行了 md5 求和,结果不匹配。因此,显然,这 1.5TB 中的某个地方至少有一个位不同。

有没有办法从我下载的两个文件中生成一个“补丁”,然后将其应用到远程文件上,这样只需要再次传输错误的块?

请再次注意:我没有能力远程执行代码或利用需要远程运行 rsync 的 rsync 功能。我想我仍然可以使用 rsync,它的工作量与我的下载速率成正比,但我想知道是否有更好的方法利用我本地拥有两个版本的事实。写一些东西可能并不难,但我更愿意使用经过测试的东西并节省工作量。

答案1

(假设 Linux)如果您认为只有一个数据块左右损坏,但数据块的大小没有改变,那么您可以使用cmp -l。它会逐字节进行比较,并-l给出任何差异的偏移量。如果您对文件中的起始位置有一个模糊的概念,您可以使用给出初始起始位置-i。当您的偏移量有误时,您可以使用dd skip=...它从原始文件中剪切它,并将dd seek=... conv=notrunc其粘贴到损坏的文件中。(首先在副本上进行测试)

答案2

我会使用 BitTorrent 在远程端恢复文件。该协议将文件分成小块,并自动重新下载哈希值与种子文件不匹配的块。

为了使其在私人环境中发挥作用:

  1. 在本地和远程 bit-torrent 客户端上禁用 DHT。
  2. 在防火墙上打开本地 bit-torrent 端口或设置 SSH 端口转发。
  3. 在源端创建种子文件。不要使用跟踪器。确保客户端也开始为文件做种子。
  4. 备份远端的文件。
  5. 将种子文件复制到远端并用客户端打开。
  6. 将下载位置指向损坏的文件,然后选择选项无法开始下载!! 如果可用的话,还禁用连接到 DHT、对等交换等的选项。
  7. 要求客户端重新检查已下载的文件。它应该报告几乎完成的下载百分比。
  8. 将本地客户端添加为下载的对等端
  9. 开始下载

相关内容