dd,使用一种块大小进行查找,使用另一种块大小进行写入

dd,使用一种块大小进行查找,使用另一种块大小进行写入

背景信息:

  • 将一些 .bin 文件复制到 SD 卡(由嵌入式设备读取,无文件系统)
  • 调试卡需要擦除某些段(即清零),并将二进制文件复制到其他段
  • 使用 subprocess 模块从 python 脚本调用 dd (因为涉及的 dd 操作是由一种需要首先解析和验证的配置脚本触发的,我还让用户确认该操作,因为它们可能会擦除一个重要的磁盘,被误认为是SD卡)

问题:

bs=512 时,写入 SD 卡的速度很慢。对于大跨度,bs=8M 速度要快得多。

是否可以以某种方式“bs=512eek={n_small_blocks}”,然后更改为“bs=8M”以进行实际写入(一旦我已经搜索到正确的位置)?

我找到了以下资源: http://www.delorie.com/gnu/docs/textutils/coreutils_65.html

但我不清楚为什么需要两次调用,以及它们如何协同工作来完成指南声称的任务。


更新

在这里找到了答案:

https://superuser.com/questions/380717/how-to-output-file-from-the-specified-offset-but-not-dd-bs-1-skip-n

请参阅下面我的完整解决方案

答案1

解决方案:

dd if='input_file.bin'           \
   of='/dev/sd{X}'               \
   bs={desired write block size} \
   seek={start offset in bytes}  \
   count={write size in bytes}   \
   oflag=seek_bytes              \
   iflag=count_bytes

从手册页:

count_bytes
    treat 'count=N' as a byte count (iflag only)

...

seek_bytes
    treat 'seek=N' as a byte count (oflag only)

这似乎确实会减慢传输速度,但至少以 MB/s 为单位,而不是 kB/s。另外,请务必检查系统上的手册页,因为网络上可用的手册页(即谷歌搜索“man dd”)似乎不包含这些选项。

相关内容