スクリプトによるデュアルパーティションSDカードイメージの作成

スクリプトによるデュアルパーティションSDカードイメージの作成

組み込み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であれば十分であると確信している場合は、次の手順を実行できます。

  1. 適切なSDカードを手動でパーティション化し、パーティションを空白のままにします(ただし、必要なファイルシステムを作成します)。
  2. SDカード全体(たとえば/dev/sdb)をシステムにコピーします。dd if=/dev/sdb of=empty.image bs=4M
  3. 新しいSDカードを作成するたびに、空の画像を新しい画像にコピーします。cp empty.image new.image
  4. これで、このファイルにループデバイスを作成します。 (これはカーネルがパーティション情報を読み取るために重要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)、および継続を意味します。

おすすめ記事