ddをどのように細かく制御できますか?

ddをどのように細かく制御できますか?

64GB MicroSDカードがあります。 16GBサイズの画像を書きました。

$ sudo dd if=my_image.img of=/dev/sdb bs=4M
3798+1 records in
3798+1 records out
15931539456 bytes (16 GB, 15 GiB) copied, 657.848 s, 24.2 MB/s

ここで、ddを使用して同じ64GB SDカードの最初の15931539456バイト(16GB)画像を撮影し、開始したものと同じチェックサムを持つ画像を作成したいと思います。

私が理解したのは、上記のdd結果(3798 + 1)は、ソース画像のサイズが4Mチャンクに均等に分割されていないため、ソース画像に3798の完全な読み取りと1つの部分的な読み取りがあることを示しています。それでは、ddにSDカードの15931539456バイトを一度に4Mずつ新しいファイルにコピーするように指示しますか?

私は次のことができると仮定します。

sudo dd if=/dev/sdb of=new_image.img bs=1 count=15931539456

ただし、このような小さなバッファを使用すると、操作に時間がかかることがあります。 4Mバッファを使用し、最後に短い読み取りが発生してもXバイトのみをコピーするように指示する方法はありますか?

ベストアンサー1

さまざまな可能性:

  1. より小さく使用しますbsが、それほど小さくはないように使用してください。

    dd if=/dev/sdb of=new_image.img bs=512k count=30387
    

    これは普遍的な解決策ではありません。15931539456これは因数分解する可能性があるため、ここで機能します。

  2. 欲しいものを使いbs、詳細を読み、即座に切り取ります。

    dd if=/dev/sdb bs=4M | head -c 15931539456 >new_image.img
    

    ここでは必要ありませんcount=3799。まあ、あなたは必要ありませんdd

     head -c 15931539456 /dev/sdb >new_image.img
    

    head健全な内容を読んで正しく行動できるようにしたいです。head -cPOSIXにはコメントは必要ありません。

  3. 欲しいものを使ってbs、詳細を読んで後で切ります。

    dd if=/dev/sdb of=new_image.img bs=4M count=3799
     truncate -s 15931539456 new_image.img
    

    truncate持ち運びが簡単ではありませんが。

  4. あなたが考えているものを使い、それほどbs読んでいないので、残りを読んでくださいbs=1

     dd if=/dev/sdb of=new_image.img bs=4M count=3798
     offset=$((3798*4*1024*1024))
     remaining=$((15931539456-offset))
     dd if=/dev/sdb of=new_image.img bs=1 skip="$offset" seek="$offset" count="$remaining"
    

通常、dd部分ブロックを読み取ることができますが、それでも数が増えます(比較この回答)。ブロックデバイスから読み取るときにこれは起こらないかもしれませんが、一般的な解決策はにiflag=fullblock依存するたびに常に指定することです。残念ながら、POSIXはこれを必要とせず、サポートすることもサポートしないかもしれません。countbs1fullblockdd

おすすめ記事