パーティションのイメージを、パーティションテーブルを使用してディスクのイメージに変換する


20

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

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

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

回答:


13

ホストマシンでこれを実行できます。のようなほとんどのツール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
    

これにより、イメージ内に作成されたパーティションが、イメージ化されたパーティションの長さと「一致しない」ことはありませんか?それを解決する方法はありますか?そして、「十分にスマートな」ファイルシステムマネージャーは、パーティションサイズ全体を使用していないと判断し、適合するように拡張できますか?
キラーミスト

@killermist回答を更新しました。
mgorven

これは良い答えです。プロセス全体をコピーしないようにする方法を知っていますか?
ミカフィッシャー

@MikaFischer残念ながら、パーティションテーブルはパーティションの前に存在する必要があり、ファイルにデータを追加するメカニズムはわかりません。
mgorven

Harunの答えの方が簡単だし、スクリプト化できるからだと思います。
フィルコルボーン14年

9

元の問題はずっと前に解決されたと確信していますが、同様の問題を抱えている人にとっては:

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


2
partition-image.binがパーティションイメージの場合、2行目の「63」は0である必要があると思います。このようなことをしたばかりで、パーティションイメージファイルのこのオフセットをゼロに設定する必要がありました。philatwarrimoo.blogspot.com.au/2014/01/…– philcolbourn 14
1


天才。Linuxホスト上のVMにWindowsパーティションを使用するためにこれを行う必要がありましたが、@ philcolbournの手順を使用して、これが機能する唯一の方法です:superuser.com/a/804396/93066
bmaupin 14

vmdkファイルの残りには何が必要ですか?
-gozzilli

1
@gozzilliファイルの残りの部分は、ファイルのバージョン番号、ディスクアダプタの種類、UUID、ディスクジオメトリなどの詳細です。これらのビットの書き方がわかりません。ツールを使用してディスクイメージを指すvmdkを作成し、追加のパーティションヘッダーを取得する場所を説明する行のみを変更することをお勧めします。
ハルン

3

興味深い問題。ここに私がやることがあります:

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

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

がんばろう!


2

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


1

私は個人的にを使用して追加することを好みます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(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) この方法により、推測、サイズ変更、または手動での整列が不要になります。


どのようにGPTに画像の終了セクタを見つけるのですか
アンワル

私はこれを実行するとsudo file -s /dev/loop11p1、私は得ました/dev/loop11p1: data。以前はext4ファイルシステムでした。そして、結果のfull.imgは小さくなります。解決策を逆にしたと思います。
アンワール

seek=2048このコマンドの意味は、dd if = testfs.img skip = 2048 bs = 512 of = full.img
Anwar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.