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
什么?
这个问题就像“我有一个可以画矩形的工具,另一个可以画菱形;哪一个是画正方形的正确工具?”
任何正方形都是矩形的特例和菱形的特例,因此可以使用两种工具中的任何一种。
同样是dd
和cat
。前者可以做转换,跳过和查找,调整缓冲区大小;但在简单的情况下,它只读取一个文件(或块设备)并将原始数据写入另一个。后者可以通过一些可选的文本修改将多个文件连接到一个流中,但在简单的情况下,只有一个输入文件的内容(通过 shell 支持)流式传输到输出文件或设备。
这两种工具都是有用的,不能为了另一个而放弃。他们的范围只是在您询问的这个简单案例中重叠。
话虽如此,我认为至少有两个问题可以使dd
更好的选择成为合理的选择。
要写入文件或设备,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
.
想象一下制作厨房桌子的木匠。大多数桌子都有矩形的顶面;菱形的要少得多。有一张方顶的桌子要制作。正方形是菱形,也是长方形。木匠会使用适用于稀有菱形桌子的方法吗?还是普通的长方形桌子?两组方法都应该与方桌一起使用,但是他每个工作日都制作矩形,因此改变方法没有意义。
回到cat
和dd
。在我看来(和我的实践),几乎不需要连接多个图像以将它们全部写入块设备。那绝对是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
带来的陷阱。仅出于这个原因,它可能是您正确的工具。在某些情况下,它是我的正确工具。
重要的是:无论何时我使用dd
,cat
或者任何有问题的任务,它都是一个选择的工具,有意识的选择。
归档时间: |
|
查看次数: |
5126 次 |
最近记录: |