Le moyen le plus rapide de fusionner des instantanés dans VirtualBox?

49

J'ai vdi avec un certain nombre d'instantanés pris - par exemple, 50 ou 70 instantanés. Je veux avoir un vdi simple avec un état actuel. Ces instantanés prennent beaucoup trop d'espace disque et ne sont pas nécessaires en tant qu'instantanés.

Je sais que si j'appelle

VBoxManage clonehd thedisk.vdi thedisk-full.vdi
(50-70 times) VBoxManage clonehd {uuid-of-snapshot}.vdi thedisk-full.vdi --existing

Je vais obtenir ce que je veux. Mais cela prend très très longtemps (plus de 5 heures compte tenu de mon matériel et de la taille de disque initiale de 16 Go).

Et, bien sûr, j'ai essayé VBoxManage snapshot deleteet c'est étrange: ne fonctionne pas sur une machine arrêtée, peut échouer sur une machine en cours d'exécution et s'il échoue une fois, tous les appels suivants échouent.

Y at-il un moyen de faire vdi plaine de plusieurs instantanés - plus rapidement?

$ VBoxManage --version
3.2.14r75509

(demandé sur ServerFault mais décidé que cet endroit est plus approprié pour cette question)

Andrey Regentov
la source
La commande que vous utilisez est la commande que vous voulez utiliser, il n’ya pas de moyen plus rapide.
Ramhound
Qu'en est-il de l'exportation de la machine virtuelle entière? Est-ce que son VDI contiendra ce que je veux?
Andrey Regentov
Tu devrais l'essayer. En fin de compte, toute autre méthode va encore prendre un certain temps en raison de la taille de la machine virtuelle.
Ramhound

Réponses:

53

Trouvé la solution. C'est aussi simple que la dernière étape des commandes que j'ai écrites ici. C'est à dire

VBoxManage clonehd fullpath/{uuid-of-last-snapshot}.vdi thedisk-full.vdi

Je ne devrais donc cloner que le dernier instantané, pas tous les instantanés de la chaîne. Et c'est des milliers de pour cent plus vite.

L'uuid peut être trouvé de VBoxManage list hdds | grep VmName | tail

Dans l'interface graphique (sous Windows), sélectionnez la machine virtuelle, sélectionnez Instantanés en haut à droite, cliquez avec le bouton droit de la souris sur l'instantané souhaité, sélectionnez Cloner ... et sélectionnez Full Clone dans la boîte de dialogue.

Andrey Regentov
la source
thx mais cela ne fonctionne pas sur ma configuration, cela signifie que l'image existe déjà. Avez-vous oublié le - existant?
Andy
3
si vous avez déjà un thedisk-full.vdifichier sur le disque, veuillez d’abord changer le nom de la commande en quelque chose comme thedisk-full-new.vdi.
Andrey Regentov
Le chemin complet doit être celui qui est enregistré dans VirtualBox, bien sûr. Les liens symboliques ne fonctionneront pas, car la VBox doit rechercher tous les instantanés
Andy
vous ne savez pas ce que fait la queue, voulez-vous dire " tail -1"?
eckes
1
Dans VirtualBox 5, clonehdobsolète et laissé pour compatibilité, utilisez clonemediumplutôt.
George Sovetov
22

Voici une technique (testée sur VirtualBox 4.3.4) qui utilise la commande 'Cloner' pour fusionner et compacter tous les instantanés en une nouvelle machine virtuelle contenant un seul fichier VDI:

  1. Renommez la machine virtuelle pour pouvoir réutiliser son nom actuel pour la machine virtuelle clonée (vous pouvez modifier le nom de la machine virtuelle à partir de l'onglet "Base" des paramètres "Général").

  2. Cliquez avec le bouton droit sur la machine virtuelle et exécutez la commande 'Cloner ...':

    • Définissez le nom sur le nom d'origine de la machine virtuelle.
    • Accepter les valeurs par défaut restantes, par exemple le type de clone: ​​'Full clone'; Instantanés: 'État actuel de la machine'.
  3. Supprimez l'ancienne machine virtuelle (cliquez avec le bouton droit de la souris sur la machine virtuelle et exécutez la commande 'Supprimer ...').

Stuart Rackham
la source
Depuis VirtualBox 6.0.8, cela fonctionne toujours.
Paul Sturm
3

Vous pouvez essayer d' exporter vers OVF , puis de réimporter le fichier généré.

Comme expliqué ici :

OVF ne peut pas décrire les instantanés pris pour une machine virtuelle. Par conséquent, lorsque vous exportez une machine virtuelle contenant des instantanés, seul l'état actuel de la machine sera exporté et les images de disque de l'exportation auront un état "aplati" identique à l'état actuel de la machine virtuelle.

En conséquence, vous aurez une machine virtuelle clonée avec l'état actuel sans autres instantanés.

StreakyCobra
la source
Je pose la question sur vdis car je ne peux pas exporter la machine - elle était cassée (état inaccessible après le redémarrage de l'hôte), et tout ce que je possédais était un groupe de VDI - un disque et une cinquantaine d'instantanés.
Andrey Regentov
0

Cette opération signifie lire et écrire de très gros fichiers sur le même disque physique. La seule façon d'accélérer ce processus consiste à placer ces fichiers sur différents disques en modifiant les chemins d'accès de votre commande VBoxManage. Si la machine ne possède qu'un seul disque, vous pouvez utiliser un lecteur USB externe ou même un disque d'une autre machine via un partage réseau (en fonction de la vitesse de votre réseau).

Golimar
la source
1
Généralement, le réseau est beaucoup plus lent que l’interface interne du disque dur, ce qui ne rendrait probablement pas le processus plus rapide.
Andrey Regentov
-2

Certains ont un réseau local 10 Gbits / s, ce qui permet de transférer plus d’un giga-octet par seconde.

Certains ont un réseau local de 1 Gib / s, ce qui permet de transférer plus de 100 mégaoctets par seconde. Ce ne sera donc pas un goulot d'étranglement (à moins que vous n'ayez un disque SSD très rapide).

Les disques mécaniques, lorsqu'ils sont lus et écrits sur le même disque au même moment (ou très fragmentés), diminuent de près de 20 mégaoctets par seconde, tandis que sur des lecteurs non fragmentés uniquement en lecture ou en écriture peuvent atteindre plus de 100 mégaoctets par seconde.

Vous dites que le réseau local doit être plus lent, mais pas l’USB (2.0, sans parler de 1.1 ou 1.0), c’est beaucoup plus lent.

Ce que je suggérerais serait: Utilisez USB 3.1 Gen2 Type C ou un eSATA / SATA / SAS

Mais toujours: Utilisez un deuxième disque assez rapide.

Et toujours: cloner sur un autre disque et recopier le fichier est beaucoup plus rapide que d’utiliser un seul disque sauf s’il s’agit d’un disque dur SSD ou d’un disque dur doté de plusieurs bras indépendants (ils peuvent lire et écrire simultanément sur deux disques). endroits de surface, chaque tête a son propre bras, très cher, environ> 9876 €).

Le mieux est de cloner uniquement le disque dur virtuel de l'état souhaité, puis de vérifier son bon fonctionnement, puis de restaurer le niveau supérieur (supprime tous les instantanés), puis de retirer le disque dur en stockage et de le connecter.

Alors, étapes, pour perdre tous les anciens états sur un schéma sans instantané:

  1. Cloner d'un disque dur à un autre, éviter les goulots d'étranglement
  2. Créez une nouvelle machine, connectez ce disque, déconnectez-le, configurez-le comme inmutable
  3. Testez cela fonctionne (car il est immuable), vous aurez le même état
  4. Si vous avez besoin que cela ne soit pas transmissible, déconnectez-le, revenez à la normale, etc.
  5. Supprimer les anciens instantanés de la machine (restaurer d'abord)
  6. Supprimer la machine de test temporelle
  7. Recopier sur le disque le disque virtuel
  8. Joindre le disque cloné

Mais gardez toujours à l'esprit que les instantanés peuvent être comme une arborescence complète, un nœud peut avoir plus d'un enfant, chaque enfant peut avoir plus d'un enfant, etc.

Pour travailler avec des arbres d'instantanés, pensez toujours à supprimer comme supprimer un noeud sans affecter le reste des noeuds enfants de niveau, processus si lent) et sur RESTORE comme détruisant tous ses enfants sur tous les sous-niveaux (perdre tous les états après celui que vous restaurez, il ne supprime que les fichiers, processus donc très rapide, en quelques secondes).

C'est!

PD: Comment les noms horribles que VBOX a donnés à ces deux opérations (supprime un seul nœud = DELETE; supprime tous les nœuds enfants de tous les sous-niveaux = RESTORE)

Claudio
la source
La restauration ne supprime aucun instantané, mais seulement l'état actuel (non enregistré).
Melebius