組み込みLinuxシステムを構築するシステムがあります。システムは3つのファイルを出力します。
- rootfsを含むtarball(カーネルモジュールを除く)
- カーネルモジュールを含むタールボール
- uimage
システムは 1 GB SD カードに配布され、10 MB は FAT ブートパーティションに割り当てられ、残りは ext4 ルートパーティションに割り当てられます。
システムに最適な出力形式は、ddを使用してSDカードに書き込むことができる画像ファイルです。 SDカードを手動でパーティション化してフォーマットし、ファイルを抽出/コピーし、ddを使用してカードの内容を読み取って画像ファイルを作成します。うまくいきますが、プロセスははるかに簡単です。
カードを表すループファイルシステムを作成し、その上にファイルシステムを作成し、その中にあるファイルを抽出/コピーすることが可能であることを知っています。試してみましたが、ある程度効果がありますが、十分ではありません。問題は、パーティションとSDカードの「形状」に関連しているようです(たとえば、ハードドライブの幾何学的構造は私が知っている限り、メモリカードには重要ではありません)。まるでパーティションが具体的でなければならないようです。カードモデルについてはよくわかりませんが、その分野の専門家はより多くの情報を提供できます。
ddを使用してSDカードにコピーできる2つのタールボールとuImageから画像を取得する正しい方法は何ですか?
答え1
SDカードが常に実際に持っているSDカードと同じサイズ(またはそれ以上)で、コピーしたい項目に1Gであれば十分であると確信している場合は、次の手順を実行できます。
- 適切なSDカードを手動でパーティション化し、パーティションを空白のままにします(ただし、必要なファイルシステムを作成します)。
- SDカード全体(たとえば
/dev/sdb
)をシステムにコピーします。dd if=/dev/sdb of=empty.image bs=4M
- 新しいSDカードを作成するたびに、空の画像を新しい画像にコピーします。
cp empty.image new.image
- これで、このファイルにループデバイスを作成します。 (これはカーネルがパーティション情報を読み取るために重要
losetup -f -P new.image
です。)-P
これにより、新しいループデバイスが作成されます(たとえば/dev/loop0
)。そしてパーティション /dev/loop0p1.../dev/loop0pn
。これで、「通常の」パーティションのようにマウントして使用できるようになります。完了したら、losetup -d /dev/loop0
通話で作成された画像を使用してSDにコピーしますdd if=new.image of=/dev/sdb bs=4M
。これらのステップはすべてプログラムできます。
編集する:
上記の2)と3)の代わりに:
また、パーティションブロック(MBRの場合)をコピーして保持することもできます(dd if=/dev/sdb of=empty_MBR bs=512 count=1
)。次に、新しいSDの場合は、スパースファイルtruncate -s 1G empty.file
(サイズ= 0)の空のファイル()を作成し、パーティションテーブルをコピーします(dd if=empty_MBR of=empty.file
)。 、デバイスループ(losetup -f -P empty.file
)を作成してパーティションをフォーマットした後、上記のように進みます。
編集2:
小さなMBRファイルを保存したくない場合は、sfdisk
スクリプトを使用することもできます(man sfdisk
またはhttps://superuser.com/questions/332252/creating-and-formating-a-partition-using-a-bash-script)。つまり、空のファイル(sa)の作成、ループデバイスの作成(パーティションなし、パーティションなし-P
)、対応するデバイスの分割sfdisk
、ループデバイスの分離、ループデバイスの再接続(パーティションを含む-P
)、および継続を意味します。