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

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

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

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

269 голосов | спросил DeepNightTwo 7 Jam1000000amMon, 07 Jan 2013 07:41:45 +040013 2013, 07:41:45

8 ответов


451

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

  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. Теперь запустите команду modifymedium VBoxManage - compact:

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

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

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

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

    С помощью Mac хоста выполните следующее:

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

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

ответил magicandre1981 7 Jam1000000amMon, 07 Jan 2013 09:05:34 +040013 2013, 09:05:34
34

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

VBoxManage.exe: ошибка: не удается зарегистрировать жесткий диск 'thedisk.vdi'
{aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee}, потому что жесткий диск 'thedisk.vdi'
с UUID {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} уже существует

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

VBoxManage.exe modifyhd {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} --compact
ответил DustWolf 18 J0000006Europe/Moscow 2014, 11:20:26
11

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

echo off
mode con: cols = 140 строк = 200
ЦБС
:: см. https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: Как уменьшить размер динамического VDI на диске?
:: но эта страница говорит использовать sdelete -s, который является субоптимальным.
:: использовать -z согласно http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx

:: Сначала запустите sdelete -z c: внутри виртуальных машин, которые обнуляют все свободное пространство
:: THEN запустите этот командный файл

Сокращение заголовков Свободное место на виртуальных машинах виртуальной машины

:: 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 ...
:: Обратите внимание, что в цикле for мы используем переменную! вместо% variable%.

Для /R% CD% %% G IN (* .vdi) DO (
 set ohai = %% G
 set lastfive =! ohai: ~ -5!
:: Пропустить снимки, которые называются {guid} .vdi
 if NOT! lastfive! ==}. vdi (
 эхо.
 echo Compacting %% G
 "C: \ Program Files \ Oracle \ VirtualBox \ VboxManage.exe" modifyhd "%% G" --compact)
 )

Пауза
Выход

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

изменить

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

ответил CAD bloke 9 Jpm1000000pmFri, 09 Jan 2015 13:25:08 +030015 2015, 13:25:08
5

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

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

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

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

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

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

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

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

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

sudo hdparm -I /dev /sda | grep TRIM

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

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

устройства {
...
    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 обрабатываются ОС хоста. См. Ниже: предупреждение 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
ответил Andrew Domaszek 24 FebruaryEurope/MoscowbFri, 24 Feb 2017 19:27:40 +0300000000pmFri, 24 Feb 2017 19:27:40 +030017 2017, 19:27:40
2

Для MacOS Guest выполните следующие действия:

  1. Устранить свободное пространство в гостевой системе:

    diskutil secureErase freespace 0 "/Тома /Macintosh HD"
    

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

  2. Выключение гостевой виртуальной машины

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

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

    ИЛИ

    VBoxManage modifymedium /path/to/thedisk.vdi --compact
    
ответил Mrskman 16 FriEurope/Moscow2016-12-16T20:08:31+03:00Europe/Moscow12bEurope/MoscowFri, 16 Dec 2016 20:08:31 +0300 2016, 20:08:31
1

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

Команды в Debian:

root @ debian: ~ # lsblk # показать разделы
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 # завершить все операции с разделом
root @ debian: ~ # service apache2 stop # завершить все операции с разделом
root @ debian: ~ # umount /mnt /web # отключить раздел
root @ debian: ~ # apt-get install zerofree # инструмент установки для заполнения нулей в пустое пространство
root @ debian: ~ # zerofree -v /dev /sdb1 # заполнить нулями
root @ debian: ~ # poweroff # shut down машина

Команды в Windows:

C: \ Program Files \ Oracle \ VirtualBox> VBoxManage.exe modifyhd --compact "D: \ VirtualBox VMs \ web.vdi" # конвертировать нули в пустое пространство

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

ответил Dejv 5 FebruaryEurope/MoscowbFri, 05 Feb 2016 14:31:32 +0300000000pmFri, 05 Feb 2016 14:31:32 +030016 2016, 14:31:32
1

Я не хочу включать поддержку 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 --nrorotational on VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nrorotational on

  • запустить машину
  • В корневой оболочке Linux монтируйте раздел NTFS mount /dev /sda2 /mnt
  • нулевое свободное пространство dd if = /dev /zero of = /mnt /bigfile
  • rm /mnt /bigfile
  • принудительное уплотнение VDI без создания нового файла: fstrim -v /mnt
ответил niziak 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 10:17:05 +0300 2017, 10:17:05
0

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

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

ответил j riv 20 Jam1000000amSat, 20 Jan 2018 10:13:01 +030018 2018, 10:13:01

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132