背景:uboot(および必要に応じてカスタムベアメタルコード)を使用してeMMCからext4パーティションを複製する必要があります。を使用してパーティション全体をコピーしたmmc read
ところ、ほとんどのパーティションは空ですが、一部のデータブロック(inodeテーブルなど)がパーティションに分散していることがわかりました。これは、パーティション全体をコピーする必要があります(遅くて頻繁に実行する必要があります)、またはパーティションのどの部分が関連しているかを確認する必要があることを意味します。
この質問に最も似ているQ&Aは、dd
create a sparse image or piping to thatを使用することを提案しますgzip
が、私はOSを実行していないので、ファイルシステムのレイアウトを理解する必要があります。これらのビットマップタイルを使用して、使用されているコンテンツと無料のコンテンツを識別できますか? ext4のドキュメントは、詳細が出るたびにLinuxカーネルコードを参照しているようです。
ubootコードを使用してこれを行うのが最善ですが、ubootで実行できるいくつかのベアメタルコードを書くこともできます。
境界条件もあります。パーティション複製のターゲットが空ではないため、ソースにゼロのみのブロックがあり、そのブロックが0である必要がある場合は、ターゲットでそのブロックを0で上書きする必要があります。
答え1
ご使用の環境でソースファイルシステムをマウントできない場合は、それを使用してファイルdebugfs
システムのレイアウトとターゲットcopy
ファイルを確認できます。わずかな操作でdebugfs
ソースファイルシステムを一覧表示し、繰り返して一時的な場所にコピーし、それを使用して新しいmke2fs -d
ファイルシステムに書き込むか、ターゲットの場所に直接コピーするスクリプトを作成できます。
独自のコードを作成したい場合は、libext2fsを使用してlibext2fs
ファイルシステムを開き、ディレクトリツリーを読み込み、それをターゲットファイルシステムに繰り返しコピーできます(libext2fsを使用して開くこともできます)。これは〜になりますたくさんディスク上のext4形式を処理するために独自のコードを書くよりも簡単です。
ご使用の環境でeMMCデバイスをブロックデバイスにアクセスできない場合(申し訳ありませんが、ext4の側面のみを知っていません)、libext2fs用のカスタムIOドライバ(またはlib/ext2fs/unix_io.c
).../nt_io.c
を作成できます。ドライバはeMMCデバイスに直接読み書きすることができ、debugfs + scriptsまたはカスタムlibext2fsコピーツールを使用できます。
答え2
e2image -ar
ファイルシステムの関連部分をコピーするために使用されます。ファイルシステムを理解し、未使用領域をスキップしながら、ファイルに使用されるすべての必須メタデータとデータブロックをコピーします。