有时我会在网上看到“确保你设置 'bs=' 因为默认值会花费太长时间”的评论,以及我自己非常不科学的经验,“这似乎比其他人花费的时间更长上周时间”似乎证明了这一点。因此,每当我使用“dd”(通常在 1-2GB 范围内)时,我都会确保指定 bytes 参数。大约有一半的时间我使用我从中复制的任何在线指南中指定的值;剩下的时间我会从'fdisk -l'列表中选择一些有意义的数字,我认为是较慢的媒体(例如我正在写入的SD卡)。
对于给定的情况(媒体类型、总线大小或其他重要事项),有没有办法确定“最佳”值?容易确定吗?如果没有,是否有一种简单的方法可以达到 90-95%?或者“只选择大于 512 的东西”甚至是正确答案?
我想过自己尝试这个实验,但是(除了工作量很大)我不确定哪些因素会影响答案,所以我不知道如何设计一个好的实验。
简短版本:在什么情况下可以dd安全地用于复制数据,安全意味着不存在由于部分读取或写入而导致损坏的风险?
长版本 — 序言: dd通常用于复制数据,尤其是从设备复制数据或向设备复制数据(示例)。有时将其归因于能够以比其他工具更低的级别访问设备的神秘特性(实际上是设备文件在发挥作用)——但dd if=/dev/sda与cat /dev/sda. dd有时被认为更快,但cat在实践中可以击败它。尽管如此,它dd具有独特的特性,使其有时真正有用。
问题: dd if=foo of=bar实际上与cat <foo >bar. 在大多数 unices¹ 上,dd对read(). (我发现POSIX在什么构成“读取输入块”方面很模糊dd。)如果read()返回部分结果(根据 POSIX 和其他参考文档,除非实现文档另有说明,否则允许这样做),则复制部分块。存在完全相同的问题write()。
观察:在实践中,我发现dd可以处理块设备和常规文件,但这可能只是我没有太多练习。说到管道,不难找dd错;例如试试这个代码:
yes | dd of=out bs=1024k count=10
Run Code Online (Sandbox Code Playgroud)
并检查out文件的大小(它可能远低于 10MB)。
问题:在什么情况下可以dd安全地用于复制数据?换句话说,在块大小、实现、文件类型等方面的哪些条件可以确保dd将复制所有数据?
(GNU dd有一个 …
我想知道是否可以将磁盘映像文件直接写入分区而不先将其另存为文件。就像是
dd if="http://diskimages.com/i_am_a_disk_image.img" of=/dev/sdb1 bs=2M
Run Code Online (Sandbox Code Playgroud)
我也会接受 C 或 Python 的答案,因为我知道如何编译它们。
我正在使用dd以下命令从 NFS 挂载复制大文件:
dd if=/mnt/nfs/image.img of=/dev/sda
Run Code Online (Sandbox Code Playgroud)
我需要限制从 NFS 读取的速度。我怎样才能实现它?唯一的先决条件是使用一些易于编译的实用程序,以便将其放入我的自定义 ram-only live linux 发行版中。
我需要创建一个 USB 驱动器分区的映像:
dd if=/dev/sdb1 of=sdb1.img
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有 sudo/su 的情况下做到这一点?也许通过更改 USB 驱动器上的权限?会有什么安全影响?
我希望克隆一个大磁盘(一个 500GB 的 SSD,物有所值),并且我倾向于使用cat,正如 Gilles在这里建议的那样。但是让我停下来的是我真的不知道cat读取错误时会发生什么。我知道dd在这些情况下的行为方式,即命令
dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress
Run Code Online (Sandbox Code Playgroud)
不会因读取错误而停止,并用零(sync选项)填充读取错误,以便数据保持同步。不幸的是,它是通过在要写入的块末尾填充零来实现的,因此早期 512 字节读取中的单个错误会弄乱整个 64K 数据(对于更大、更快的块大小更糟)。
所以我想知道:我可以做得更好/不同cat吗?或者我应该继续使用Clonezilla吗?