2013-01-07 03:41:45 +0000 2013-01-07 03:41:45 +0000
307
307

Comment compacter la taille du fichier VDI de VirtualBox ?

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

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

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

Réponses (8)

520
520
520
2013-01-07 05:05:34 +0000

Vous devez suivre les étapes suivantes :

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

  3. Fermer la VM de l'invité :

  4. Maintenant, lancez la commande modifymedium de VBoxManage avec l'option --compact :

Cela réduit la taille de la VM.

12
12
12
2015-01-09 10:25:08 +0000

Je suis sur un hôte Windows 7 avec des invités Windows, Voici un fichier batch que j'ai écrit pour compacter toutes 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 pour que vous puissiez (en quelque sorte) dire comment ça fonctionne.

edit

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

7
7
7
2017-02-24 16:27:40 +0000

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

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

Cette solution nécessite un système de fichiers invité qui supporte TRIM en continu. Le wiki Arch Linux a une liste 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 le compactage non plus. Le wiki d'Arch Linux contient des informations sur TRIM et les dispositifs de cryptage dm .

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

Lorsque VBox est fermé et qu'aucune VM n'est en cours d'exécution, ajoutez le support de rejet à vos disques en définissant à la fois discard et nonrotational pour chaque disque dans le fichier de configuration de la VM. Pour l'instant, discard n'est pas dans l'interface graphique, mais nonrotational est exposé comme la case à cocher “Solid-state Drive”. (ref : vbox forums, discard support )

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

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

sudo hdparm -I /dev/sda | grep TRIM

Guest Configuration

Si LVM est utilisé, changez le paramètre discard dans /etc/lvm/lvm.conf. (réf : 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 (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 prennent 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é, et non le périphérique de bloc qui le supporte. Au lieu de définir un rejet continu dans fstab, cela pourrait être fait sur un cron hebdomadaire. (Le cron hebdomadaire est recommandé pour les SSDs physiques qui peuvent avoir un support douteux pour TRIM, mais ce n'est pas pertinent ici puisque les SSDs sous-jacents sont gérés par l'OS 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 de la VM devraient être assez proches en valeur.

Testé avec :

  • Guest1 : Debian 8.7, noyau : linux 4.8 grsec à partir des rétroportages, système de fichiers : ext4
  • Guest2 : Debian 9 RC2, noyau : linux 4.9, système de fichiers : ext4
  • Hôte1 : VBox 5.1.14, Win7, image fmt : VDI
  • Host2 : VBox 5.1.14, Win8.1, image fmt : VDI
2
2
2
2016-12-16 17:08:31 +0000

Pour MacOS Guest faites ceci :

  1. Nullifier l'espace libre dans le système des invités :

  2. Fermez la VM de l'invité :

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

1
1
1
2016-02-05 11:31:32 +0000

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

Commandes dans Debian:

root@debian:~# lsblk # show partitions
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 128G 0 disk └─sdb1 8:17 0 128G 0 part /mnt/web # THIS IS THE PARTITION OF INTEREST! sda 8:0 0 64G 0 disk ├─sda1 8:1 0 61,4G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 2,7G 0 part [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

Espérons que cela vous aidera :)

1
1
1
2017-09-15 07:17:05 +0000

Je ne veux pas activer le support TRIM dans le système d'exploitation, car chaque suppression de données forcera le compactage des données dans le fichier VDI, rendant le système invité inutilisable lorsque le fichier VDI est sur le disque rotatif classique. Pour moi, le mieux est d'effectuer le 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 un peu (parfois beaucoup) d'espace libre sur le disque hôte.

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

Pour ce faire :

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

  • démarrer la machine

  • Dans le shell racine de Linux, monter la partition NTFS mount /dev/sda2 /mnt

  • zéro espace libre dd if=/dev/zero of=/mnt/bigfile

  • rm /mnt/bigfile

  • forcer le compactage VDI sans créer de nouveau fichier : fstrim -v /mnt

0
0
0
2019-08-17 06:07:39 +0000

NOTE IMPORTANTE POUR LA LÉGISLATION (~1997-2007) SYSTÈMES D'EXPLOITATION

En général, les techniques des réponses données précédemment sont valables ; CEPENDANT, il existe un cas particulier très important.

Pendant une période de quelques années - peut-être 1997-2007 ou plus - 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, lorsque vous essayez de consommer tout l'espace libre en écrivant un fichier de zéros (ce qui devrait 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 gros

au lieu de ce que vous attendez :

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

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

La solution est simple : continuez à créer des fichiers de mise à zéro séparés, portant des noms différents, jusqu'à ce que le disque manque réellement d'espace.

Si vous êtes un instructeur souhaitant démontrer cette situation pour un cours, une image disque de 4 Go avec une ancienne copie de Red Hat Linux 7.0 est suffisante.

0
0
0
2018-01-20 07:13:01 +0000

Une astuce très intéressante pour compléter la réponse acceptée est que vous pouvez vous en sortir sans aucun compactage après avoir mis à zéro l'espace invité, en utilisant un système de fichiers compressés sur l'hôte (par exemple en choisissant de compresser le dossier des lecteurs virtuels sur les propriétés NTFS sur un hôte Windows). Cela permet en fait d'économiser beaucoup plus d'espace car les systèmes d'exploitation ont tendance à contenir beaucoup de textes répétitifs ou de fichiers binaires (par exemple, un disque invité de 30 Go dont 15 Go d'espace ont été mis à zéro peut se transformer en 4 Go sur le disque hôte).

Avertissement : l'accès au disque sur le matériel réel peut augmenter et il y a une légère augmentation de l'utilisation du CPU.