
私は組み込み目的でLinuxファイルシステムに低レベルのメモリ書き込みを行っています。次のプロセスを使用してパーティションイメージを作成しました。
- 4GiB 空の画像ファイルを生成します。例:
dd if=/dev/null of=example.img bs=1M seek=4096
- ファイルシステムの追加(ext4)
mkfs.ext4 -F example.img
- ローカルコンピュータにインストール
mkdir /mnt/example.img
mount -t ext4 -o loop exmaple.img /mnt/exampleimg
- マウントされたパーティションイメージへのファイルシステムのコピー
cp -r rootfs/* /mnt/exampleimg/
- 画像の削除
umount /mnt/exampleimg
生成されたイメージを置き換える必要があるパーティションの最初のセクターに書き込んだ後、すべてがうまく機能し、データにアクセスできます。問題は、16GBのパーティション全体をコピーする必要がありますが、その中に2GBのデータしかないということです。時間がかかります。
同じデータで小さいイメージを作成しましたが、機能しますが、パーティションイメージの固定サイズを超えることはできません。システムでは、パーティションのサイズがまだ大きいことが確認されています(fdisk -l /dev/mmcblok0、セクタの数は/sys/class/block/mmcblkop2/sizeにあります)。それはおそらく、パーティションテーブルがまだ変更されていないからです。ファイルのコピーがイメージの利用可能なスペースよりも大きい(パーティションの実際のサイズではありません)。 cp: write error: No space left on device が表示されます。
ターゲットLinuxで使用した後は、パーティションサイズを変更できません。これは、Linuxが実行されているルートファイルシステムのパーティションであるためです。不要な制限なしに偽のサイズ/画像を作成する方法はありますか?データを含む16GBパーティションのイメージをインポートしたいのですが、イメージサイズは16GB未満です。
答え1
すべての操作を従来どおりに実行します(たとえば、小さな画像の作成、そのままコピー)。しかし、最後のステップは次のとおりです。
resize2fs -p /dev/mmcblok0
答え2
ターゲットLinuxで使用した後は、パーティションサイズを変更できません。これは、Linuxが実行されているルートファイルシステムのパーティションであるためです。
ファイルシステムを拡張する場合はそうではありません。これresize2fs マニュアル説明する:
ファイルシステムがマウントされている場合、カーネルがオンラインサイズ変更をサポートしていると仮定して、マウントされたファイルシステムのサイズを拡張するために使用できます。 (この記事を書いた時点で、Linux 2.6カーネルはext3とext4を使用してマウントされたファイルシステムのオンラインサイズ変更をサポートしています。)
したがって、小さなイメージを作成してデバイスにコピーし、resize2fsを使用してファイルシステムを拡張できます。
resize2fs /dev/mmcblok0
使用しているハードウェアによって異なる方法があります。複雑なので、技術の概要を提供できますが、それを使用する正確なステップを作成することは省略します。
再構成されたブートローダを使用して画像を生成する技術。
SDカードから直接実行するように設計されています。ブートローダはLinuxを起動し(通常のスクリプトではなく/sbin/init
)、スクリプトを直接実行するように指示します。その後、スクリプトは次のようになります。
- 内蔵フラッシュメモリフォーマット
- 内部フラッシュを/mntにマウント
- SDカードのすべてのファイルを/ mntにコピーします。
- スクリプトの代わりに /sbin/init を実行するように /mnt/boot のブートローダを再設定します。
- Linuxを終了