dd 和 cat 写图片文件有什么区别?

Joh*_*nst 9 linux shell dd disk-image

将图像文件写入磁盘或 U 盘时,指令通常使用dd,如下所示:

dd if=myimage.img of=/dev/sdb
Run Code Online (Sandbox Code Playgroud)

这与说:

cat myimage.img > /dev/sdb
Run Code Online (Sandbox Code Playgroud)

我意识到dd有更多选项,例如count=...,但是如果练习的目的是将整个文件写入设备,那么使用 的优势是dd什么?

Kam*_*ski 7

这个问题就像“我有一个可以画矩形的工具,另一个可以画菱形;哪一个是画正方形的正确工具?”

任何正方形都是矩形的特例和菱形的特例,因此可以使用两种工具中的任何一种。

同样是ddcat。前者可以做转换,跳过和查找,调整缓冲区大小;但在简单的情况下,它只读取一个文件(或块设备)并将原始数据写入另一个。后者可以通过一些可选的文本修改将多个文件连接到一个流中,但在简单的情况下,只有一个输入文件的内容(通过 shell 支持)流式传输到输出文件或设备。

这两种工具都是有用的,不能为了另一个而放弃。他们的范围只是在您询问的这个简单案例中重叠。


话虽如此,我认为至少有两个问题可以使dd 更好的选择成为合理的选择。

1. 阻止设备权限

要写入文件或设备,cat需要重定向其输出。您的外壳执行重定向,即打开目标文件。/dev/sdb除非您以root身份登录,否则重定向到您时可能会遇到“权限被拒绝” 。以root身份运行 shell是有风险的,应该避免。

你可以试试

sudo cat myimage.img > /dev/sdb
Run Code Online (Sandbox Code Playgroud)

并失败,因为sudo不会影响 shell 完成的输出重定向。

另一方面,这完全没有问题:

sudo dd if=myimage.img of=/dev/sdb
Run Code Online (Sandbox Code Playgroud)

顺便提一点提示:如果您发现自己必须将输出重定向到访问受限的文件,那么您可以使用以下技巧:

some_command | sudo tee restricted_file > /dev/null
Run Code Online (Sandbox Code Playgroud)

这使我们采用另一种方式来完成这项工作。该命令tee将其输入传递给多个文件和标准输出。在简单的情况下,只有一个文件并且标准输出被丢弃:

sudo tee /dev/sdb < myimage.img > /dev/null
Run Code Online (Sandbox Code Playgroud)

在这种情况下,还有不受sudo.

2. 超越简单案例

想象一下制作厨房桌子的木匠。大多数桌子都有矩形的顶面;菱形的要少得多。有一张方顶的桌子要制作。正方形是菱形,也是长方形。木匠会使用适用于稀有菱形桌子的方法吗?还是普通的长方形桌子?两组方法都应该与方桌一起使用,但是他每个工作日都制作矩形,因此改变方法没有意义。

回到catdd。在我看来(和我的实践),几乎不需要连接多个图像以将它们全部写入块设备。那绝对是cat. 该工具可以做更多的事情,但您不想要它:选项针对文本文件,因此当与图像文件一起使用时,它们可以使您的二进制数据无效。

现在,dd当我从设备读取或写入设备时,由 提供的选项通常对我有用:

  • conv=noerror– 当源可能有故障时;实际上不,不要使用conv=sync,noerror;当源代码有问题时,使用 GNUddrescue
  • bs=… – 大缓冲区不会耗尽我的硬盘;
  • count=… – 读取片段,如 MBR;
  • conv=sparse – 在某些情况下减小图像大小。

还有更多。这个命令:

kill -s USR1 $(pidof dd)
Run Code Online (Sandbox Code Playgroud)

使dd打印 I/O 统计数据为标准错误。我不认为你可以用cat.

这些是我认为dd是处理原始图像的自然工具的原因我认为cat仅仅因为在某些特殊情况下没有区别而将工具更改为没有意义,但我看到了另一个原因(如下)。我想通常使用的说明是dd因为他们的作者和我一样思考。有意识地选择正确的工具是一种优雅,尤其是当有更多看起来同样合适的工具时。

仍然dd是一个难以正确使用的胡思乱想的工具。任何人有意识地选择正确工具的能力都应该包括意识到这一事实。如果您不确定是否可以dd正确使用,那么适合您的工具可能不是dd.

如果您确定可以dd正确使用,那么请注意邓宁-克鲁格效应并再次问自己。:)


最后我承认我用过pv myimage.img | sudo tee /dev/sdb > /dev/null。我放弃了正确的工具,但pv给了我一个进度条。除非你需要连接cat什么都不给cat提供简单性并保护您免受胡思乱想dd带来的陷阱。仅出于这个原因,它可能是您正确的工具在某些情况下,它是我的正确工具。

重要的是:无论何时我使用ddcat或者任何有问题的任务,它都是一个选择工具,有意识的选择。