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

49 linux dd cat disk-image pv

背景

我正在将一些数据 CD/DVD 复制到 ISO 文件中,以便以后在驱动器中不需要它们的情况下使用它们。

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

我不知道是不是所有的人都应该是等价的,虽然我测试了其中的一些(使用md5sum工具)和,至少,dd并且pv等价的。以下是md5sum使用每个过程的驱动器和生成的文件:

dd程序的md5: 71b676875b0194495060b38f35237c3c

光伏程序的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

任何帮助将不胜感激!

Gil*_*il' 71

以下所有命令都是等效的。他们读取 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
Run Code Online (Sandbox Code Playgroud)

你为什么要使用一个?

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

  • 稳健性。这是一种简单的变体。改变命令会改变它的作用有多大的风险?让我们看几个例子:

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

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

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

  • 在非常老的 Unix 系统中,一些文本处理工具无法处理二进制数据(它们内部使用以空字符结尾的字符串,因此它们往往会出现空字节的问题;一些工具还假设字符仅使用 7 位而没有正确处理 8 位字符集)。我不知道这曾是一个问题cat(这是与更多的面向行的工具,如headsed等),但人们往往避免它,因为它与文本处理关联的二进制数据。这在 Linux、OSX、*BSD 或任何符合 POSIX 标准的现代系统上都不是问题。
  • 有一种神话dd比其他工具(例如cat直接访问设备)“低级”一些。这是完全错误的:ddand catandtee和其他人都从他们的输入读取字节并将字节写入他们的输出。真正的魔法在/dev/sr0
  • dd有一个不寻常的命令行语法,所以解释它是如何工作的,通过解释一些只写cat /dev/sr0.
  • 使用dd 大缓冲区大小可以获得更好的性能,但情况并非总是如此(请参阅Linux 上的一些基准测试)。

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

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

  • @JBFWP286 他们复制同样的东西,但是 `pv /dev/sr0 ...` 可以在进度报告中包含文件名,而 `pv &lt;/dev/sr0` 不能。 (2认同)
  • @JBFWP286 [设备节点](https://en.wikipedia.org/wiki/Device_file) 是一个文件,您可以通过它访问硬件或内核驱动程序提供的其他特殊功能。/dev 中的几乎所有文件都是设备节点。例如`cp -R /dev/sr0 image.iso`会使`image.iso`成为访问CD驱动器的文件,就像`/dev/sr0`一样,而不是包含内容副本的常规文件使用 `cp /dev/sr0 image.iso` 获得的 CD。 (2认同)
  • @RichVel 你可能是对的,我不确定`cat`。面向行的工具如`head`、`sed`等肯定有空字节的问题,但是【原来用汇编写的无选项`cat`】(http://minnie.tuhs.org/cgi-bin /utree.pl?file=V2/cmd/cat.s) 没有,[V7](http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src) 也没有/cmd/cat.c) 和 [BSD](http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/src/bin/cat/cat.c) C 实现。 (2认同)
  • 您还可以通过按 CTRL+T -- 使用 cp 来检查状态,在 OS X 上,它会提供 % 的副本;使用 dd 显示复制的字节数和传输速率。 (2认同)

jof*_*fel 9

与其使用cat或等通用工具dd,不如选择对读取错误更可靠的工具,例如

  • 救援
  • readcd(内置 CD/DVD 驱动器的错误纠正/重试机制)

此外,它们的默认设置比 eg 更合适dd


小智 5

在这种情况下有一些有趣的事实,特别是这些:

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

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