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

Как уменьшить размер файла VirtualBox VDI?

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

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

Есть ли способ действительно уменьшить размер VDI файла? Спасибо!

Ответы (8)

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

Вы должны сделать следующие шаги:

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

  3. Отключить гостевую ВМ

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

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

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

Я на хосте 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 инструмент и он сделал хорошую работу за гораздо меньшее время и одним щелчком мыши.

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

Гость Debian на хосте Windows с помощью disk/TRIM.

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

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

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

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

Host configuration

С выходом VBox и отсутствием VM, добавьте поддержку дисков, установив discard и nonrotational для каждого диска в конфигурационном файле для ВМ. На данный момент discard не находится в графическом интерфейсе, но nonrotational выставлена флажком как “Solid-state Drive” (полупроводниковый диск). (ссылки: vbox forums, disard support )

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

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

sudo hdparm -I /dev/sda | grep TRIM

Guest Configuration

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

devices {
...
    issue_discards = 1
}

В fstab добавьте опцию discard в файловые системы, которые вы хотите автоматически списать (ref: debian wiki, fstab example )

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 обрабатываются операционной системой хоста. см: На данный момент размер файловых систем внутри ВМ и размер образов ВМ должны быть довольно близки по значению.

  • Guest1: Debian 8.7, ядро: linux 4.8 grsec из бэкспортов, файловая система: 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
2
2
2
2016-12-16 17:08:31 +0000

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

  1. Нуллифицировать свободное пространство в гостевой системе:

  2. Выключить гостевой VM

  3. Выполните эту команду для уменьшения размера образа диска VDI.

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

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

Комманды в 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

Комманды в Windows:

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

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

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

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

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

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

Для этого:

  • создайте новую виртуальную машину, которая загружается с GParted Live CD (вы можете использовать ваш любимый дистрибутив Linux).
  • Редактирование настроек машины и установка SATA контроллера дисков
  • Добавление существующих VDI файлов, которые вы хотите компактно
  • Изменение VDI дисков, чтобы они были видны как SSD с поддержкой TRIM:

  • запуск машины

  • В корневой оболочке Linux, смонтировать NTFS раздел mount /dev/sda2 /mnt

  • нулевое свободное пространство dd if=/dev/zero of=/mnt/bigfile

  • rm /mnt/bigfile

  • принудительное сжатие VDI без создания нового файла: fstrim -v /mnt

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

ВАЖНОЕ ЗАМЕЧАНИЕ ЗА ПЕРИОД (~1997-2007) ОПЕРАТИВНЫЕ СИСТЕМЫ

В общем, методы, приведенные в предыдущих ответах, действительны; КАК КАЖДЫЙ, есть очень важный особый случай.

В течение нескольких лет - возможно 1997-2007 или так - 32-битные операционные системы все еще были нормой, но жесткие диски размером более 2 ГБ уже использовались. В результате, при попытке потреблять все свободное пространство, записывая файл нулей (что всегда должно быть сделано как root, чтобы включить привилегированное свободное пространство root, к которому никто другой не может прикоснуться), вы можете увидеть:

Файл слишком большой

Вместо того, что вы ожидали:

Не осталось места на устройстве.

Если это произойдет, вы, скорее всего, столкнетесь с ограничением по размеру файла 2 ГБ. В то время это было обычным делом, так как многие файловые операции возвращали результаты в подписанных 32-битных целых числах, так что отрицательные значения могли сообщать об ошибках. Это фактически означало, что результаты смещения были ограничены до 2^31 байт без специальных мер.

Обходной путь прост: продолжайте создавать отдельные, по-разному названные обнуляющие файлы, пока на диске действительно не закончится место.

Если вы инструктор, желающий продемонстрировать эту ситуацию для класса, достаточно 4 ГБ образа диска со старой копией Red Hat Linux 7.0.

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

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

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

Похожие вопросы

11
5
7
9
2