web-dev-qa-db-ja.com

dd、1つのブロックサイズでシークし、別のブロックサイズで書き込みます

背景情報:

  • 一部の.binファイルをSDカードにコピーする(組み込みデバイスで読み取るため、ファイルシステムなし)
  • カードを試運転するには、一部のセグメントをワイプ(つまりゼロ化)する必要があり、他のセグメントにはバイナリファイルをコピーする必要があります
  • サブプロセスモジュールを使用してpythonスクリプトからddを呼び出す(関連するdd操作は、最初に解析および検証する必要がある一種の構成スクリプトによってトリガーされるため、ユーザーに操作を確認させます。 SDカードと間違えられた重要なディスクを一掃する可能性があるため)

問題:

SDカードへの書き込みはbs = 512で遅いです。スパンが大きい場合、bs = 8Mの方がはるかに高速です。

どういうわけか 'bs = 512 seek = {n_small_blocks}'にしてから、実際の書き込みのために 'bs = 8M'に変更することは可能ですか(正しい位置にシークした後)?

次のリソースが見つかりました: http://www.delorie.com/gnu/docs/textutils/coreutils_65.html

しかし、なぜ2回の呼び出しが必要なのか、ガイドが主張することを達成するためにそれらがどのように連携しているのかは私にはわかりません。


[〜#〜]更新[〜#〜]

ここで答えを見つけました:

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

以下の私の完全な解決策を参照してください

6
user373884

解決策:

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

manページから:

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

...

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

これは転送を少し遅くするように見えますが、少なくともkB/sではなくMB/sで転送します。また、システムのmanページを必ず確認してください。Webで入手できるページ(つまり、グーグル 'man dd')には、これらのオプションが含まれていないようです。

5
user373884