背景
我正在将一些数据 CD/DVD 复制到 ISO 文件以便稍后使用,而无需将它们放在驱动器中。
我在网上查找程序,发现了很多:
使用 来
cat
复制介质:http://www.yolinux.com/TUTORIALS/LinuxTutorialCDBurn.htmlcat /dev/sr0 > image.iso
使用 来
dd
做到这一点(显然是最广泛使用的):http://www.linuxjournal.com/content/archiving-cds-iso-commandlinedd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
使用 just
pv
来完成此操作:请参阅 参考资料man pv
获取更多信息,尽管这里是它的摘录:Taking an image of a disk, skipping errors: pv -EE /dev/sda > disk-image.img Writing an image back to a disk: pv disk-image.img > /dev/sda Zeroing a disk: pv < /dev/zero > /dev/sda
我不知道它们是否都应该是等效的,尽管我测试了其中一些(使用该工具),并且md5sum
至少是dd
pv
不是相等的。以下是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
为什么要使用其中一种而不是另一种?
简单。例如,如果您已经知道
cat
或cp
,则无需学习另一个命令。鲁棒性。这是一种简单的变体。更改命令会改变其功能的风险有多大?让我们看几个例子:
- 任何带有重定向的内容:您可能会不小心将重定向搞错,或者忘记它。由于目标应该是一个不存在的文件,因此
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 密集型进程;对性能的主要影响是缓冲区大小:该工具从源读取块,将该块写入目标,然后重复。如果块太小,计算机就会花费时间在任务之间切换。如果 chunk 太大,则读写操作无法并行化。 PC 上的最佳块大小通常约为几兆字节,但这显然非常依赖于操作系统、硬件以及计算机正在执行的其他操作。我做了基准不久前,在 Linux 上进行硬盘到硬盘的复制,这表明对于同一磁盘内的复制,
dd
具有较大的缓冲区大小有优势,但对于跨磁盘复制,cat
胜过任何dd
缓冲区大小。
dd
您经常被提及的原因有几个。除了性能之外,它们并不是特别好的理由。
- 在非常古老的 Unix 系统中,一些文本处理工具无法处理二进制数据(他们使用空终止字符串在内部,因此他们往往会遇到空字节问题;有些工具还假设字符仅使用 7 位,并且无法正确处理 8 位字符集)。我不确定这是否是一个问题
cat
(它是更多面向行的工具,如head
、sed
等),但人们倾向于在二进制数据上避免它,因为它与文本处理相关。这在 Linux、OSX、*BSD 或任何兼容 POSIX 的现代系统上不是问题。 - 有一种神话比其他工具(例如直接访问设备)
dd
稍微“低级” 。cat
这是完全错误的:dd
andcat
和tee
以及其他都从其输入读取字节并将字节写入其输出。真正的魔力在于/dev/sr0
。 dd
有一个不寻常的命令行语法,因此解释它是如何工作的,通过解释只写的东西提供了更多的机会cat /dev/sr0
。- 使用
dd
具有较大的缓冲区大小可以有更好的性能,但情况并非总是如此(请参阅Linux 上的一些基准测试)。
一个主要风险dd
是它可以默默地跳过一些数据。我认为dd
只要skip
或count
没有通过就是安全的,但我不确定是否在所有平台上都是如此。但除了性能之外,它没有任何优势。
pv
因此,如果您想要它精美的进度报告,或者cat
不需要,请使用它。
答案2
答案3
这个案例中有一些有趣的事实,特别是这些:
- 我刚刚检查了我得到并提供的输出(这次我使用了另一张光盘,确切地说是 Xubuntu 15.04 x64 安装光盘),并且两个过程(
dd
和pv
)的校验和是完全相同的。 - 我的想法是,在完成该
dd
过程后,打开驱动器并用同一张光盘将其关闭,然后用该pv
过程完成测试。这样做,我得到了两个程序相同的副本。 - 我思考我第一次得到了不同的校验和,因为出于某种原因,从 CD/DVD 驱动器收集的数据似乎在一段时间内被“记录”到其他目的(如缓存)——因此,像校验和这样的其他操作被做了比传输快很多。如果您知道具体原因,请评论。
- 另一个事实是,
dd
w/ocount=X
参数在光盘末尾正确停止,并给出与 with 相同的光盘映像pv
(校验和相同),因此对我来说最好使用dd
w/o 参数或仅使用pv
.
因此,就目前而言,它似乎pv
可以dd
完成具有相同结果的 CD/DVD 复制。