.imgのあるパーティションを別のパーティションに置き換える

.imgのあるパーティションを別のパーティションに置き換える

2つの.imgファイル(それぞれ2つのパーティション(ブートパーティションとrootfs)を持つ組み込みLinuxイメージ)があります。パーティションの1つのrootfsパーティションを別のパーティションに置き換える必要があります。

私はこれをどうすることができますか?

  1. .imgsから直接
  2. .imgsをSDカードに書き込みます。

答えにコマンドが含まれている場合はありがとうございます。

ベストアンサー1

まず、交換する必要があるパーティションがコピーするパーティションと少なくとも同じサイズであることを確認してください。画像ファイルが次のような場合いいえ圧縮後は使用できますkpartx

ディスクイメージ間のファイルシステムのコピー

正しく機能するにはLVM2が必要です。 Letdisk1.imgdisk2.img次の例では、2つの画像がまったく同じサイズであると仮定しています。

# Let device mapper detect partitions on disk images
kpartx -a disk1.img
kpartx -a disk2.img

# Unmount source and destination file systems
umount /dev/mapper/loop?p?

# Copy source file system to destination
dd if=/dev/loop1p2 of=/dev/loop0p2 bs=512
# or:
# cat dev/loop1p2 > /dev/loop0p2

# Remove device nodes
kpartx -d disk1.img
kpartx -d disk2.img

ソースファイルシステムが小さい場合は/dev/mapper/loop0p2使用する必要がありますresize2fs目的地ファイルシステムが小さい場合は、ソースファイルシステムを縮小する必要があります。寸法は全く同じです。これは、ターゲットが選択したパーティショニングツールを使用しているためです。私はお勧めしますfdisk

編集する:SDカードが検出された場合(たとえば、ターゲットがSDカードの2番目のパーティションであると仮定)、SDカードの2番目のパーティション/dev/mmcblk0にファイルシステムをコピーするだけです(たとえば)。/dev/mapper/loop0p2/dev/mmcblk0p2

編集する:ターゲットファイルシステムが小さい場合は、ソースファイルシステムをターゲットパーティションに合わせて縮小する必要があります。

ソースファイルシステムの縮小

ループデバイスが追加されたとしますkpartx -aインストールされていません:

# Check file systems block count and size
tune2fs -l /dev/mapper/loop0p2 | grep -E 'Block (count|size)'
tune2fs -l /dev/mapper/loop1p2 | grep -E 'Block (count|size)'

# Shrink source file system to fit the destination
# (FS check is mandatory before shrinking)
fsck -f /dev/mapper/loop1p2
resize2fs /dev/mapper/loop1p2 <loop0p2 block count>

# Proceed with file system copy...

resize2fs要求されたサイズを満たすのに十分なチャンクがないと失敗します(私はこれを経験したことがありません)。ブロックサイズが異なる場合は、新しいファイルシステムサイズを渡すときに結果を掛けて<block count>追加できます。<block size>B

# Example: 123456 blocks, 4096 bytes per block
resize2fs /dev/mapper/loop1p2 $((123456*4096))B

ソースファイルシステムを最小サイズに縮小し、計算せずにターゲットファイルシステムをそのパーティションに合わせて拡張することを選択できます。

resize2fs -M /dev/mapper/loop1p2
# Do the copy ...
resize2fs /dev/mapper/loop0p2

操作が不可能な場合にのみ失敗します。

元のパーティションのサイズがまだ調整されていないため、コピー操作が終了するとエラーが発生する可能性が高くなります。カーネルは割り当てられたターゲットパーティションの終わりを越えて書き込みを許可しないため、通常は何の害もありません。

dd非常に注意して、ターゲットパーティションサイズにコピーされるデータ量の制限を使用することをお勧めします(ブロックサイズbsと「数」を参照)。あなたはすでに教育された推測をするために必要なすべてを備えているので、コマンドと引数はあなたに任せます;-)。

おすすめ記事