使用cat,dd,pv或其他步骤复制CD / DVD更好吗?

2021-01-24 01:02:44

我将一些数据CD / DVD复制到ISO文件中,以便以后在驱动器中不需要它们时使用它们。 使用just pv完成此操作:请参见man pv,以获取更多信息,尽管此处摘录如下: 拍摄磁盘映像,跳过错误:pv -EE / dev / sda> disk-image.img将映像写回磁盘:pv disk-image.img> / dev / sda归零磁盘:pv< / dev / zero> / dev / sda 尽管我测试了其中一些(使用md5sum工具),但至少dd和pv不等效,我不知道它们是否应该等效。 这是使用每个过程的驱动器和生成的文件的md5sum: 编辑:该输出是从另一张CD而不是给定的输出。 实际上,我意识到我提供了一些有趣的事实作为答案。 因此,是否有最佳的过程来复制CD / DVD,或者我只是错误地使用了命令? 这是有关我用于检查到目前为止找到的过程的测试用例的更多信息:

文件大小是否相同? cmp file1 file2的结果?您是否在使用dd时使用了错误的count =(或者实际上根本不需要任何计数,如果您想要整个东西,那是没有必要的?)。读取dmesg中的错误? –弗罗斯特

不用说,不同大小的文件(具有99.9999999999 +%的概率)将具有不同的校验和。只要您完成了测试,如果您要发布所有结果,最好包括(1)您使用的确切dd命令(什么是块大小?什么计数?),(2)大小所有输出的校验和,以及(3)关于源光盘上数据量的任何独立信息。 …………………………为什么在dd上使用count =?您想复制整个磁盘映像,不是吗? count =表示"复制很多,然后停止"。 –斯科特

@Scott在此页面linuxjournal.com/content/archiving-cds-iso-commandline中,作者说一个人应该使用isoinfo -d -i / dev / cdrom来知道并使用计数-实际上,他说一个人应该#39;仅使用dd。 "无论如何,如果您想要该CD的正确ISO映像,则需要在创建映像之前正确获取块大小和块计数。 – user129371

@frostschutz在第一种情况下,大小并不相同,但是令人惊讶的是,我再次尝试并得到了不同的结果。请参阅我提供的答案以获取更多详细信息。 – user129371

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

cat / dev / sr0> image.isocat< / dev / sr0> image.isotee< / dev / sr0> image.isodd< / dev / sr0> image.isodd if = / dev / cdrom = image.isopv< / dev / sr0> image.isocp / dev / sr0 image.isotail -c +1 / dev / sr0> image.iso

简单。例如,如果您已经知道cat或cp,则无需学习其他命令。

坚固性。这有点简单。更改命令将更改其功能有多少风险?让我们看几个例子:

与重定向有关的任何事情:您可能会不小心将重定向错误地绕了过来,或者忘记了。由于目标应该是不存在的文件,所以设置-o noclobber应该确保您不会覆盖任何内容;但是,如果不小心写> / dev / sda(对于CD,它是只读的,当然没有危险),则可能会覆盖设备。相对于tee< / dev / sr0> image.iso(如果您颠倒了重定向或忘记了重定向),这代表cat / dev / sr0> image.iso(很难以破坏性的方式出错)表示支持输入一,tee将写入/ dev / sr0)。

dd:i和o靠近键盘,有些不寻常。没有等效的noclobber,of =会愉快地覆盖任何内容。重定向语法不太容易出错。

cp:如果不小心交换了源和目标,则该设备将被覆盖(同样,假设是非只读设备)。如果使用某些人通过别名添加的-R或-a之类的选项调用cp,它将复制设备节点而不是设备内容。

附加功能。 pv具有强大的报告选项,是其中一种有用的附加功能的工具。但是在这里您仍然可以通过查看输出文件的大小来检查已复制了多少。

性能。这是一个受I / O约束的过程。影响性能的主要因素是缓冲区大小:该工具从源读取块,将块写入目标,然后重复。如果块太小,计算机将花费时间在任务之间进行切换。如果块太大,则无法并行执行读取和写入操作。 PC上的最佳块大小通常约为几兆字节,但这显然非常取决于操作系统,硬件以及计算机在做什么。不久前,我在Linux上对硬盘到硬盘的副本进行了基准测试,结果表明,对于同一磁盘中的副本,具有较大缓冲区大小的dd有优势,但是对于跨磁盘副本,cat胜过任何dd缓冲区尺寸。

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

在非常老的Unix系统中,某些文本处理工具无法处理二进制数据(它们内部使用了以null终止的字符串,因此它们在使用null字节时往往会遇到问题;某些工具还假定字符仅使用7位,而没有使用#39; t正确处理8位字符集)。我不确定这是否是cat的问题(它是使用更多面向行的工具,例如head,sed等),但是人们倾向于避免在二进制数据上使用它,因为它与文本处理相关联。在现代系统(例如Linux,OSX,* BSD或任何符合POSIX的系统)上,这不是问题。

有种说法,dd比cat之类的其他工具要“低级”,并且可以直接访问设备。这完全是错误的:dd和cat和tee以及其他所有对象都从其输入读取字节,并将字节写入其输出。真正的魔力在/ dev / sr0中。

dd具有不寻常的命令行语法,因此,通过解释仅编写cat / dev / sr0的内容,解释其工作方式将为您提供更多的闪耀机会。

使用具有较大缓冲区大小的dd可以具有更好的性能,但并非总是如此(请参阅Linux上的一些基准测试)。

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

因此,如果您要查看pv的进度报告,请使用pv;如果不希望使用pv,请使用cat。

非常感谢您抽出宝贵时间写此回复! =)现在,我了解了它们之间的区别。只是一个问题:pv< / dev / sr0> image.iso与pv / dev / sr0>相同。 image.iso(后者可在pv的手册页中找到)? – user129371

@ JBFWP286他们复制相同的内容,但是pv / dev / sr0…可以在进度报告中包含文件名,而pv< / dev / sr0不能。 吉尔斯-别再邪恶了

@ JBFWP286设备节点是一个文件,您可以通过该文件访问硬件或内核驱动程序提供的其他特殊功能。 / dev中的几乎所有文件都是设备节点。例如,cp -R / dev / sr0 image.iso将使image.iso成为可通过其访问CD驱动器的文件,就像/ dev / sr0一样,而不是包含包含所获取CD内容副本的常规文件。使用cp / dev / sr0 image.iso。 吉尔斯-别再邪恶了

@Hashim我不能断定它具有更好的性能。我提到它有时会有更好的性能。我已经与我建立的基准建立了联系-在最好的情况下,dd击败cat,但幅度很小。 吉尔斯-别再邪恶了

@RichVel您可能是对的,我不确定猫。诸如head,sed等面向行的工具确实确实存在使用空字节的麻烦,但是用汇编语言编写的原始无选项猫没有,V7和BSD C实现也没有。 吉尔斯-别再邪恶了

我刚刚检查了我得到和提供的输出(这次我使用的是另一张光盘,恰好是Xubuntu 15.04 x64安装光盘),并且在两个过程(dd和pv)中,校验和都是相同的。

我的想法是,在执行dd过程之后,打开驱动器并用同一张光盘将其关闭,然后使用pv过程完成测试。这样做,我得到了两个过程的相同副本。

我认为我是第一次获得不同的校验和,因为出于某种原因,从CD / DVD驱动器收集的数据似乎已被“记录”。转移到其他目的一段时间(例如缓存)-因此,使诸如校验和之类的其他操作比传输要快得多。如果您知道确切原因,请发表评论。

另一个事实是dd w / o count = X参数在光盘末尾正确停止,并且提供了与pv相同的光盘映像(校验和相同),因此对我来说,使用dd w / o参数或只是PV。 因此,目前看来,pv和dd可以完成CD / DVD复制并获得相同的结果。 点击“发布答案”,即表示您同意我们的服务条款,隐私政策和Cookie政策