Virtualboxで任意のスナップショットをベースvdiにマージする方法


14

あるハードディスクから別のハードディスクへのVMの転送に失敗しました。これで、ベースvdiと多数のスナップショットが残りました。

私のステップ

  • 古いVMディレクトリを新しいHDDにコピーしました
  • 古いVMを削除し、Machine-> addを使用して古いVMファイルを提供して新しいVMを追加しました
  • 競合のためベースvdiファイルを追加できなかったため、ベースvdiのUUIDを変更しました

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
    
  • スナップショットへのロールバックを試みますが、VMは古いHDD(フォーマットされてなくなっている)上のスナップショットを探しているようです

これはエラーです(ネットワーク接続が名前です):

Failed to restore the snapshot networked of the virtual machine lfs.

Could not open the medium 'H:\vm\ft.vdi'.

VD: error VERR_PATH_NOT_FOUND opening image file 'H:\vm\ft.vdi' (VERR_PATH_NOT_FOUND).

Result Code: E_FAIL (0x80004005)
Component: Medium
Interface: IMedium {53f9cc0c-e0fd-40a5-a404-a7a5272082cd}

古いHDDはドライブHでした。新しいHDDはドライブNです。

スナップショット/ VMを変更N:\vm\ft.vdiしてベースvdi を探すにはどうすればよいですか?VirtualBoxのデフォルト設定(デフォルトのvm / vmスナップショットの場所)はすでに設定済みです。

または、変更されたものがベースvdiのUUIDのみである場合、古いスナップショットとベースvdiをどのようにマージできますか?

回答:


10

これが私の問題の解決方法です。

最初に、jordoncmスクリプトを使用して、ベースVDIファイルのUUIDの変更を元に戻しました

次に、vboxファイルのパスを新しい場所に一致するように単純に変更してみました。さまざまなエラーがポップアップ表示され、vboxファイルを使用してVMを追加することさえできなかったため、それは機能しませんでした。

だから私は提案したピーター・ポーターによるこのブログ記事を見つけました:

各.vdiには最後の.vdiから変更されたセクターのみが含まれるため、.vdiを年代順にコピーすると、以前のすべてのスナップショットの完全なコピーを含む.vdiが作成されます。

...

「VBoxManage clonehd」コマンドを使用して、元のファイルに基づいて新しい.vdiファイルを作成し、「– existing」引数を使用して後続の各ファイルに追加して、構築中の既存の.vdiにデータを追加します。次のコマンドのリストは、上記の私の例に基づいています。

VBoxManage clonehd Machine.vdi Machine-full.vdi

VBoxManage clonehdスナップショット{UUID1} .vdi Machine-full.vdi

VBoxManage clonehdスナップショット{UUID2} .vdi Machine-full.vdi

VBoxManage clonehdスナップショット{UUID3} .vdi Machine-full.vdi

VBoxManage clonehdスナップショット{UUID4} .vdi Machine-full.vdi

これにより、アクティブな状態のマシンの完全な状態を表す「Machine-full.vdi」ファイルが作成され、親の.vdiファイルとは関係ありません。これで、この「Machine-full.vdi」ファイルを新しい仮想マシンで使用したり、既存のVMを編集して、古い.vdiファイルを削除してこの.vdiを追加したりできます。

私のために働くように思われた少しの調整で:

これはハードディスクとそのスナップショットです:

<HardDisk uuid="{ed1428ca-76be-440a-894b-e666b50f5c86}" location="H:/vm/ft.vdi" format="VDI" type="Normal">
          <HardDisk uuid="{8d8be78f-6648-4503-bee3-8810cb853a99}" location="Snapshots/{8d8be78f-6648-4503-bee3-8810cb853a99}.vdi" format="VDI">
            <HardDisk uuid="{cce0ee4f-5052-4be7-81ff-47ea08202716}" location="Snapshots/{cce0ee4f-5052-4be7-81ff-47ea08202716}.vdi" format="VDI">
              <HardDisk uuid="{c297d4b9-972d-4b07-a839-5d76ee8d0387}" location="Snapshots/{c297d4b9-972d-4b07-a839-5d76ee8d0387}.vdi" format="VDI">
                <HardDisk uuid="{8e9ca914-648f-464c-b515-2606c644d7f0}" location="Snapshots/{8e9ca914-648f-464c-b515-2606c644d7f0}.vdi" format="VDI"/>
              </HardDisk>
            </HardDisk>
          </HardDisk>
        </HardDisk>

これらは私が実行したコマンドです(申し訳ありませんが、その一部はウィンドウから切り離されています...):

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd N:\vm\ft.vdi N:\vm\ft_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd "N:\vm\VirtualBox       VMs\lfs\Snapshots\{8d8be78f-6648-4503
VBoxManage.exe: error: Parent medium with UUID {ed1428ca-76be-440a-894b-e666b50f5c86} of the medium 'N:\vm\Vi
03-bee3-8810cb853a99}.vdi' is not found in the media registry ('C:\Users\   <user>/.VirtualBox\VirtualBox.xml')
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component Medium, interface    IMedium, callee IUnknow
Context: "OpenMedium(Bstr(pszFilenameOrUuid).raw(), enmDevType, AccessMode_ReadWrite,   fForceNewUuidOnOpen, pM
xManageDisk.cpp

Crapは、MediaRegistry-> HardDisksの下のVirtualBox.xmlにエントリを追加する必要があるようですが、コピーごとに時系列順に各スナップショットを追加する必要があります。このように:

Copy VM
Add entry to VirtualBox.xml
Copy VM ...

そして、それが他の誰かを助ける場合に私がしたことの残り:

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd --existing "N:\vm\VirtualBox   VMs\lfs\Snapshots\{8d8be78
_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd --existing "N:\vm\VirtualBox   VMs\lfs\Snapshots\{cce0ee4f-5052-4be7-81ff-47ea08202716}.vdi" N:\vm\ft_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd --existing "N:\vm\VirtualBox VMs\lfs\Snapshots\{c297d4b9-972d-4b07-a839-5d76ee8d0387}.vdi" N:\vm\ft_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

C:\Program Files\Oracle\VirtualBox>VBoxManage clonehd --existing "N:\vm\VirtualBox VMs\lfs\Snapshots\{8e9ca914-648f-464c-b515-2606c644d7f0}.vdi" N:\vm\ft_full.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: a7fb5e25-c248-4644-a898-f1e26f6570a4

そして、ft_full.vdiをベースとして新しいVMを作成しました。gui設定ペインの残りの設定と一致しました。


1
あなたがはるかに高速にそれを行うことができると思わsuperuser.com/questions/590968/...
アンドレイRegentov

4

私はちょうどこの頭痛を経験し、一見愚かな解決策があります。残念ながら、ここに着くまで丸一日かかりました。

あなたが見てとればdumphdinfo VBoxManage.exeのinternalcommands は、各VDIはその親についての情報を持っていることがわかります。そこで、私が行ったことは、空のマシンを作成し、「壊れた」親HDをセカンダリドライブとして追加したことです。それがMedia Managerに配置されました。

次に、空のVMにSATAコントローラーを追加し、レイヤー3スナップショットを追加しました。[OK]をクリックします。再度編集してレイヤー2スナップショットを追加し、[OK]をクリックします。編集し、レイヤー1スナップショットを追加します。

これにより、VM内の個々のドライブが作成されますが、Media Manager内では、それらはすべて互いに接続されています。

最後の手順は、銀行のVMを削除して、古いVMを追加するだけです。完了...そして、はい、それはその愚かな/単純です。

c:\Program Files\Oracle\VirtualBox>VBoxManage.exe internalcommands dumphdinfo D:
\Virtual_box\Virtual_box_HD_C.vdi

1 Header: uuidCreation={13ea5785-58db-4ad9-8459-9b13d89a3aaa}
1 Header: uuidModification={b1bfd84d-6fcc-4640-80fc-b7c1a6b929cb}
1 Header: uuidParent={19ed1b87-d127-402d-b463-59899c683a47}
  2 Header: uuidCreation={19ed1b87-d127-402d-b463-59899c683a47}
  2 Header: uuidModification={709f1fad-68a3-47c7-9336-f3409fcae95b}
  2 Header: uuidParent={436c1ffd-04ee-4d6b-968c-de95e65d8a5a}
    3 Header: uuidCreation={436c1ffd-04ee-4d6b-968c-de95e65d8a5a}
    3 Header: uuidModification={049d869e-89c2-48aa-b0cc-eb324895f3b9}
    3 Header: uuidParent={e09c65f4-828d-4a53-8ecc-20365d43a52e}
      4 Header: uuidCreation={e09c65f4-828d-4a53-8ecc-20365d43a52e}
      4 Header: uuidModification={6c397704-fe65-4661-b60f-767e207ffb58}
      4 Header: uuidParent={00000000-0000-0000-0000-000000000000}

単純化したのは、ファイルマネージャーから仮想ディスクマネージャーに親ファイルとスナップショットディスクファイルをドロップしただけです。その後、.vboxファイルを開くことができました(Linuxインストールには存在しなかった共有フォルダーを参照する2行をコメントアウトする必要がありました。
zoechi

0

H:ドライブ上の)古いパス名.vboxは、VM のファイル(単にXMLファイル)で指定するだけです。その場合は、そのファイルのコピーを保存し、パス名を新しいN:ドライブ名(ドライブ上のパス名)に編集して、問題が解決するかどうかを確認できます。


1
<HardDisk>ノードの関連属性を変更し、VMを再追加しました。ただし、エラーが返されます A differencing image of snapshot {xxx} could not be found. Could not find an open hard disk with UUID {yyy}
。– jmathew

私には、UUIDを古いディスクのuuidに戻すだけでよいのかもしれません。それは可能ですか?
-jmathew

この紳士のスクリプトを使用して、UUIDを元に戻します
。VirtualBoxVDIの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.