368 votes

Comment compacter la taille du fichier VDI de VirtualBox ?

J'ai une VM VirtualBox qui est configurée avec une taille de disque dur très grande (plus grande que l'hôte). Par erreur, un programme sur la VM a généré beaucoup de fichiers journaux et la taille du fichier VDI ne cesse d'augmenter jusqu'à ce qu'il n'y ait plus d'espace sur l'hôte.

Maintenant j'ai supprimé les fichiers journaux mais la taille du fichier VDI ne diminue pas après avoir utilisé VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

Y a-t-il un moyen de vraiment compacter la taille du fichier VDI? Merci!

634voto

magicandre1981 Points 94338

Vous devez suivre les étapes suivantes :

  1. Exécutez la défragmentation dans la machine virtuelle (Windows uniquement)

  2. Annulez l'espace libre :

    Avec un invité Linux, exécutez ceci :

     dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile

    Ou :

     telinit 1
     mount -o remount,ro /dev/sda1
     zerofree -v /dev/sda1

    Avec un invité Windows, téléchargez SDelete de Sysinternals et exécutez ceci :

     sdelete.exe c: -z

(remplacez C: par la lettre de lecteur du VDI)

  1. Éteignez la machine virtuelle invitée

  2. Exécutez maintenant la commande modifymedium de VBoxManage avec l'option --compact :

    Avec un hôte Linux, exécutez ceci :

     vboxmanage modifymedium --compact /chemin/vers/ledisque.vdi

    Avec un hôte Windows, exécutez ceci :

     VBoxManage.exe modifymedium --compact c:\chemin\vers\ledisque.vdi

    Avec un hôte Mac, exécutez ceci :

     VBoxManage modifymedium --compact /chemin/vers/ledisque.vdi

    VBoxManage se trouve ici : /Applications/VirtualBox.app/Contents/MacOS/VBoxManage

Cela réduit la taille du vdi.

0 votes

@user248749 FYI, dd sans argument copie un bloc à la fois et non un octet. Utiliser une taille de bloc plus grande peut accélérer les choses, mais l'effet est assez mineur.

22 votes

Pour la personne suivante, ma commande a fini par ressembler à ceci : "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd "C:\Users\daniel\VirtualBox VMs\....\thedisk.vdi" --compact

41 votes

Selon la page de manuel de l'utilitaire Linux zerofree (manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html), zerofree devrait être meilleur que dd pour ce travail. dd ne serait pas recommandé car "il est lent", "il fait croître l'image du disque (temporairement) à sa taille maximale", "il utilise (temporairement) tout l'espace libre sur le disque, de sorte que d'autres actions d'écriture concurrentes peuvent échouer". Zerofree est disponible sur Ubuntu Linux via apt, ou vous pouvez le compiler vous-même.

20voto

Andrew Domaszek Points 591

Invité Debian sur un hôte Windows utilisant discard/TRIM.

Ceci n'est pas une réponse directe en soi, car je traite le problème, pas la question. Au lieu de compacter périodiquement l'image, cette solution utilise le discard pour supprimer automatiquement les blocs inutilisés dans l'image disque de la machine virtuelle de l'hôte.

Cette solution nécessite un système de fichiers invité prenant en charge le TRIM continu. Le wiki Arch Linux propose une liste des systèmes de fichiers prenant en charge les opérations TRIM.

La FDE et cryptoroot ne sont pas couverts spécifiquement, car il y a des préoccupations en matière de sécurité et aucune des autres solutions à cette question ne permettrait non plus de compacter. Le wiki Arch Linux fournit des informations sur TRIM et les dispositifs dm-crypt.

En théorie, cela fonctionnera pour tous les invités Linux sur des hôtes VBox utilisant un stockage VDI.

Configuration de l'hôte

Après avoir quitté VBox et sans VM en cours d'exécution, ajoutez la prise en charge du discard à vos disques en définissant à la fois discard et nonrotational pour chaque disque dans le fichier de configuration de la VM. Pour le moment, discard n'est pas dans l'interface graphique, mais nonrotational est exposé sous forme de case à cocher "Disque à semi-conducteurs". (source : forums de vbox, prise en charge du discard)

Démarrez la VM et vérifiez que le support TRIM est activé :

sudo hdparm -I /dev/sda | grep TRIM

Configuration de l'invité

Si LVM est utilisé, modifiez le paramètre discard dans le fichier /etc/lvm/lvm.conf. (source : wiki debian, exemple de lvm.conf)

devices {
...
    issue_discards = 1
}

Dans fstab, ajoutez l'option discard aux systèmes de fichiers que vous souhaitez activer l'auto-discard (source : wiki debian, exemple de fstab)

UUID=8db6787f-1e82-42d8-b39f-8b7491a0523c   /   ext4    discard,errors=remount-ro   0   1
UUID=70bfca92-8454-4777-9d87-a7face32b7e7   /build  ext4    discard,errors=remount-ro,noatime   0   1

Remontez les systèmes de fichiers pour qu'ils prennent en compte leurs nouvelles options.

sudo mount -o remount /
sudo mount -o remount /build

Traitez manuellement les blocs libres maintenant avec fstrim. fstrim utilise le système de fichiers monté, pas le périphérique de blocage le sauvegardant. Au lieu de définir un discard continu dans fstab, cela pourrait être fait sur un cron hebdomadaire. (Le cron hebdomadaire est recommandé pour les SSD physiques qui peuvent avoir un support TRIM douteux, mais ce n'est pas pertinent ici puisque les SSD sous-jacents sont gérés par le système d'exploitation hôte. voir : avertissement de trim ssd).

fstrim /
fstrim /build

À ce stade, la taille des systèmes de fichiers à l'intérieur de la VM et la taille des images de la VM devraient être assez proches en valeur.

Testé avec :

  • Invité1 : Debian 8.7, noyau : linux 4.8 grsec de backports, système de fichiers : ext4
  • Invité2 : Debian 9 RC2, noyau : linux 4.9, système de fichiers : ext4
  • Hôte1 : VBox 5.1.14, Win7, format d'image : VDI
  • Hôte2 : VBox 5.1.14, Win8.1, format d'image : VDI

0 votes

Je préfère une coupe périodique, moi-même : "sudo systemctrl enable fstrim.timer"

17voto

tamberg Points 1444

Je suis sur un hôte Windows 7 avec des invités Windows, voici un fichier batch que j'ai écrit pour compacter tous les VDIs dans une arborescence de dossiers

echo off
mode con:cols=140 lines=200
cls
:: voir https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: Comment puis-je réduire la taille d'un fichier VDI dynamique sur le disque?
:: mais cette page dit d'utiliser sdelete -s qui est suboptimal.
:: utilisez -z comme indiqué dans http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx

:: Tout d'abord exécutez le sdelete -z c: à l'intérieur des VM qui met à zéro tout l'espace libre
:: ENSUITE exécutez ce fichier batch

Title Compactage de l'espace libre sur les machines virtuelles VM

:: http://ss64.com/nt/for_r.html
:: http://stackoverflow.com/questions/8836368/windows-batch-file-how-to-loop-through-files-in-a-directory/8836401#8836401

Setlocal EnableDelayedExpansion
:: http://ss64.com/nt/delayedexpansion.html ...
:: Remarquez que dans la boucle for nous utilisons !variable! au lieu de %variable%.

For /R %CD% %%G IN (*.vdi) DO (
 set ohai=%%G
 set lastfive=!ohai:~-5!
:: Ignorer les instantanées qui sont nommées {guid}.vdi
 if NOT !lastfive!==}.vdi (
 echo .
 echo Compacter %%G
 "C:\Program Files\Oracle\VirtualBox\VboxManage.exe" modifyhd "%%G" --compact )
 )

pause
exit

J'ai laissé les liens dans les commentaires pour que vous puissiez (en quelque sorte) comprendre comment ça fonctionne.

édition

Eh bien, après tout ça, j'ai essayé l'outil CloneVDI et il a fait du bon travail en beaucoup moins de temps et en un clic.

5 votes

Vous penseriez sur ce genre de site qu'il y aurait une sorte de coloration syntaxique pour DOS mais non. Ça a l'air beaucoup plus joli dans Notepad++

2 votes

@CAD_bloke cela nécessiterait un moteur d'analyse et quand on pense au nombre de langues différentes postées sur SE, on se retrouve face à un ÉNORME projet. Pensez juste au nombre de versions et de dialectes de DOS par exemple et ce, avant même d'arriver à Linux, etc.

0 votes

Très bon point. Ironiquement, il est mis en valeur dans l'application iOS de Stack Exchange.

4voto

Mrskman Points 141

Pour macOS Guest, faites ceci :

  1. Annuler l'espace libre dans le système invité :

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"

    (remplacez /Volumes/Macintosh HD par le nom de votre lecteur)

  2. Éteignez la machine virtuelle invitée

  3. Exécutez cette commande pour réduire la taille de l'image disque VDI

    VBoxManage modifyhd /chemin/vers/lenouveau.vdi --compact

    OU

    VBoxManage modifymedium /chemin/vers/lenouveau.vdi --compact

4voto

breakpoint Points 141

NOTE IMPORTANTE POUR LES SYSTÈMES D'EXPLOITATION OBSOLÈTES (~1997-2007)

En général, les techniques des réponses précédemment données sont valides ; CEPENDANT, il y a un cas très important à prendre en compte.

Pendant quelques années - peut-être 1997-2007 environ - les systèmes d'exploitation 32 bits étaient encore la norme, mais des disques durs de plus de 2 Go étaient déjà utilisés. Par conséquent, lors de la tentative de consommation de tout l'espace libre en écrivant un fichier de zéros (ce qui doit toujours être fait en tant que root, pour inclure l'espace libre privilégié de root, que personne d'autre ne peut toucher), vous pouvez voir :

Fichier trop grand

au lieu de ce à quoi vous vous attendez :

Pas d'espace disponible sur le périphérique.

Si cela se produit, vous avez très probablement atteint une limitation de taille de fichier de 2 Go. C'était courant à l'époque car de nombreuses opérations de fichiers renvoyaient des résultats sous forme de entiers signés sur 32 bits, de sorte que des valeurs négatives pouvaient signaler des codes d'erreur. Cela signifiait en réalité que les résultats de décalage étaient limités à 2^31 octets sans mesures spéciales.

La solution de contournement est simple : continuez à créer des fichiers de zéros séparés et portant des noms différents jusqu'à ce que le disque soit réellement saturé.

Si vous êtes un formateur souhaitant illustrer cette situation pour une classe, une image disque de 4 Go avec une ancienne copie de Red Hat Linux 7.0 est suffisante.

2 votes

Ajout d'infos historiques supplémentaires : le support de fichiers volumineux Linux commence dans glibc 2.2 + linux 2.4.0. Le support de fichiers volumineux Windows commence dans NTFS, bien que les anciennes versions comme Win2k auront d'autres limites de disque (48-bit LBA 128 GiB max disque, etc).

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