組み込みLinuxシステムを生成するシステムがあります。システムは3つのファイルを出力します。
システムは1GBのSDカードに展開され、そのうちの10 MBはFATブートパーティションに割り当てられ、残りはext4ルートパーティションに割り当てられます。
システムに最適な出力形式は、ddを使用してSDカードに書き込むことができる画像ファイルです。現在、そのイメージファイルは、SDカードを手動でパーティション分割およびフォーマットし、そのファイルを抽出/コピーしてから、ddを使用してカードの内容を読み取ることによって作成されます。それは機能しますが、プロセスははるかに簡単になる可能性があります。
カードを表すループファイルシステムを作成し、その上にファイルシステムを作成してから、それらのファイルを抽出/コピーすることが可能であることを私は知っています。私はそれを試しました、そしてそれはある程度は機能しますが、十分ではありません。この問題は、SDカードのパーティション分割と「ジオメトリ」(ハードディスクのジオメトリのように、メモリカードの場合は問題にならないはずです)に関連しているようです。パーティショニングがカードのモデルに固有である必要があるが、それ以上のことを言うにはその分野の専門家ではありません。
2つのtarballとuImageから、ddを使用してSDカードにコピーできるイメージに移動する適切な方法は何でしょうか。
SDカードが常に実際のサイズと同じ(またはそれ以上)であり、そこにコピーしたいものに1Gで十分であることが確実な場合は、次の手順を実行できます。
/dev/sdb
)をdd if=/dev/sdb of=empty.image bs=4M
を使用してシステムにコピーしますcp empty.image new.image
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
あり)、続行します。