dd if=/dev/sdXN of=image.bin
で生成された既存のパーティションのイメージがあります。次に、このイメージを仮想マシンのベースとして使用したいと思います。 VirtualBoxで使用できる形式に画像を変換する方法を知っています。
問題は、「ディスク」イメージが実際には1つのパーティションのイメージにすぎないため、MBRまたはパーティションテーブルが含まれていないことです。これにより、VMの起動が非常に困難になります。
パーティションのイメージを指定して、パーティションテーブルを含む適切なディスクイメージを作成する簡単な方法はありますか?
これはホストマシンで実行できます。 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の最初に最初のMB(gdiskはデフォルトで1 MBに揃えられているため、この数に2048セクター)を追加し、最後に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)
このメソッドは、推測、サイズ変更、または手動での整列を保証しません。