Question Comment compacter la taille du fichier VDI de VirtualBox?


J'ai une VM VirtualBox qui a configuré une très grande taille de disque dur (plus grande que l'hôte). Par erreur, un programme sur la machine virtuelle 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 devient pas plus petite après avoir utilisé VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

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


269
2018-01-07 03:41


origine




Réponses:


Vous devez suivre les étapes suivantes:

  1. Exécuter defrag dans l'invité (Windows uniquement)
  2. Annule l'espace libre:

    Avec un Invité Linux lance ça:

    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écharger SDelete de Sysinternals et lancez ceci:

    sdelete.exe c: -z
    

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

  3. Arrêtez la VM invitée

  4. Maintenant, lancez VBoxManage modifymedium commande avec le --compact option:

    Avec un Hôte Linux lance ça:

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

    Avec un Hôte Windows lance ça:

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

    Avec un Hôte Mac lance ça:

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

Cela réduit la taille du vdi.


452
2018-01-07 05:05



Pour la personne suivante, ma commande a fini par ressembler à ceci: "C: \ Fichiers programme \ Oracle \ VirtualBox \ VBoxManage.exe" modifyhd "C: \ Utilisateurs \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -compact - Daniel
Selon la page de manuel de l'utilitaire zerofree Linux (manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html), zerofree devrait être mieux que dd pour ce travail. dd n'aurait pas été recommandé car "il est lent", "cela augmente la taille maximale de l'image disque", "elle utilise (temporairement) tout l'espace libre sur le disque, donc d'autres actions d'écriture simultanées peuvent échouer". Zerofree est disponible sur Ubuntu Linux via apte, ou vous pouvez le compiler vous-même. - Dakatine
C'est amusant que la page de manuel de zerofree déclare qu'avec dd les autres écritures concurrentes échoueront, mais zerofree a besoin que le système de fichiers soit monté en lecture seule! * duh * - Madarco
Astuce: placez les deux commandes sur une ligne comme suit: dd ...; rm /bigfile, cela minimisera le temps avec un disque plein au cas où vous n'attendriez pas le dd compléter. - jlh
@Dakatine En utilisant VirtualBox 4.3.10, le fichier image disque a fait ne pas grandir à son maximum. VirtualBox est assez intelligent pour ne pas avoir à écrire tous les blocs zéro sur le disque physique. - jlh


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

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

Exécutez simplement la commande par l'UUID au lieu du nom de fichier:

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

34
2018-06-18 07:20





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

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


11
2018-01-09 10:25



Vous penseriez que sur ce type de site, il y aurait une sorte de mise en évidence de la syntaxe pour DOS mais non. Il semble beaucoup plus joli dans Notepad ++ - CAD bloke
@CAD_bloke nécessiterait un moteur d'analyse et, si vous considérez le nombre de langues différentes affichées sur SE, vous regardez un projet énorme. Pensez simplement au nombre de versions et de dialectes de DOS qu'il y a par exemple et avant même d'arriver à Linux, etc. - Caltor
Très bon point Ironiquement il est mis en évidence sur l'application iOS d'échange de piles. - CAD bloke
Yeah CloneVDI est un moyen bien meilleur et plus rapide pour un usage personnel - VarunAgw


Invité Debian sur l'hôte Windows utilisant Discard / TRIM.

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

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

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

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

Configuration de l'hôte

Avec la sortie de VBox et l'absence de VM, ajoutez le support de suppression à vos disques en définissant les deux discard et nonrotational pour chaque disque du fichier de configuration de la machine virtuelle. En ce moment discard n'est pas dans l'interface graphique, mais nonrotational est exposé comme la case à cocher "Solid-State Drive". (ref: forums vbox, supprimer le support)

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

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

sudo hdparm -I /dev/sda | grep TRIM

Configuration de l'invité

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

devices {
...
    issue_discards = 1
}

Dans fstab, ajoutez le discard option aux systèmes de fichiers que vous souhaitez ignorer automatiquement (réf: 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

Découpez manuellement les blocs libres maintenant avec fstrim. fstrim utilise le système de fichiers monté, pas le périphérique bloc qui le sauvegarde. Au lieu de mettre au rebut en continu fstab, cela pourrait être fait sur un cron hebdomadaire. (Le cron hebdomadaire est recommandé pour les disques SSD physiques susceptibles de prendre en charge TRIM, 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. ssd trim avertissement).

fstrim /
fstrim /build

À ce stade, la taille des systèmes de fichiers dans la machine virtuelle et la taille des images de la machine virtuelle doivent être assez proches.

Testé avec:

  • Guest1: Debian 8.7, noyau: linux 4.8 grsec à partir de 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

5
2018-02-24 16:27





Pour Invité MacOS fais ceci:

  1. Annule 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. Arrêtez la VM invitée

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

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

    OU

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

2
2017-12-16 17:08





Je l'utilise pour mon image VDI montée sur Debian virtuel dans Windows VirtualBox. Ce n'est pas une solution générale, mais cela devrait au moins vous donner une idée de ce que je fais.

Commandes dans Debian:

root@debian:~# lsblk  # show partitions
NOM MAJ: MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 128G 0 disque
Dsdb1 8:17 0 128G 0 part / mnt / web # C'EST LA PARTITION D'INTÉRÊT!
sda 8: 0 0 64G 0 disque
Dasda1 8: 1 0 61,4G 0 part /
Dasda2 8: 2 0 1K 0 partie
Dasda5 8: 5 0 2,7G 0 partie
[SWAP] sr0 11: 0 1 56,3M 0 rom
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 dans Windows:

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

J'espère que cela aide :)


1
2018-02-05 11:31





Je ne veux pas activer la prise en charge TRIM dans OS, car chaque suppression de données forcera 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 le compactage à la main, par ex. une fois par mois.

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

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

Pour faire ça:

  • créer une nouvelle machine virtuelle qui démarre avec GParted Live CD (vous pouvez utiliser votre distribution Linux préférée).
  • Modifier les paramètres de la machine et définir le contrôleur de disque SATA
  • Ajouter des fichiers VDI existants que vous voulez compacter
  • Changez 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 racine 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 de nouveau fichier: fstrim -v /mnt

1
2017-09-15 07:17





Une astuce très utile pour compléter la réponse acceptée est que vous pouvez vous débrouiller sans effectuer de compactage après avoir réduit la taille de l'espace invité, en utilisant un système de fichiers compressé sur l'hôte (par exemple, choisir de compresser le dossier des lecteurs virtuels Hôte Windows). Cela a l'avantage d'économiser beaucoup plus d'espace car les systèmes d'exploitation ont tendance à contenir beaucoup de texte ou de fichiers binaires répétitifs (par exemple, un lecteur invité de 30 Go avec 15 Go d'espace réduit peut atteindre 4 Go sur le lecteur hôte).

Les mises en garde incluent 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
2018-01-20 07:13