有时我会在网上看到“确保你设置 '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有一个 …
我正在为嵌入式系统构建磁盘映像(放置在 4GB SD 卡上)。我希望系统有两个分区。一个“根”(200Mb) 和一个“数据”分区(800Mb)。
我用 dd 创建了一个空的 1GB 文件。然后我使用 parted 来设置分区。我将它们每个都安装在一个循环设备中,然后将它们格式化;ext2 代表“根” ext4 代表“数据”。将我的根文件系统添加到“Root”分区并将“Data”留空。
这就是问题所在。我现在被困在一个 1GB 的图像上,上面只有 200MB 的数据。理论上,我不应该能够将图像截断为 .. 201MB 并且仍然可以安装文件系统吗?不幸的是,我没有发现这种情况。
我记得过去曾使用过 Freescale 的构建环境,该环境用于创建 30Mb 图像,该环境将具有使用整个 4GB sdcard 的分区。不幸的是,此时,我无法找到他们是如何做到的。
我已经阅读了 ext 文件系统的磁盘格式,如果第一个超级块之后没有任何数据(备份超级块和未使用的块表除外),我想我可以在那里截断。
不幸的是,当我这样做时,安装系统吓坏了。然后我可以运行 FSCK,恢复超级块和块表,然后可以挂载它就没有问题了。我只是不认为那应该是必要的。
也许不同的文件系统可以工作?有任何想法吗?
谢谢,
编辑
更改分区以读取文件系统。分区仍然存在并且没有改变,但是截断图像后文件系统被破坏了。
编辑
我发现这种情况是,当我将文件截断到刚好大于第一组“数据”分区超级块和索引节点/块表的大小时,(在数据块范围内的某处)文件系统无需执行即可卸载一个 fsck 来恢复其余的超级块和块/inode 表
在我的机器上,fdisk -lu /dev/sda
显示以下输出:
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 73947135 36972544 83 Linux
/dev/sda2 73949182 78139391 2095105 5 Extended
/dev/sda5 73949184 78139391 2095104 82 Linux swap / Solaris
Run Code Online (Sandbox Code Playgroud)
这个“块”单位是什么?一个“fdisk 块”是 1KiB 吗?这个单位从哪里来?