web-dev-qa-db-fra.com

Comment compacter la taille du fichier VDI de VirtualBox?

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

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

Existe-t-il un moyen de compacter réellement la taille du fichier VDI? Merci!

296
DeepNightTwo

Vous devez suivre les étapes suivantes:

  1. Exécuter defrag dans l'invité (Windows uniquement)
  2. Nullify free space:

    Avec un Invité Linux lancez 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échargezSDeleteà partir de Sysinternals et lancez ceci:

    sdelete.exe c: -z
    

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

  3. Arrêtez la machine virtuelle invitée

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

    Avec un Linux Host lancez ceci:

    vboxmanage modifymedium --compact /path/to/thedisk.vdi
    

    Avec un Windows Host lancez ceci:

    VBoxManage.exe modifymedium --compact c:\path\to\thedisk.vdi
    

    Avec un Mac Host lancez ceci:

    VBoxManage modifymedium --compact /path/to/thedisk.vdi
    

Cela réduit la taille de vdi.

494
magicandre1981

Si l'exécution de la commande dans la réponse acceptée génère un message d'erreur inutile, comme ceci

VBoxManage.exe: error: Cannot register the hard disk 'thedisk.vdi'
{aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} because a hard disk 'thedisk.vdi'
with UUID {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} already exists

Il suffit d’exécuter la commande avec l’UUID au lieu du nom de fichier:

VBoxManage.exe modifyhd {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} --compact
37
DustWolf

Je suis sur un hôte Windows 7 avec des invités Windows. Voici un fichier de commandes que j'ai écrit pour Compacter tous les VDI dans une arborescence de dossiers.

echo off
mode con:cols=140 lines=200
cls
:: see https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: How can I reduce the size of a dynamic VDI on disk?
:: but that page says to use sdelete -s which is suboptimal. 
:: use -z as per http://technet.Microsoft.com/en-us/sysinternals/bb897443.aspx

:: First run the sdelete -z c: inside the VMs that zero-out all the free space
:: THEN run this batch file 

Title Compacting Free space on Virtual Machine VMs

:: 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 ... 
:: Notice that within the for loop we use !variable! instead of %variable%.

For /R %CD% %%G IN (*.vdi) DO (
 set ohai=%%G
 set lastfive=!ohai:~-5!
:: Skip snapshots which are named {guid}.vdi
 if NOT !lastfive!==}.vdi (
 echo .
 echo Compacting %%G
 "C:\Program Files\Oracle\VirtualBox\VboxManage.exe" modifyhd "%%G" --compact )
 )

pause 
exit

J'ai laissé les liens dans les commentaires afin que vous puissiez (en quelque sorte) dire comment cela fonctionne.

modifier

Après tout cela, j’ai essayé l’outil CloneVDI et il a fait du bon travail en beaucoup moins de temps et en un clic.

11
CAD bloke

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

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

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

FDE et cryptoroot ne sont pas spécifiquement couverts, car il y a des problèmes de sécurité et aucune des autres solutions à cette question ne permettrait un compactage non plus. Le wiki Arch Linux contient des informations sur les périphériques TRIM et dm-crypt .

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

Configuration de l'hôte

Avec la VBox fermée et aucune machine virtuelle en cours d'exécution, ajoutez le support de suppression à vos disques en définissant les valeurs discard et nonrotational pour chaque disque du fichier de configuration de la machine virtuelle. À l'heure actuelle, discard n'est pas dans l'interface graphique, mais nonrotational est exposé en tant que case à cocher "Disque SSD". (ref: forums vbox, supprimer le support )

<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >

Démarrez la VM et vérifiez que la prise en charge de TRIM est activée:

Sudo hdparm -I /dev/sda | grep TRIM

Configuration d'invité

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

devices {
...
    issue_discards = 1
}

Dans fstab, ajoutez l'option discard aux systèmes de fichiers que vous souhaitez supprimer automatiquement (ref: wiki debian, exemple 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 récupèrent leurs nouvelles options.

Sudo mount -o remount /
Sudo mount -o remount /build

Coupez manuellement les blocs libres maintenant avec fstrim. fstrim utilise le système de fichiers monté, pas le périphérique de blocage qui le sauvegarde. Au lieu de définir un rejet continu dans fstab, ceci pourrait être effectué sur un cron hebdomadaire. (Le cron hebdomadaire est recommandé pour les disques SSD physiques pouvant prendre en charge TRIM de manière discutable, mais cela n’est pas pertinent ici car les disques SSD sous-jacents sont gérés par le système d’exploitation hôte. Voir: ssd trim warning ).

fstrim /
fstrim /build

À ce stade, la taille des systèmes de fichiers à l'intérieur de la VM et la taille des images VM doivent avoir une valeur assez proche.

Testé avec:

  • Guest1: Debian 8.7, noyau: linux 4.8 grsec depuis les backports, système de fichiers: ext4
  • Guest2: Debian 9 RC2, noyau: linux 4.9, système de fichiers: ext4
  • Host1: VBox 5.1.14, Win7, image fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, image fmt: VDI
6
Andrew Domaszek

Pour Invité MacOS procédez comme suit:

  1. Supprimez l’espace libre dans le système invité:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

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

  2. Arrêtez la machine virtuelle invitée

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

    VBoxManage modifyhd /path/to/thedisk.vdi --compact
    

    OR

    VBoxManage modifymedium /path/to/thedisk.vdi --compact
    
2
Mrskman

Je ne souhaite pas activer la prise en charge TRIM dans le système d'exploitation, car chaque suppression de données obligera le compactage des données dans un fichier VDI, rendant le système invité inutilisable lorsque le fichier VDI se trouve sur un disque rotatif classique. Pour moi, le mieux est d'effectuer un compactage à la main, par exemple. une fois par mois.

Lors du compactage normal, le contenu du fichier VDI est copié dans un nouveau fichier. Cela nécessite de l’espace libre (parfois grand) sur le disque hôte.

J'ai une solution similaire à celle proposée par Andrew Domaszek. Cela fonctionne très bien même avec NTFS (Windows10).

Pour faire ça:

  • créer une nouvelle machine virtuelle démarrant avec Live CD GPart (vous pouvez utiliser votre distribution Linux préférée).
  • Modifier les paramètres de la machine et configurer le contrôleur de disque SATA
  • Ajouter des fichiers VDI existants que vous souhaitez compacter
  • Modifiez les disques basés sur VDI pour qu'ils soient visibles en tant que SSD avec le support TRIM:

VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on

  • démarrer la machine
  • Dans le shell root Linux, montez la partition NTFS mount /dev/sda2 /mnt
  • zéro espace libre dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • forcer le compactage de VDI sans créer un nouveau fichier: fstrim -v /mnt
1
niziak

J'utilise ceci pour mon image VDI montée sur Debian virtuelle dans Windows VirtualBox. Ce n'est pas une solution générale, mais cela devrait au moins vous donner un résumé de ce que je fais.

Commandes dans Debian:

root@debian:~# lsblk  # show partitions
 NOM MAJ: MIN RM TAILLE RO TYPE MOUNTPOINT 
 Sdb 8:16 0 128G 0 disque 
 Sdb1 8:17 0 128G 0 part/mnt/web # This IS LE PARTAGE D'INTERET! 
 sda 8: 0 0 64G 0 disque 
 sda1 8: 1 0 61,4G 0 part/
 Sda2 8: 2 0 1K 0 partie 
 Sda5 8: 5 0 2,7G 0 partie 
 [SWAP] sr0 11: 0 1 56,3M 0 de 
root@debian:~# service mysql stop  # terminate all operations with partition
root@debian:~# service Apache2 stop  # terminate all operations with partition
root@debian:~# umount /mnt/web  # unplug partition
root@debian:~# apt-get install zerofree  # install tool for filling in zeros to empty space
root@debian:~# zerofree -v /dev/sdb1  # fill with zeros
root@debian:~# poweroff  # shut down machine

Commandes sous Windows:

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd --compact "D:\VirtualBox VMs\web.vdi"  # convert zeros to empty space

J'espère que ça aide :)

1
Dejv

Une astuce très utile pour compléter la réponse acceptée est que vous pouvez vous échapper sans aucune compression après la remise à zéro de l'espace invité, en utilisant un système de fichiers compressé sur l'hôte (par exemple, en choisissant de compresser le dossier des lecteurs virtuels sur Hôte Windows). En fait, cela permet de gagner beaucoup plus d’espace, car les systèmes d’exploitation contiennent généralement beaucoup de fichiers texte ou binaires répétitifs (par exemple, un lecteur invité de 30 Go disposant de 15 Go d’espace mis à zéro peut atteindre 4 Go sur le lecteur hôte).

Les mises en garde impliquent que l'accès au disque sur le matériel réel peut augmenter et que l'utilisation du processeur augmente légèrement.

0
j riv