web-dev-qa-db-ja.com

パーティションのイメージをパーティションテーブルのあるディスクのイメージに変換する

dd if=/dev/sdXN of=image.binで生成された既存のパーティションのイメージがあります。次に、このイメージを仮想マシンのベースとして使用したいと思います。 VirtualBoxで使用できる形式に画像を変換する方法を知っています。

問題は、「ディスク」イメージが実際には1つのパーティションのイメージにすぎないため、MBRまたはパーティションテーブルが含まれていないことです。これにより、VMの起動が非常に困難になります。

パーティションのイメージを指定して、パーティションテーブルを含む適切なディスクイメージを作成する簡単な方法はありますか?

20
Mika Fischer

これはホストマシンで実行できます。 fdiskのようなほとんどのツールはファイルを操作し、 kpartx はファイル内のパーティションへのアクセスを提供します。

  1. 新しい空の100GiBスパースイメージを作成します(これをパーティションイメージのサイズよりも少し大きくします)。

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. イメージファイルをfdiskでパーティション分割します

    fdisk myvm.img
    
  3. イメージファイルのパーティションを個別のデバイスで使用できるようにします

    Sudo kpartx -a myvm.img
    
  4. パーティションイメージをパーティションにコピーする

    Sudo cp image.bin /dev/mapper/loop0p1
    
  5. ファイルシステムを拡張してパーティション全体を埋める

    Sudo resize2fs /dev/mapper/loop0p1
    
  6. パーティションを閉じます

    Sudo kpartx -d myvm.img
    
  7. ループバックデバイスを解体する

    Sudo losetup -D
    
13
mgorven

私は元の問題がずっと前に解決されたと確信していますが、同様の問題を持つ誰にとっても:

イメージ全体のコピーを回避する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内からドライブをパーティション分割します。オフセットが適切であれば、新しく作成されたパーティション内にパーティションイメージの内容が表示されます。

9
Harun

興味深い問題。これが私がすることです:

  1. VMを適切な大きさのディスクで作成し、リカバリCDから起動します。
  2. なんとかして既存のディスクイメージ(nfs、cifsなど)にアクセスします。
  3. VMのローカルディスクに必要なパーティションを作成します。
  4. Ddを使用して、パーティションイメージをvmディスク上のパーティションに書き込みます。

これが完了したら、ブートローダーを更新する必要があります。 GRUBを使用していると仮定して、新しく書き込まれたパーティションをマウントし、それにchrootしてupdate-grubを実行します(ただし、正しく機能するためには、構成ファイルの調整が必要になる場合があります)。

幸運を!

3
bahamat

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)に設定し、最後のセクターをデフォルト(つまり、イメージの終わり)にします。

2
ignis

個人的にはddを使用して追加することを好みます。

ここでは512バイトのセクターを想定しています。 2048バイトのセクターの場合があるかもしれないので、数を入れ替えて計算をしてください。

いずれの場合も、たとえば512MBのテストファイルを使用しています。

_dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img_

MBR

画像の合成

私は最初に最初の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)

GPT

画像の合成

私は個人的に最初の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)このメソッドは、推測、サイズ変更、または手動での整列を保証しません。

1
Dan Dart