Comment fusionner un instantané arbitraire dans un vdi de base dans Virtualbox

14

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

Mes pas

  • Copie de l'ancien répertoire VM sur le nouveau disque dur
  • Ancienne machine virtuelle supprimée et nouvelle machine virtuelle ajoutée à l'aide de Machine-> ajouter et fournir l'ancien fichier XML
  • Impossible d'ajouter le fichier vdi de base en raison d'un conflit, vous avez donc modifié l'UUID de vdi de base avec

    VBOXMANGE.EXE internalcommands sethduuid  <path/to/vdi>
    
  • Essayez de revenir à un instantané, mais il semble que la machine virtuelle recherche les instantanés sur l'ancien disque dur (qui est formaté et disparu)

C'est l'erreur (en réseau 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 instantanés / VM pour rechercher N:\vm\ft.vdile vdi de base? J'ai déjà défini les paramètres par défaut dans VirtualBox en général (emplacement d'instantané vm / vm par défaut).

Ou sinon, comment puis-je fusionner l'ancien cliché avec le vdi de base étant donné que les seules choses qui ont changé sont l'UUID du vdi de base?

jmathew
la source

Réponses:

10

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 le script de jordoncm

Ensuite, j'ai simplement essayé de changer les chemins dans le fichier vbox pour qu'ils correspondent au nouvel emplacement. Cela n'a pas fonctionné car diverses erreurs différentes sont apparues et je n'ai même pas pu ajouter la machine virtuelle à l'aide du fichier vbox.

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

comme chaque .vdi ne contient que les secteurs modifiés par rapport au dernier .vdi, la copie des .vdi dans l'ordre chronologique devrait nous fournir un .vdi contenant une copie complète de tous les instantanés antérieurs.

...

Utilisez la commande «VBoxManage clonehd» pour créer un nouveau fichier .vdi basé sur votre original, puis ajoutez-le à chaque fichier suivant en utilisant l'argument «–existing» pour simplement ajouter les données au .vdi existant que vous construisez. La liste de commandes suivante 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 machine à l'état actif sans aucune relation avec les fichiers .vdi parents. Vous pouvez maintenant utiliser ce fichier «Machine-full.vdi» sur une nouvelle machine virtuelle ou modifier votre machine virtuelle existante, en supprimant l'ancien fichier .vdi et en ajoutant ce .vdi.

Avec un peu de peaufinage qui a semblé fonctionner pour moi:

Voici le disque dur et 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>

Ce sont les commandes que j'ai exécutées (désolé, certaines sont coupées de ses fenêtres ...):

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

Merde semble que je dois ajouter une entrée dans VirtualBox.xml sous MediaRegistry-> HardDisks, mais je dois m'assurer de lui ajouter chaque instantané 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ù cela 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 machine virtuelle en utilisant ft_full.vdi comme base. Correspond au reste des paramètres dans le volet des paramètres de l'interface graphique.

jmathew
la source
1
Il semble que vous pourriez le faire beaucoup plus rapidement superuser.com/questions/590968/…
Andrey Regentov
4

Je viens de traverser ce mal de tête et il existe une solution apparemment stupide. Dommage qu'il m'a fallu une journée complète pour arriver ici.

Si vous jetez un œil aux commandes internes de VBoxManage.exe 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 Parent HD "cassé" comme lecteur secondaire. Cela l'a placé dans Media Manager.

Ensuite, j'ai ajouté un contrôleur SATA à la machine virtuelle vierge et ajouté un instantané de couche 3. Cliquez sur OK. Modifiez à nouveau et ajoutez un instantané de couche 2, cliquez sur ok. Modifier, ajouter un instantané du calque 1.

Cela en fait des disques individuels à l'intérieur de la machine virtuelle, mais dans Media Manager, ils sont tous attachés les uns aux autres.

La dernière étape consiste simplement à supprimer la machine virtuelle de la banque et à ajouter votre ancienne machine virtuelle. Fait ... et oui, c'est aussi stupide / simple.

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}
NeverEatAlone
la source
Une simplification a été que j'ai simplement laissé tomber le parent puis le fichier de disque instantané du gestionnaire de fichiers vers le gestionnaire de disque virtuel. Ensuite, j'ai pu ouvrir le fichier .vbox (j'ai dû commenter deux lignes qui font référence au dossier partagé qui n'existait pas sur mon installation linux.
zoechi
0

L'ancien nom de chemin (sur le H:lecteur) peut simplement être spécifié dans le .vboxfichier de la machine virtuelle, qui n'est qu'un fichier XML. Si tel est le cas, vous pouvez enregistrer une copie de ce fichier, modifier le nom de chemin pour qu'il soit le nouveau nom de chemin (celui du N:lecteur) et voir s'il résout le problème.

Fran
la source
1
J'ai changé l'attribut approprié dans le nœud <HardDisk> et j'ai rajouté la machine virtuelle. Cependant, il renvoie l'erreur: A differencing image of snapshot {xxx} could not be found. Could not find an open hard disk with UUID {yyy}
jmathew
Il me semble que je peux simplement remettre l'UUID sur l'ancien uuid du disque. Est-ce possible?
jmathew
Utilisé le script de ce gentleman pour remettre l'uuid en arrière: Définition de l'UUID d'un VirtualBox VDI
jmathew