回答:
ホストマシンでこれを実行できます。のようなほとんどのツールfdisk
はファイルを操作しkpartx
、ファイル内のパーティションにアクセスできます。
新しい空の100GiBスパースイメージを作成します(これをパーティションイメージのサイズよりわずかに大きくします)
dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
で画像ファイルをパーティション分割する fdisk
fdisk myvm.img
イメージファイル内のパーティションを個別のデバイスで使用可能にする
sudo kpartx -a myvm.img
パーティションイメージをパーティションにコピーします
sudo cp image.bin /dev/mapper/loop0p1
ファイルシステムを拡張してパーティション全体を満たす
sudo resize2fs /dev/mapper/loop0p1
パーティションを閉じます
sudo kpartx -d myvm.img
ループバックデバイスを分解する
sudo losetup -D
元の問題はずっと前に解決されたと確信していますが、同様の問題を抱えている人にとっては:
イメージ全体のコピーを回避する1つの方法は、パーティションテーブルとパーティションの内容の個別のエクステントファイルを参照する.vmdk形式のイメージを作成することです。
少し前に行ったテストの.vmdkファイルにこのスニペットがあります。
RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63
つまり、オフセット0から始まる63個のセクターはrawファイル「parttable.bin」から読み取られますが、セクター63以降はrawパーティションダンプ「partition-image.bin」から取得されます。(もちろん、63を最初のパーティションへの実際のオフセット、通常は最近では2048に置き換えてください)。
最終的な結果は、VBoxの内部から、長いコピー操作を行うことなく、パーティションイメージの前にパーティションテーブルを追加したように見えることです。
VM内からドライブをパーティション分割します。オフセットを正しく取得すると、新しく作成されたパーティション内にパーティションイメージの内容が表示されます。
興味深い問題。ここに私がやることがあります:
これが完了したら、ブートローダーを更新する必要があります。GRUBを使用していると仮定して、新しく書き込まれたパーティションをマウントし、その中にchrootして実行しますupdate-grub
(ただし、正しく機能する前に構成ファイルを調整する必要がある場合があります)。
がんばろう!
GPartedを使用して、ファイルシステムのサイズを変更できます。
テストイメージを作成します。
dd if=/dev/zero of=extfs bs=1M count=20
mkfs.ext4 extfs
resize2fsは、空き領域を残すのではなく、ファイルのサイズを変更するため、使用していません。
sudo losetup /dev/loop0 extfs
sudo ln -s /dev/loop0 /dev/loop0p1 # needed for GParted to be able to resize it
gksudo gparted /dev/loop0
開始時に無料で1 MB。
sudo rm /dev/loop0p1
sudo losetup -d /dev/loop0
最後に、パーティションテーブルを作成します。
fdisk extfs
最初のセクターを2048(2048セクター* 512 B /セクター= 1MB)に設定し、最後のセクターをデフォルト(画像の終わり)に設定します。
私は個人的にを使用して追加することを好みますdd
。
ここでは512バイトのセクターを想定しています。2048バイトのセクターの場合があるかもしれないので、数字を入れ換えて計算してください。
いずれの場合も、たとえば512MBのテストファイルを使用しています。
dd if=/dev/zero of=testfs.img bs=512 count=1M
mkfs.ext4 testfs.img
個人的には、最初のMB(2048セクター)を先頭に追加することを好みます。
dd if=testfs.img skip=2048 bs=512 of=full.img
最後にfdiskを実行してパーティションテーブルを作成(または独自にコピー)し、デフォルト値を使用して1つのパーティションを作成しました。
確認するには、ループパーティションを作成して自動検出します。
sudo losetup -fP full.img
そしてfile
、分割されたループバックデバイスで実行します。
sudo file -s /dev/loop2p1
/dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)
個人的には、最初のMBR(2048セクター、gdiskは1 MBに揃えられているため、この数にデフォルト設定されるため)を最初のMBRの先頭に追加し、最後に34セクター(またはフルMBの場合は2048)を追加することを好みますGPT(終了セクターは異なる場合があります)。GPTの終了を省略すると、データが失われる可能性があります。
dd if=testfs.img skip=2048 bs=512 of=full.img
dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34
最後にgdiskを実行してパーティションテーブルを作成(または独自にコピー)し、デフォルト値を使用して1つのパーティションを作成しました。
確認するには、ループパーティションを作成して自動検出します。
sudo losetup -fP full.img
そしてfile
、分割されたループバックデバイスで実行します。
sudo file -s /dev/loop2p1
/dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)
この方法により、推測、サイズ変更、または手動での整列が不要になります。
sudo file -s /dev/loop11p1
、私は得ました/dev/loop11p1: data
。以前はext4ファイルシステムでした。そして、結果のfull.imgは小さくなります。解決策を逆にしたと思います。
seek=2048
このコマンドの意味は、dd if = testfs.img skip = 2048 bs = 512 of = full.img