14 votes

Comment fusionner un snapshot arbitraire en vdi de base dans Virtualbox ?

J'ai bâclé le transfert d'une VM d'un disque dur à l'autre. Maintenant je me retrouve avec le vdi de base et tout un tas de snapshots.

Mes pas

  • Copie de l'ancien répertoire VM sur le nouveau disque dur

  • Suppression de l'ancienne VM et ajout de la nouvelle VM en utilisant Machine->add et en fournissant l'ancien fichier XML

  • Impossible d'ajouter le fichier vdi de base à cause d'un conflit, donc j'ai changé l'UUID du vdi de base avec

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
  • Tentative de retour en arrière vers un snapshot, mais il semble que la VM recherche les snapshots sur l'ancien disque dur (qui est formaté et disparu).

Voici l'erreur (en réseau, c'est le nom) :

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}

L'ancien disque dur était le lecteur H : le nouveau est le lecteur N :

Comment puis-je modifier les snapshots/VM pour qu'ils regardent en N:\vm\ft.vdi pour le vdi de base ? J'ai déjà défini les paramètres par défaut de VirtualBox en général (emplacement par défaut des instantanés de vm/vm).

Ou sinon, comment puis-je fusionner l'ancien snapshot avec le vdi de base étant donné que la seule chose qui a changé est l'UUID du vdi de base ?

10voto

jmathew Points 463

Voici comment j'ai résolu mon problème.

J'ai d'abord annulé la modification de l'UUID sur mon fichier VDI de base en utilisant la fonction script par jordoncmm

J'ai ensuite essayé de modifier simplement les chemins dans le fichier vbox pour qu'ils correspondent au nouvel emplacement. Cela n'a pas fonctionné car différentes erreurs sont apparues et je n'ai même pas pu ajouter la VM en utilisant le fichier vbox.

J'ai donc trouvé ceci article de blog par Peter Porter qui a suggéré :

comme chaque .vdi ne contient que les secteurs modifiés par rapport au le dernier .vdi, copier les .vdi dans l'ordre chronologique devrait nous fournir un .vdi contenant une copie complète de tous les snapshots précédents.

...

Utilisez la commande "VBoxManage clonehd" pour créer un nouveau fichier .vdi basé sur votre fichier d'origine. l'original, puis ajoutez chaque fichier suivant en utilisant l'argument l'argument "-existing" pour ajouter simplement les données au .vdi existant que vous que vous construisez. La liste suivante de commandes est basée sur mon exemple ci-dessus :

VBoxManage clonehd Machine.vdi Machine-full.vdi

VBoxManage clonehd Snapshots{UUID1}.vdi Machine-full.vdi

VBoxManage clonehd Snapshots{UUID2}.vdi Machine-full.vdi

VBoxManage clonehd Snapshots{UUID3}.vdi Machine-full.vdi

VBoxManage clonehd Snapshots{UUID4}.vdi Machine-full.vdi

Cela vous donnera un fichier "Machine-full.vdi" qui représente l'état complet de votre complet de votre machine à l'état actif sans aucune relation avec les fichiers les fichiers .vdi parents. Vous pouvez maintenant utiliser le fichier "Machine-full.vdi" pour les opérations suivantes sur une nouvelle machine virtuelle ou modifier votre VM existante, en supprimant l'ancien fichier fichier .vdi et ajouter ce fichier .vdi.

Avec un peu d'ajustement, cela semble fonctionner pour moi :

Il s'agit du disque dur et de ses instantanés :

<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>

Voici les commandes que j'ai exécutées (désolé, certaines parties sont coupées par Windows...) :

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

Il semble que je doive ajouter une entrée dans le fichier VirtualBox.xml sous MediaRegistry->HardDisks, mais je dois m'assurer d'y ajouter chaque snapshot dans l'ordre chronologique après chaque copie. Donc c'est comme ça :

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

Et le reste de ce que j'ai fait au cas où ça aiderait quelqu'un d'autre :

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

Et puis j'ai simplement créé une nouvelle VM en utilisant le ft_full.vdi comme base. J'ai fait correspondre le reste des paramètres dans le panneau de paramètres du gui.

4voto

NeverEatAlone Points 140

Je viens de passer par ce casse-tête et il y a une solution apparemment stupide. Dommage que ça m'ait pris une journée entière pour venir ici.

Si vous jetez un coup d'œil à VBoxManage.exe commandes internes dumphdinfo vous pouvez voir que chaque VDI a des informations sur son parent. Donc, ce que j'ai fait, c'est créer une machine vierge et ajouter le disque parent "cassé" comme disque secondaire. Cela l'a placé dans Media Manager.

Ensuite, j'ai ajouté un contrôleur SATA à la VM vierge et ajouté un snapshot de couche 3. Cliquez sur ok. Editez à nouveau et ajoutez l'instantané de la couche 2, cliquez sur ok. Editez, ajoutez le snapshot de la couche 1.

Cela en fait des lecteurs individuels dans la VM, mais dans Media Manager, ils sont tous attachés les uns aux autres.

L'étape finale consiste à supprimer la VM de la banque et à ajouter votre ancienne VM. C'est fait... et oui, c'est aussi simple que cela.

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}

0voto

Fran Points 5143

L'ancien nom de chemin (sur le H: ) peut simplement être spécifié dans le champ .vbox pour la VM, qui est simplement un fichier XML. Si c'est le cas, vous pouvez sauvegarder une copie de ce fichier, modifier le nom du chemin d'accès pour qu'il soit le nouveau nom de chemin (celui du fichier N: ), et voyez si cela résout le problème.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X