使用 cat、dd、pv 或其他程序复制 CD/DVD 是否更好?

使用 cat、dd、pv 或其他程序复制 CD/DVD 是否更好?

背景

我正在将一些数据 CD/DVD 复制到 ISO 文件以便稍后使用,而无需将它们放在驱动器中。

我在网上查找程序,发现了很多:

我不知道它们是否都应该是等效的,尽管我测试了其中一些(使用该工具),并且md5sum至少是ddpv不是相等的。以下是md5sum使用每个过程的驱动器和生成的文件:

dd过程的md5:71b676875b0194495060b38f35237c3c

pv程序的md5:f3524d81fdeeef962b01e1d86e6acc04

编辑:该输出来自另一张 CD,而不是给定的输出。事实上,我意识到我提供了一些有趣的事实作为答案。

其实每个文件的大小是不同的相互比较。

那么,是否有复制 CD/DVD 的最佳程序,或者我只是错误地使用了命令?


有关情况的更多信息

以下是有关我用来检查迄今为止找到的过程的测试用例的更多信息:

isoinfo -d i /dev/sr0 输出:https://gist.github.com/JBFWP286/7f50f069dc5d1593ba62#file-isoinfo-output-19-aug-2015

dd复制媒体,并输出校验和和文件信息输出:https://gist.github.com/JBFWP286/75decda0a67605590d32#file-dd-output-with-md5-and-sha256-19-aug-2015

pv复制媒体,并输出校验和和文件信息输出:https://gist.github.com/JBFWP286/700a13fe0a2f06ce5e7a#file-pv-output-with-md5-and-sha256-19-aug-2015

任何帮助将不胜感激!

答案1

以下所有命令都是等效的。他们读取 CD 的字节/dev/sr0并将其写入名为image.iso.

cat /dev/sr0 >image.iso
cat </dev/sr0 >image.iso
tee </dev/sr0 >image.iso
dd </dev/sr0 >image.iso
dd if=/dev/cdrom of=image.iso
pv </dev/sr0 >image.iso
cp /dev/sr0 image.iso
tail -c +1 /dev/sr0 >image.iso

为什么要使用其中一种而不是另一种?

  • 简单。例如,如果您已经知道catcp,则无需学习另一个命令。

  • 鲁棒性。这是一种简单的变体。更改命令会改变其功能的风险有多大?让我们看几个例子:

    • 任何带有重定向的内容:您可能会不小心将重定向搞错,或者忘记它。由于目标应该是一个不存在的文件,因此set -o noclobber应确保您不会覆盖任何内容;但是,如果您不小心写入,则可能会覆盖设备>/dev/sda(对于只读 CD,当然没有风险)。这有利于cat /dev/sr0 >image.iso(很难以破坏性的方式犯错)而不是诸如tee </dev/sr0 >image.iso(如果您反转重定向或忘记输入,tee将写入/dev/sr0)等替代方案。
    • cat:您可能会意外连接两个文件。这使得数据可以轻松挽救。
    • ddio离键盘很近,有些不寻常。没有相当于noclobber,of=会很乐意覆盖任何东西。重定向语法不太容易出错。
    • cp:如果您不小心交换了源和目标,设备将被覆盖(再次假设是非只读设备)。如果使用某些选项(例如某些人通过别名添加的选项)cp调用,它将复制设备节点而不是设备内容。-R-a
  • 附加功能。这里具有有用附加功能的工具是pv,具有强大的报告选项。
    但在这里您可以通过查看输出文件的大小来检查已复制了多少内容。

  • 表现。这是一个 I/O 密集型进程;对性能的主要影响是缓冲区大小:该工具从源读取块,将该块写入目标,然后重复。如果块太小,计算机就会花费时间在任务之间切换。如果 chunk 太大,则读写操作无法并行化。 PC 上的最佳块大小通常约为几兆字节,但这显然非常依赖于操作系统、硬件以及计算机正在执行的其他操作。我做了基准不久前,在 Linux 上进行硬盘到硬盘的复制,这表明对于同一磁盘内的复制,dd 具有较大的缓冲区大小有优势,但对于跨磁盘复制,cat胜过任何dd缓冲区大小。

dd您经常被提及的原因有几个。除了性能之外,它们并不是特别好的理由。

  • 在非常古老的 Unix 系统中,一些文本处理工具无法处理二进制数据(他们使用空终止字符串在内部,因此他们往往会遇到空字节问题;有些工具还假设字符仅使用 7 位,并且无法正确处理 8 位字符集)。我不确定这是否是一个问题cat(它是更多面向行的工具,如headsed等),但人们倾向于在二进制数据上避免它,因为它与文本处理相关。这在 Linux、OSX、*BSD 或任何兼容 POSIX 的现代系统上不是问题。
  • 有一种神话比其他工具(例如直接访问设备)dd稍微“低级” 。cat这是完全错误的:ddandcattee以及其他都从其输入读取字节并将字节写入其输出。真正的魔力在于/dev/sr0
  • dd有一个不寻常的命令行语法,因此解释它是如何工作的,通过解释只写的东西提供了更多的机会cat /dev/sr0
  • 使用dd 具有较大的缓冲区大小可以有更好的性能,但情况并非总是如此(请参阅Linux 上的一些基准测试)。

一个主要风险dd它可以默默地跳过一些数据。我认为dd只要skipcount没有通过就是安全的,但我不确定是否在所有平台上都是如此。但除了性能之外,它没有任何优势。

pv因此,如果您想要它精美的进度报告,或者cat不需要,请使用它。

答案2

人们应该更喜欢对读取错误更可靠的工具,而不是使用像cat或 这样的通用工具dd

  • 解救
  • 读CD(内置 CD/DVD 驱动器的纠错/重试机制)

另外,它们的默认设置比egdd的更合适。

答案3

这个案例中有一些有趣的事实,特别是这些:

  • 我刚刚检查了我得到并提供的输出(这次我使用了另一张光盘,确切地说是 Xubuntu 15.04 x64 安装光盘),并且两个过程(ddpv)的校验和是完全相同的
  • 我的想法是,在完成该dd过程后,打开驱动器并用同一张光盘将其关闭,然后用该pv过程完成测试。这样做,我得到了两个程序相同的副本。
  • 思考我第一次得到了不同的校验和,因为出于某种原因,从 CD/DVD 驱动器收集的数据似乎在一段时间内被“记录”到其他目的(如缓存)——因此,像校验和这样的其他操作被做了比传输快很多。如果您知道具体原因,请评论。
  • 另一个事实是,ddw/ocount=X参数在光盘末尾正确停止,并给出与 with 相同的光盘映像pv(校验和相同),因此对我来说最好使用ddw/o 参数或仅使用pv.

因此,就目前而言,它似乎pv可以dd完成具有相同结果的 CD/DVD 复制。

相关内容