Гид по технологиям

Как сжать динамический VDI‑файл виртуального диска VirtualBox

10 min read VirtualBox Обновлено 14 Dec 2025
Как сжать динамический VDI-образ в VirtualBox
Как сжать динамический VDI-образ в VirtualBox

Быстрая навигация

  • Шаг 1: Убедитесь, что у вас динамический диск
  • Шаг 2: Запишите нули в свободное место внутри виртуальной машины
  • Шаг 3: Найдите команду VBoxManage на хосте
  • Шаг 4: Найдите путь к VDI-файлу, который хотите сжать
  • Шаг 5: Выполните операцию сжатия
  • Также рассмотрите удаление снимков снапшотов

Снимок экрана: логотип VirtualBox и окно управления

Важно: описанная процедура подходит только для динамически выделяемых (dynamically allocated) дисков. Фиксированные диски (fixed size) всегда занимают указанное место и не уменьшаются до тех пор, пока вы их не пересоздадите или не конвертируете в динамические.


Кому это нужно и когда это работает

Цель — вернуть место на диске хоста, которое ранее занимал виртуальный диск, но было освобождено внутри гостевой ОС. Это сработает, если:

  • Диск был динамическим и реально вырос выше базового размера; и
  • Вы удалили файлы внутри гостя, а затем перезаписали свободное пространство нулями.

Не сработает если:

  • Вы только что создали пустой динамический диск — он уже минимален; или
  • Данные удалены, но свободное пространство не было очищено/перезаписано нулями; или
  • Существуют активные цепочки снапшотов, блокирующие объединение данных.

Рекомендуемая последовательность действий всегда: сделать бэкап VDI перед изменениями, особенно для важных виртуальных машин.

Шаг 1: Убедитесь, что диск динамический

Этот процесс работает только с динамическими дисками (Dynamically allocated). Динамический диск имеет максимальный размер, но реально занимает только столько места, сколько данных записано. Фиксированный диск сразу занимает весь выделенный объём.

Как проверить в VirtualBox (гостевой список): откройте VirtualBox, правой кнопкой мыши кликните виртуальную машину → “Настройки” → вкладка “Носители” (Storage). Выберите диск и посмотрите “Детали” — там будет указано “Dynamically allocated storage” для динамического диска.

Окно Storage в VirtualBox с выделенным динамическим диском

Если у вас фиксированный диск, сначала можно его конвертировать в динамический (см. дополнительные разделы далее), но всегда делайте резервные копии перед преобразованием.

Шаг 2: Перезапишите свободное место нулями внутри гостевой ОС

Общая идея: после удаления файлов внутри гостевой ОС пространство остаётся помеченным как свободное, но данные всё ещё содержатся в VDI. Если вы перезапишете свободное пространство нулями, виртуальный диск будет содержать большие области однотипных байтов (0x00), и инструмент сжатия сможет убрать их.

Перед началом:

  • Удалите ненужные файлы внутри гостя и очистите корзину/Trash.
  • Осуществите дефрагментацию файловой системы в Windows для плотной компоновки данных перед затиранием нулями (рекомендуется для NTFS/старых FS).
  • Сделайте снимок или копию VDI на всякий случай.

Windows в гости

  1. Запустите виртуальную машину с Windows.
  2. Откройте дефрагментатор диска: в меню Пуск наберите “Defragment” и запустите “Defragment and Optimize Drives”. Выберите диск и выполните дефрагментацию.

Окно дефрагментации Windows

  1. Скачайте утилиту SDelete от Microsoft Sysinternals: распакуйте sdelete.exe в папку, например Downloads.

Окно распаковки sdelete.exe в папку Downloads

  1. Откройте Командную строку (Cmd) от имени администратора.

Запуск командной строки

  1. Перейдите в папку с sdelete.exe:
cd "C:\Users\ваш_пользователь\Downloads"
  1. Выполните команду, чтобы перезаписать нулями всё свободное пространство на диске C:
sdelete.exe c: -z

Параметр -z специально предназначен для оптимизации виртуальных дисков; инструмент спросит подтверждение лицензионного соглашения.

  1. Дождитесь завершения и корректно завершите работу гостя (Shut Down).

SDelete процесс и диалог согласия

Linux в гости

В Linux обычно нет необходимости дефрагментировать, но нужно перезаписать свободное пространство нулями. Инструмент zerofree удобен для ext2/3/4. Для других файловых систем используйте эквивалентные утилиты (fstrim работает на SSD, но для VDI нужно заполнение нулями).

  1. Установите zerofree в виртуальной машине:
sudo apt update
sudo apt install zerofree
  1. Для корневого раздела вы не можете выполнять zerofree, пока раздел смонтирован. Перезагрузитесь в режим восстановления (recovery mode) или загрузитесь с live‑CD/ISO, где корневой раздел не смонтирован как rw.

Пример для Ubuntu: при загрузке нажимайте Esc для показа меню Grub → Advanced options for Ubuntu → выберите режим (recovery mode) → выберите root для перехода в shell.

Grub меню выбора recovery mode

  1. Найдите нужный раздел командой df:
df -h

В примере это /dev/sda1.

Вывод df с указанием /dev/sda1

  1. Выполните zerofree на не смонтированном разделе (замените /dev/sda1 на ваш устройственный путь):
zerofree -v /dev/sda1
  1. После завершения выполните выключение:
halt
  1. Закройте окно виртуальной машины и выберите Power off the virtual machine в менеджере VirtualBox.

Important: если вы используете файловую систему, отличную от ext2/3/4, проверьте рекомендации для неё. Для btrfs, XFS, ZFS и других существуют свои средства очистки или специфические ограничения.

Шаг 3: Найдите VBoxManage на хосте

Дальнейшие команды выполняются на хостовой машине (той, где установлен VirtualBox).

  • На Windows VBoxManage.exe обычно находится в C:\Program Files\Oracle\VirtualBox
  • На macOS утилита доступна как /usr/local/bin/VBoxManage или встроена в пакет приложений VirtualBox
  • На Linux выполните vboxmanage или VBoxManage в терминале (обычно доступно в PATH)

На Windows откройте Командную строку и перейдите в папку VirtualBox:

cd "C:\Program Files\Oracle\VirtualBox"

Переход в папку VirtualBox через Cmd

Если вы используете macOS или Linux как хост, просто откройте Terminal и выполняйте vboxmanage напрямую, например:

VBoxManage list hdds

Шаг 4: Найдите путь к VDI-файлу, который хотите сжать

Чтобы увидеть список всех виртуальных дисков и их путей, выполните на хосте:

VBoxManage.exe list hdds

Ищите в выводе строку с “Location:” или полным путём к файлу VDI. Пример вывода показывает путь вроде:

C:\Users\chris\VirtualBox VMs\Windows 7\Windows 7.vdi

Вывод VBoxManage list hdds с путём к VDI

Запомните/скопируйте этот путь — он понадобится для команды сжатия.

Шаг 5: Выполните сжатие диска

На хосте выполните команду modifymedium с параметром –compact. Обязательно укажите правильный путь к файлу VDI в кавычках, если в нём есть пробелы:

VBoxManage.exe modifymedium disk "C:\path\to\disk.vdi" --compact

Пример:

VBoxManage.exe modifymedium disk "C:\Users\chris\VirtualBox VMs\Windows 7\Windows 7.vdi" --compact

На macOS/Linux, где команда называется VBoxManage (без .exe), аналогичная команда:

VBoxManage modifymedium disk "/Users/ваш_пользователь/VirtualBox VMs/VM/VM.vdi" --compact

После выполнения VirtualBox выполнит операцию сжатия. Сразу после этого виртуальную машину можно запускать как обычно.

О чём следует помнить

  • Сжатие освобождает место на хосте только если внутри гостя было очищено и занулено свободное пространство.
  • Экономия места равна приблизительно объёму очищённых областей, но итог зависит от фрагментации и особенностей файловых систем.

Также рассмотрите удаление снимков снапшотов

Снапшоты (Snapshots) хранят состояние виртуальной машины и могут занимать значительный объём. Чтобы освободить место:

  • В VirtualBox выберите виртуальную машину в списке и нажмите кнопку “Snapshots” на панели.
  • Просмотрите список снимков. Если какие‑то не нужны, правый клик → “Delete Snapshot”.

Удаление снимка объединяет его данные в основной диск и может занять время. Перед удалением снимков настоятельно рекомендуется сделать бэкап.

Окно Snapshots в VirtualBox с несколькими снимками


Типичные проблемы и способы их решения

  1. “Команда не найдена” при запуске VBoxManage
  • На Windows: убедитесь, что вы в каталоге установки VirtualBox или добавили этот каталог в PATH. Попробуйте явно указать полный путь.
  • На macOS/Linux: проверьте, установлена ли VirtualBox и доступна ли утилита VBoxManage (which VBoxManage).
  1. Сжатие прошло, но файл VDI не уменьшился
  • Проверьте, действительно ли внутри гостя было занулено свободное пространство. SDelete/zerofree нужно запускать правильно и завершать гость корректно.
  • Проверьте, нет ли активных снапшотов — они могут удерживать данные и препятствовать освобождению места.
  • Для некоторых файловых систем или шифрования данные не будут преобразованы в однородные нули, и сжатие не даст эффекта.
  1. Ошибка доступа при выполнении modifymedium
  • Убедитесь, что виртуальная машина выключена и виртуальные диски не подключены к запущенному процессу.
  • Проверьте права доступа к файлу VDI (на Windows: запустите CMD от администратора).
  1. Очень медленное выполнение операции
  • Сжатие может занять существенное время в зависимости от размера диска и скорости диска хоста. Запланируйте операцию на момент низкой нагрузки.

Дополнительные подходы и альтернативы

  • Конвертация фиксированного диска в динамический: можно использовать VBoxManage clonehd с параметром –variant Standard для создания динамического образа меньшего размера, затем заменить старый диск. Всегда делайте копию перед такими операциями.

Пример создания копии:

VBoxManage clonehd "C:\path\old_fixed.vdi" "C:\path\new_dynamic.vdi" --variant Standard
  • Использование внешних инструментов для очистки внутри гостя: для Linux можно временно создать файл-наполнитель, заполнить его нулями (dd if=/dev/zero of=/bigfile bs=1M) до исчерпания места, затем удалить файл. Однако этот метод хуже, чем zerofree, для некоторых FS и может привести к большим логам.

  • Для SSD в госте используйте TRIM/fstrim, но помните: TRIM в файловой системе гостя не всегда приводит к освобождению места в VDI без дополнительных операций.

Ментальные модели и эвристики

  • “Затирай — потом сжимай”: сначала добейтесь однородного, предсказуемого свободного пространства внутри гостя, затем запускайте –compact на хосте.
  • “Снапшоты блокируют” — если есть цепочка снапшотов, данные могут существовать в разных местах; удаление снапшота и сжатие — отдельные операции.
  • “Бэкап прежде всего” — любые операции модификации образов могут завершиться ошибкой; держите резервные копии.

Порядок действий для типичных ролей

Роль: Домашний пользователь

  • Сделать резервную копию VDI (скопировать файл в другое место или внешний диск).
  • Удалить ненужные файлы в госте, очистить корзину.
  • Выполнить SDelete/zerofree.
  • На хосте выполнить VBoxManage modifymedium –compact.

Роль: Системный администратор

  • Проверить наличие снапшотов и политики резервного копирования.
  • Планировать окно обслуживания (операция длительная).
  • Вставить проверку целостности после сжатия и убедиться, что VM загружается.

Роль: Девопс/инфраструктура

  • Автоматизировать проверку размера VDI и запуск сжатия по расписанию для тестовых сред.
  • Отслеживать SLI: время простоя, длительность операции, восстановление из бэкапа.

Критерии приёмки

  • Виртуальная машина загружается после сжатия.
  • Размер VDI на хосте уменьшился по сравнению с исходным.
  • На гостевой ОС доступны все требуемые данные и нет повреждений файловой системы.

Шаблон простого чеклиста перед началом

  • Сделана копия VDI или снапшот (если критично)
  • Удалены ненужные файлы в госте
  • Очистили корзину/Trash
  • Выполнен SDelete или zerofree
  • Гость корректно завершён
  • Выполнена команда VBoxManage modifymedium –compact
  • VM запущена и проверена на работоспособность

Совместимость и примечания по версиям

  • Команда VBoxManage присутствует в VirtualBox начиная с ранних версий; синтаксис modifymedium disk –compact стабилен, но путь и доступы зависят от ОС хоста.
  • На macOS иногда утилита устанавливается внутри пакета приложения VirtualBox.app; используйте полный путь при необходимости.
  • Если используется формат VDI, описанная команда работает. Для VHD/VMDK используйте соответствующие возможности конвертации/оптимизации VirtualBox.

Безопасность и приватность

  • Утилиты sdelete и zerofree затирают данные в свободном пространстве; это полезно для приватности при передаче образов.
  • Не передавайте VDI без очистки, если в нём были конфиденциальные данные. SDelete с подходящими параметрами может быть частью процедуры безопасного удаления.
  • Всегда проверяйте лицензионные условия сторонних утилит (SDelete — Microsoft Sysinternals).

Тесты и подтверждение результата

Простая методика тестирования:

  1. До операции: зафиксируйте размер VDI и свободное место в госте.
  2. Выполните удаление данных и SDelete/zerofree.
  3. Выполните compact и сравните размеры VDI.
  4. Запустите VM и выполните контрольный запуск наиболее важных сервисов.

Приёмочный тест: если до удаления было занято 30 ГБ, вы удалили 10 ГБ, и после zapping и compact файл уменьшился на ~10 ГБ, тест считается пройденным.

Часто встречающиеся вопросы

Q: Можно ли сжать диск, пока виртуальная машина работает? A: Нет. Диск должен быть отключён (VM должна быть выключена), иначе операция не выполнится.

Q: Сумеет ли процедура вернуть 100% удалённых байтов? A: Не всегда. Итог зависит от фрагментации, наличия снапшотов, особенностей файловой системы и шифрования.

Q: Подходит ли это для VMDK/VHD? A: Принцип тот же: нужно занулить свободное пространство, но команды для оптимизации/сжатия форматов могут различаться. Для VMDK/VHD рассмотрите инструменты, предоставляемые платформой создания образов или сторонние конвертеры.


Mermaid диаграмма принятия решения

flowchart TD
  A[Хотите освободить место на хосте?] --> B{Диск динамический?}
  B -- Да --> C{Есть активные снапшоты?}
  B -- Нет --> X[Рассмотреть конвертацию в динамический или клонирование]
  C -- Да --> D[Удалить ненужные снапшоты и дождаться объединения]
  C -- Нет --> E[Очистить гостевую ОС от ненужных файлов]
  E --> F[Перезаписать свободное место нулями 'SDelete/zerofree']
  F --> G[Выключить VM]
  G --> H[На хосте выполнить VBoxManage modifymedium --compact]
  H --> I[Проверить результат и загрузить VM]

Краткое резюме

  • Процесс сжатия динамического диска VirtualBox требует двух этапов: подготовка внутри гостя (затирание нулями) и собственно compact на хосте.
  • Для Windows используйте SDelete, для Linux — zerofree или загрузку в live‑режиме.
  • Проверьте отсутствие снапшотов и создайте резервную копию перед операцией.

Важное: операции с виртуальными дисками несут риск потери данных при ошибках — всегда делайте резервные копии перед масштабными изменениями.


Ключевые ссылки и ресурсы

  • Справка VirtualBox по VBoxManage
  • SDelete — Sysinternals от Microsoft
  • Документация вашей гостевой файловой системы (ext4, XFS, btrfs и т.д.)

Сводка действий для быстрого применения

  1. Удалите ненужные файлы в гостевой ОС и очистите корзину.
  2. Выполните дефрагментацию (Windows) или подготовку (Linux zerofree).
  3. Выключите виртуальную машину.
  4. На хосте выполните VBoxManage modifymedium disk “<путь к VDI>” –compact.
  5. Проверьте старт виртуальной машины и свободное место на хосте.

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство