Вопрос: Как сжать размер файла VDI VirtualBox?


У меня есть виртуальная виртуальная машина VM, которая настроила очень большой размер жесткого диска (больше, чем хост). По моей ошибке, программа на виртуальной машине создала много файлов журнала, а размер файла VDI продолжает расти, пока на хосте не останется места.

Теперь я удалил файлы журнала, но размер файла VDI не стал меньше после использования VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

Есть ли способ действительно сократить размер файла VDI? Благодаря!


269
2018-01-07 03:41


Источник




Ответы:


Вам необходимо выполнить следующие действия:

  1. Запуск дефрагментации в гостевой системе (только для Windows)
  2. Освободите свободное пространство:

    С Гость Linux выполните следующее:

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

    Или:

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

    С Гость Windows, скачать SDelete от Sysinternals и запустить это:

    sdelete.exe c: -z
    

    (заменить C: буквой привода VDI)

  3. Завершение гостевой виртуальной машины

  4. Теперь запустите VBoxManage modifymedium команды с --compact опция:

    С Linux Host выполните следующее:

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

    С Windows Host выполните следующее:

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

    С Mac Host выполните следующее:

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

Это уменьшает размер vdi.


451
2018-01-07 05:05



Для следующего человека моя команда выглядела так: «C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe« modifyhd »C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -compact - Daniel
Согласно справочной странице утилиты zerofree Linux (manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html), нулевое значение должно быть лучше, чем дд для этой работы. дд не рекомендуется, потому что «он медленный», «он делает образ диска (временно) возрастающим до максимальной степени», «он (временно) использует все свободное пространство на диске, поэтому другие одновременные действия записи могут завершиться неудачно». Zerofree доступен на Ubuntu Linux через склонный, или вы можете скомпилировать его самостоятельно. - Dakatine
Приятно, что zerofree заявляет, что с дд другие одновременные записи не сработают, но zerofree нуждается в установке файловой системы только для чтения! * * Дух - Madarco
Совет. Поместите две команды на одну строку следующим образом: dd ...; rm /bigfile, это минимизирует время с полным диском, если вы не дожидаетесь dd завершить. - jlh
@Dakatine Используя VirtualBox 4.3.10, файл образа диска сделал не расти в максимальной степени. VirtualBox достаточно умен, чтобы не документировать все нулевые блоки на физическом диске. - jlh


Если запуск команды в принятом ответе вызывает бесполезное сообщение об ошибке, подобное этому

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

Просто запустите команду UUID вместо имени файла:

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

34
2018-06-18 07:20





Я на хосте Windows 7 с гостевыми компьютерами Windows. Вот пакетный файл, который я написал для компакт-дисков всех VDI в дереве папок

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

Я оставил ссылки в комментариях, чтобы вы (вроде) рассказывали, как это работает.

редактировать

Ну, после всего этого я попробовал Инструмент CloneVDI и он сделал хорошую работу за меньшее время и одним щелчком мыши.


11
2018-01-09 10:25



Вы бы подумали, что на этом сайте будет какая-то подсветка синтаксиса для DOS, но нет. Это выглядит намного красивее в Notepad ++ - CAD bloke
@CAD_bloke, для которого потребуется механизм синтаксического анализа, и когда вы рассмотрите количество разных языков, опубликованных в SE, вы смотрите на ОГРОМНЫЙ проект. Просто подумайте, сколько версий и диалектов DOS есть, например, и до того, как вы даже доберетесь до Linux и т. Д. - Caltor
Очень хорошая точка. По иронии судьбы является выделенный в приложении IOS для обмена столами. - CAD bloke
Yeah CloneVDI намного лучше и быстрее для личного использования - VarunAgw


Гость Debian на хосте Windows с помощью утилиты / TRIM.

Это не прямой ответ как таковой, поскольку я рассматриваю проблему, а не вопрос. Вместо того, чтобы периодически уплотнять изображение, это решение использует сброс для автоматического удаления неиспользуемых блоков в образ диска VM на хосте.

Это решение требует гостевой файловой системы, которая поддерживает непрерывный TRIM. В вики Arch Linux есть список файловых систем, поддерживающих операции TRIM,

FDE и крипторут специально не охвачены, так как есть проблемы с безопасностью, и ни одно из других решений этого вопроса не даст возможности уплотнения. В вики Arch Linux есть информация о Устройства TRIM и dm-crypt,

Теоретически это будет работать для всех гостей Linux на VBox-хостах, использующих VDI-хранилище.

Конфигурация узла

После выхода VBox и без использования виртуальных машин добавьте поддержку отбрасывания на свои диски, установив оба discard а также nonrotational для каждого диска в файле конфигурации для виртуальной машины. В это время discard не находится в графическом интерфейсе, но nonrotational отображается как флажок «Твердотельный накопитель». (Ссылка: форумы vbox, отказаться от поддержки)

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

Загрузите VM вверх и убедитесь, что включена поддержка TRIM:

sudo hdparm -I /dev/sda | grep TRIM

Конфигурация гостей

Если LVM используется, измените настройку сброса в /etc/lvm/lvm.conf, (Ссылка: debian wiki, пример lvm.conf)

devices {
...
    issue_discards = 1
}

В fstab добавьте discard вариант для файловых систем, которые вы хотите автоматически сбросить (ref: debian wiki, пример 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

Перезагрузите файловые системы, чтобы они забрали свои новые параметры.

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

Теперь вручную обрезаем свободные блоки fstrim, fstrim использует смонтированную файловую систему, а не блок-устройство, поддерживающее ее. Вместо того, чтобы устанавливать непрерывный сброс в fstab, это можно сделать в еженедельном cron. (Еженедельный cron рекомендуется для физических SSD, которые могут иметь сомнительную поддержку TRIM, но здесь это не имеет никакого значения, поскольку базовые SSD обрабатываются операционной системой хоста. См. предупреждение ssd trim).

fstrim /
fstrim /build

На данный момент размер файловых систем внутри виртуальной машины и размер изображений VM должны быть довольно близкими по стоимости.

Протестировано с помощью:

  • Guest1: Debian 8.7, ядро: linux 4.8 grsec из backports, файловая система: ext4
  • Guest2: Debian 9 RC2, ядро: linux 4.9, файловая система: ext4
  • Host1: VBox 5.1.14, Win7, изображение fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, изображение fmt: VDI

5
2018-02-24 16:27





Для Гость MacOS сделай это:

  1. Освободите место в гостевой системе:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (замените / Объемы / Macintosh HD с именем вашего диска)

  2. Завершение гостевой виртуальной машины

  3. Запустите эту команду, чтобы уменьшить размер образа диска VDI

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

    ИЛИ

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

2
2017-12-16 17:08





Я использую это для моего изображения VDI, смонтированного на виртуальном Debian в Windows VirtualBox. Это не общее решение, но оно должно по крайней мере дать вам суть того, что я делаю.

Команды в Debian:

root@debian:~# lsblk  # show partitions
NAME MAJ: MIN RM РАЗМЕР RO ТИПА MOUNTPOINT
sdb 8:16 0 128G 0 диск
└─sdb1 8:17 0 128G 0 part / mnt / web # ЭТО ОБЕСПЕЧЕНИЕ ИНТЕРЕСА!
sda 8: 0 0 64G 0 диск
├─sda1 8: 1 0 61,4G 0 часть /
├─sda2 8: 2 0 1K 0 часть
└─sda5 8: 5 0 2,7G 0 часть
[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

Команды в Windows:

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

Надеюсь, поможет :)


1
2018-02-05 11:31





Я не хочу включать поддержку TRIM в ОС, потому что каждое удаление данных заставляет уплотнение данных в файле VDI, что делает гостевую систему непригодной, когда VDI-файл находится на классическом вращательном диске. Для меня лучше выполнять компактирование вручную, например. один раз в месяц.

Во время нормального уплотнения содержимое файла VDI копируется в новый файл. Для этого требуется некоторое (иногда большое) свободное место на диске хоста.

У меня есть решение, подобное указанию Эндрю Домаскека. Он работает очень хорошо даже с NTFS (Windows10).

Сделать это:

  • создать новую виртуальную машину, которая загружается с GParted Live CD (вы можете использовать свой любимый дистрибутив Linux).
  • Измените настройки машины и установите контроллер диска SATA
  • Добавьте существующие файлы VDI, которые вы хотите сжать
  • Измените диски на базе VDI, чтобы они отображались как SSD с поддержкой 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

  • запустить машину
  • В корневой оболочке Linux монтируйте раздел NTFS mount /dev/sda2 /mnt
  • нулевое свободное пространство dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • принудительное уплотнение VDI без создания нового файла: fstrim -v /mnt

1
2017-09-15 07:17





Очень аккуратный прием в дополнение к принятому ответу заключается в том, что вы можете уйти без каких-либо уплотнений после обнуления гостевого пространства, используя сжатую файловую систему на хосте (например, для сжатия папки виртуальных дисков на свойствах NTFS на Хост Windows). Это на самом деле имеет преимущество, позволяющее сэкономить гораздо больше места, потому что операционные системы имеют тенденцию хранить много повторяющихся текстовых или двоичных файлов (например, гостевой диск на 30 ГБ с 15 ГБ свободного места может перейти на 4 ГБ на главном диске).

Предостережения включают, что доступ к диску на реальном оборудовании может увеличиться, и есть небольшое увеличение использования ЦП.


0
2018-01-20 07:13