【问题标题】:What is the best way to archive a data CD/DVD in python?在 python 中存档数据 CD/DVD 的最佳方法是什么?
【发布时间】:2013-11-12 02:16:17
【问题描述】:

我必须从 CD 和 DVD 上归档大量数据,我认为这是一个有趣的问题,人们可能会对此提出有用的意见。这是设置:

  • 该脚本将在多个平台上的多个机器上运行,所以我认为 python 将是最好的语言。如果逻辑造成瓶颈,任何其他语言都可以。
  • 我们需要归档大约 1000 张 CD 和大约 500 张 DVD,因此速度是一个关键问题
  • 数据非常有价值,因此验证会很有用
  • 光盘很旧,所以很多光盘很难或无法阅读

现在,我正计划使用 shutil.copytree 将文件转储到目录中,并比较文件树和大小。或许可以加入一个快速哈希,尽管这可能会使事情变得太慢。

所以我的具体问题是:

  • 从 CD/DVD 等慢速介质上复制文件的最快方法是什么? (或者方法是否重要)
  • 关于如何处理可能出现故障的光盘的任何建议?您如何检测有问题的光盘?

【问题讨论】:

  • 最快的做法是将这些位直接从磁盘设备复制到一个文件中,然后在一个单独的(无论是以后的,还是并发的)任务中,将每个磁盘文件解释为一个文件系统并复制文件出来。除了最大限度地减少非常慢的 CD 驱动器上的 I/O 数量外,它还有助于将物理 I/O 错误与文件系统解释错误分开。
  • 但实际上,我不会尝试从头开始进行任何验证或数据恢复,除非您的实际目标是构建 CD 恢复项目。有像 IsoBuster 之类的工具(不是背书,只是我用过的一个),它们比你不用数十个月的努力编写的任何东西都做得更好。因此,我只需将 .iso 文件存档,对每个文件运行文件系统一致性检查,列出失败的文件,然后对该列表中的所有内容使用专用工具。
  • @abarnert - 关于块级读取,而不是文件级。当我对其中一些 CD 进行试验时,我发现这是非常正确的。我尝试将 rsync 与 dd 进行比较,有几张 DVD 使用 rsync 需要 1.5 小时,使用 dd 需要 18 分钟。随着 rsync 的进行,我可以听到驱动器磁头大声来回移动(显然文件系统在这些磁盘上的布局效率不高)。我还喜欢无需再次抓取光盘即可追溯恢复文件的能力。

标签: python backup archive cd dvd


【解决方案1】:

当您逐个文件读取时,您是在磁盘周围随机搜索,这比连续数据的批量传输要慢得多。而且,由于最快的 CD 驱动器比最慢的硬盘驱动器慢几十倍(这甚至还没有计算在每个坏扇区上进行多次读取以进行纠错所造成的速度损失),因此您希望尽快从 CD 上获取数据尽可能。

当然,将存档文件保存为 .iso 文件或类似文件意味着,如果您以后改进软件,您可以重新扫描文件系统,而无需再次挖掘 CD(这可能在存储)。

同时,尝试恢复损坏的 CD 和损坏的文件系统比您想象的要复杂得多。

所以,这就是我要做的:

将光盘直接块复制到 .iso 文件(无论是在 Python 中,还是使用 dd),并记录所有失败的文件。

散列 .iso 文件,而不是文件系统。如果你真的需要散列文件系统,请记住,在散列之前压缩数据的常见优化(即tar czf - | shasum 而不仅仅是tar cf - | shasum)通常会减慢速度,即使对于易于压缩的数据也是如此 - 但你不妨在几张光盘上进行双向测试。如果您需要您的验证在法律上有用,则可能必须使用在线服务提供的带时间戳的签名,在这种情况下,压缩可能 是值得的。

对于每个成功的 .iso 文件,挂载它并使用基本的文件复制操作(无论是在 Python 中,还是使用标准 Unix 工具),并再次记录所有失败的文件。

获取免费或商业 CD 恢复工具,如 IsoBuster(不是认可,只是搜索中出现的第一个,虽然我以前成功使用过它)并使用它手动恢复所有损坏的光盘。

您可以并行执行大量此类工作 - 当每个块复制完成时,在您块复制下一个驱动器时在后台启动文件系统转储。

最后,如果您要恢复 1500 张光盘,您可能需要购买 DVD 点唱机或自动加载器。我猜新的仍然很贵,但肯定有人以便宜的价格出售旧的。 (通过在线快速搜索,首先出现的是 2500 美元的新品和 240 美元的二手......)

【讨论】:

  • 这基本上就是我最终要做的。我找到了 GNU 程序 ddrescue,它在有错误的光盘上高效地创建图像方面做得非常好。创建高质量的光盘映像,然后再解析它们绝对是要走的路。
【解决方案2】:

编写自己的备份系统并不好玩。您是否考虑过寻找即用型备份解决方案?有很多很多免费的...

如果您仍然必须自己编写...回答您的具体问题:

  • 对于 CD/DVD,您通常首先必须掌握映像(使用像 mkisofs 这样的工具),然后将映像写入介质。有一些工具可以为您包装这两种操作(我相信genisofs),但这通常是流程。

  • 要验证备份质量,您必须回读所有写入的文件(通过装入新写入的 CD)并将它们的校验和与原始文件的校验和进行比较。为了进行增量备份,您必须为您保存的每个文件保留校验和存档(包括备份日期等)。

【讨论】:

  • 抱歉,如果我在问题中的措辞不清楚,但我需要从光盘中关闭文件,而不是光盘
  • 您真的关心逐位复制相同的布局吗?如果是,您应该保存每张 CD/DVD 的二进制映像。如果没有,那么将文件复制为树就足够了(注意读取错误,为了安全起见,系统日志中的驱动程序错误)。与从慢速媒体读取相比,校验和通常并不昂贵,所以我不会担心。看起来您的下一个最大瓶颈(首先是阅读)可能是更换媒体的速度。
  • 在我最初的测试中,读取文件系统的速度其实是最大的瓶颈。将光盘作为映像读取(例如,使用 dd)需要一致的时间(约 18 分钟),而复制文件树所需的时间取决于文件写入光盘的效率。由于大多数光盘已满,因此它需要与光盘映像大约相同的时间,或者更多更长(小时)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多