web-dev-qa-db-ja.com

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

組み込みLinuxシステムを生成するシステムがあります。システムは3つのファイルを出力します。

  • カーネルモジュールを除くrootfsを含むtarball
  • カーネルモジュールを含むtarball
  • uImage

システムは1GBのSDカードに展開され、そのうちの10 MBはFATブートパーティションに割り当てられ、残りはext4ルートパーティションに割り当てられます。

システムに最適な出力形式は、ddを使用してSDカードに書き込むことができる画像ファイルです。現在、そのイメージファイルは、SDカードを手動でパーティション分割およびフォーマットし、そのファイルを抽出/コピーしてから、ddを使用してカードの内容を読み取ることによって作成されます。それは機能しますが、プロセスははるかに簡単になる可能性があります。

カードを表すループファイルシステムを作成し、その上にファイルシステムを作成してから、それらのファイルを抽出/コピーすることが可能であることを私は知っています。私はそれを試しました、そしてそれはある程度は機能しますが、十分ではありません。この問題は、SDカードのパーティション分割と「ジオメトリ」(ハードディスクのジオメトリのように、メモリカードの場合は問題にならないはずです)に関連しているようです。パーティショニングがカードのモデルに固有である必要があるが、それ以上のことを言うにはその分野の専門家ではありません。

2つのtarballとuImageから、ddを使用してSDカードにコピーできるイメージに移動する適切な方法は何でしょうか。

2
TheAG

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を呼び出し、dd if=new.image of=/dev/sdb bs=4Mを使用して作成したイメージをSDにコピーします。これらのすべてのステップが実行される可能性があります。

編集:

上記の2)と3)の代わりに:

パーティションブロック(MBRの場合)のみをコピーして保持することもできます(dd if=/dev/sdb of=empty_MBR bs=512 count=1)。次に、新しいSDの場合、スパースファイル(size = 0)である空のファイル(truncate -s 1G empty.file)を停止し、パーティションテーブル(dd if=empty_MBR of=empty.file)をコピーし、ループデバイス(losetup -f -P empty.file)を作成し、パーティションをフォーマットして、上記のように続行します。

Edit2:

小さなMBRファイルを保持したくない場合は、スクリプト化されたsfdiskを使用することもできます(man sfdiskまたは https://superuser.com/questions/332252/creating-andを参照) -formatting-a-partition-using-a-bash-script )。つまり、空のファイル(s.a.)を作成し、ループデバイスを作成し(パーティションなし、-Pなし)、そのデバイスをsfdiskでパーティション分割し、ループデバイスをデタッチし、ループデバイスを再接続し(パーティション-Pあり)、続行します。

0
ridgy