dd比猫更好吗?

假设我想将我的硬盘( hda )克隆到同一台计算机上的另一个驱动器( hdb )。 正如我所看到的,有两个简单,粗糙和自己动手的方法:

  cat / dev / hda> / dev / hdb 

  dd if = / dev / hda = / dev / hdb 

有什么技术上的原因,后者往往被认为比前者更好?

在任何情况下都不要在家里尝试这些命令,否则你的UNIX系统是被取消的

只是简单的'猫'和'dd'之间的最大区别是,dd确保所有的读写操作都是按照您指定的大小完成的。 这可能很重要,取决于你使用的是什么设备(和* nix版本)。

几点。

ltrace cat </dev/zero >/dev/null暗示默认情况下cat更高效,因为它不是memcpy,更重要的是默认使用4KiB缓冲区。

ltrace dd if=/dev/zero of=/dev/null显示dd默认使用512B缓冲区,这对于读取现代磁盘是非常低效的(尽pipe内核应该通过各种磁盘调度缓解这一点)。 但是dd比cat更可configuration,你可以使用类似bs = 2M的东西来减less系统调用的次数

dd在存在磁盘错误时是有问题的,并且可能挂起或者更重要的是忽略不可读的数据,从而破坏目标磁盘。 请考虑使用dd_rescue或ddrescue来完成此任务。

这真的是历史性的,如果你要做的就是将一个磁盘克隆到另一个磁盘上,那就不重要了。

在传统的Unix上,磁盘可以通过块设备和字符设备访问,每个都有不同的要求。 需要“dd”才能与块设备进行交互,因为“猫”只知道字符I / O。 (块I / O对于有效处理磁带驱动器等事情特别重要。)

如果您需要重新启动长时间运行的副本,则可以使用dd,因为它的跳过和查找选项。

除非你的系统仍然具有磁盘访问的块/字符区别(Linux不支持),除非你需要做交换字节之类的东西,否则'cat'会很好(可能更快,因为它会默认为比dd更大的块大小)。

需要注意的是,除非有人在上次看过的时候在shelldevise上做了一些大的修改,否则“cat foo> bar”不会通过shell写入“bar”。 所有的shell都是打开'bar'来进行截断,然后将打开的文件描述符作为文件描述符1(stdout)通过fork / exec传递给'cat'。 此时,shell已经不在循环中了,除了被通知“cat”的退出状态之外,不会再次涉及。

我认为通过pipe道发送所有数据可能会有性能损失。 DD在一个程序中完成了所有操作,并且可能已经针对块读取和写入进行了优化。

我在Ubuntu 12.04,我的经验是我可以'猫'分区(/ dev / sda1),但不是整个设备(/ dev / sda)。 我只能使用“dd”成功克隆一个设备。 不知何故,分区信息和引导扇区丢失,如果猫/ dev / sda。

如果我没有记错的话,dd在方法上更加“低级”,跳过文件系统和所有的花里胡哨的东西:)

有一次,dd从字面上挽救了我珍贵的生活:

用一个装满“绝对可逆数据”的Linux盒子,从一个承包商那里拿到了很多坏事,唯一可用的就是紧急的linux shell。 我有没有提到打开盒子来驱动器的不可能性? 啊,是的,没有USB和这样的…

然后,光! DD和FTP工作! 啊,恢复精神! 用一个整齐的命令行咒语保存你的一天(和职业生涯),以使用ftp在远程磁盘上进行备份转储。

类似于put |dd if=/dev/hda bs=4096 count= ???? 或类似…

猫没有为我工作,然后…

几乎没有什么实际的区别了。
在内部,他们都select使用几乎相同的cals。

dd对于更复杂的数据副本有许多有用的额外function,并且可能被其他用户认为是对这类任务更“正常”的。 但简单的“猫”是unix的本质,

有趣…我已经看到了过去的build议,做这种复制操作与dd,cpio,或tar,但从来没有猫的各种排列。

我一直想说这是一个猫文本导向的问题,其他的是以二进制数据为导向的,或者dd可以更加容易地处理未格式化的空间,但是nix并没有真正地进行文本/二进制的区分和复制设备文件将带有副本的文件系统,所以格式不应该是一个问题。

dd在传输数据的过程中确实有很多附加的数据转换选项,但我不希望在传输文件系统本身而不仅仅是其内容时特别相关。

你想使用dd,以便你可以指定像bsize这样的东西,这是多less读/写一次; 调整这个4k的倍数将比猫更快,我认为这将受到pipe道的限制。

dd应该更快,因为它在内部执行I / O操作,与使用stdio和shell进行I / O的cat相反。