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
さまざまな可能性:
より小さく使用します
bs
が、それほど小さくはないように使用してください。dd if=/dev/sdb of=new_image.img bs=512k count=30387
これは普遍的な解決策ではありません。
15931539456
これは因数分解する可能性があるため、ここで機能します。欲しいものを使い
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 -c
POSIXにはコメントは必要ありません。欲しいものを使って
bs
、詳細を読んで後で切ります。dd if=/dev/sdb of=new_image.img bs=4M count=3799 truncate -s 15931539456 new_image.img
truncate
持ち運びが簡単ではありませんが。あなたが考えているものを使い、それほど
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はこれを必要とせず、サポートすることもサポートしないかもしれません。count
bs
1
fullblock
dd