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!
Vous devez suivre les étapes suivantes:
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))
Arrêtez la machine virtuelle invitée
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.
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
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
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.
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
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:
Pour Invité MacOS procédez comme suit:
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)
Arrêtez la machine virtuelle invitée
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
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:
VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on
mount /dev/sda2 /mnt
dd if=/dev/zero of=/mnt/bigfile
rm /mnt/bigfile
fstrim -v /mnt
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 :)
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.