Как уменьшить размер виртуального диска Virtualbox

Обновлено: 04.07.2024

В этой статье объясняются шаги, необходимые для сжатия образа диска VirtualBox, где гостевой операционной системой является Windows.

VirtualBox — фаворит Net Reliant, когда дело доходит до виртуализации. Это профессиональное решение корпоративного уровня, работающее на хостах Windows, Linux, Macintosh и Solaris.

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

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

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

Чтобы уменьшить избыточное использование диска, VirtualBox предоставляет механизм сжатия динамически размещаемых гостевых образов. Ниже приведены шаги, которые необходимо выполнить, если вашей гостевой операционной системой является Windows:

  1. Запустите виртуальную машину Windows и удалите все ненужные файлы.
  2. Дефрагментация диска виртуальной машины Windows;
  3. Очистите свободное место на диске виртуальной машины Windows;
  4. Выключите виртуальную машину Windows;
  5. Используйте утилиту VirtualBox VBoxManage для сжатия гостевого образа Windows.

Шаг 1. Запустите виртуальную машину Windows и удалите ненужные файлы

  • Очистить корзину;
  • Удалите файлы из временных папок.
  • Очистите все кеши веб-браузера;
  • Очистите все кеши приложений.

Шаг 2. Дефрагментация диска

  • Найдите свой жесткий диск с помощью проводника Windows на виртуальной машине;
  • Щелкните правой кнопкой мыши диск и выберите параметр "Свойства";
  • Затем выберите вкладку "Инструменты" и нажмите "Дефрагментировать сейчас" . кнопка.

Следуйте инструкциям по дефрагментации виртуального диска Windows.

Шаг 3. Очистите все свободное место на диске

После дефрагментации диска на виртуальном диске Windows останется неиспользуемое пространство, содержащее мусорные биты и байты. Эти мусорные биты и байты происходят из содержимого файлов, которые раньше занимали это место, но которых больше нет.

Самый эффективный способ очистить свободное место на диске Windows — перезаписать неиспользуемое пространство битовым потоком нулей или заполнить пустое пространство нулями.

SDelete (или безопасное удаление) — это утилита командной строки. Поэтому, чтобы заполнить виртуальный диск Windows нулями, введите в командной строке DOS следующее:

где -z — параметр SDelete, обнуляющий свободное пространство.

Вы также можете использовать:

где -c — параметр SDelete для очистки свободного места.

После запуска SDelete вы увидите сообщение, подобное следующему:

Шаг 4. Выключите виртуальную машину Windows

После завершения работы SDelete и очистки или обнуления свободного места на 100 % выключите виртуальную машину Windows.

Шаг 5. Сжатие гостевого образа Windows

Чтобы сжать гостевой образ Windows, используйте утилиту VirtualBox VBoxManage. Предполагая хост Windows, используйте следующую команду в командной строке DOS:

Убедитесь, что вы заменили элементы в квадратных скобках своими параметрами.

Если ваш хост Windows жалуется, что VBoxManage не может быть найден или является недопустимой командой, вам может потребоваться явно указать путь к исполняемым файлам VirtualBox. Таким образом, полный пример сжатия гостевого образа Windows в командной строке DOS выглядит следующим образом:

После запуска утилиты VirtualBox VBoxManage вы увидите индикаторы выполнения с шагом 10 %, начиная с 0 % и заканчивая 100 %. И когда процесс завершится, у вас должен быть файл образа диска меньшего размера.

Я хочу превратить физическую машину под управлением MS Windows 7 в виртуальную машину VirtualBox. Это просто, я делал это раньше, но на этот раз мне нужно было, чтобы виртуальный размер/емкость диска был фиксированным и меньшим размером.

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

Помимо этого особого случая, есть и другие причины, по которым диски должны быть меньше и фиксированнее. Это мой опыт. Если вы запустите, например, сервер сборки Jenkins на динамически расширяющемся диске, вы увидите, что диск быстро расширяется до максимального размера, в то время как в гостевой ОС дисковое пространство используется стабильно и имеется много свободного места.

С помощью Disk2vhd я создал файл VHDX. Этот файл я преобразовал в формат vdi.

Якобы с помощью vdi вы можете уменьшить виртуальный размер/емкость с помощью команд, аналогичных

Я обнаружил, что это не работает. Даже если вы попробуете варианты, вы будете постоянно получать сообщения об ошибках, например:

Состояние выполнения: VBOX_E_NOT_SUPPORTED VBoxManage: ошибка: операция изменения размера жесткого диска для этого формата еще не реализована!

Ниже показана схема моего диска vdi. Я добавил это на виртуальную машину Ubuntu, чтобы посмотреть на нее с помощью Gparted и CloneZilla. Емкость около 300 Гб. Нераспределено 145 ГБ. Используется около 153 ГБ.

Я хочу уменьшить емкость примерно до 160 ГБ. Этого должно быть достаточно для установки /dev/sdb1 и /dev/sdb2 .

Кстати, я попробовал CloneZilla, но мне также не нравится уменьшать емкость до меньшего диска. Я пробовал разные настройки в CloneZilla, но безуспешно.

Как уменьшить виртуальный размер/емкость?

введите здесь описание изображения

6 ответов 6

Освободить место в конце диска в гостевой ОС, где пространство >= размер(исходный-диск) - размер(новый-диск). Обычно путем сжатия последнего раздела.

Отключить виртуальную машину.

Создайте новый диск Virtual Box нужного размера.

Переместить содержимое со старого диска на новый диск:

Включить виртуальную машину.

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


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

Использование vboxmanage clonehd "source-disk.vdi" "new-disk.vdi" --existing уничтожает таблицу разделов на целевом образе.

К сведению, vboxmanage clonehd теперь называется vboxmanage clonemedium disk (clonehd по-прежнему принимается для обеспечения обратной совместимости).

В конце концов мне удалось решить эту головоломку неожиданно простым способом с помощью предустановленной утилиты командной строки dd см. Клонирование диска. Как показано ниже, теперь у меня есть диск на 160 ГБ в моей гостевой ОС, хранящийся в фиксированном файле vdi VirtualBox на 160 ГБ.

введите здесь описание изображения

Я решил это, выполнив следующие действия:

  1. Измените размер диска с помощью Управление дисками в MS Windows до размера, равного или лучше немного меньше размера VDI.
  2. Добавьте исходный vdi MSWIN7.vdi с MS Windows 7 на виртуальную машину Ubuntu в качестве второго диска.
  3. Создайте новый фиксированный виртуальный диск объемом 160 ГБ и добавьте его в виртуальную машину Ubuntu. Теперь есть три диска: /dev/sda1 с запущенной виртуальной машиной Ubuntu, /dev/sdb2 с исходным MSWIN7.vdi и /dev/sdc1 с новым vdi.
  4. Создайте правильный раздел в /dev/sdc. CloneZilla сделал это за меня. Он не копировал данные, но создавал нужные мне разделы. Конечно, вы можете сделать это вручную.
  5. Скопируйте sdb в sdc с помощью команды dd, аналогичной sudo dd if=/dev/sdb of=/dev/sdc . Команда заканчивается сообщением об ошибке без пробела, что и ожидалось. Это я проигнорировал, потому что это просто нераспределенное пространство, которое не удалось скопировать.

Я думаю, что эту команду можно запустить для каждого раздела. Может быть, это лучше и не будет показывать сообщение об ошибке. sudo dd if=/dev/sdb1 of=/dev/sdc1 и sudo dd if=/dev/sdb2 of=/dev/sdc2 .

В моем случае у меня была виртуальная машина Windows с 50 ГБ vdi, которую можно было уменьшить до 20 ГБ.

Я попробовал решение Andre Figueiredo, но у меня возникла проблема с клонированным vdi .

Когда я применяю решение Andre Figueiredo и подключаю сжатый vdi к виртуальной машине, при загрузке Virtualbox останавливается с ошибкой ввода-вывода.

Возможно, это связано с моей файловой системой btrfs (я слышал, что btrfs вызывает проблемы с Vritualbox vdi ).

Мое решение:

Я попробовал другое решение, чтобы сжать диск виртуальной машины ( vdi ) с именем OVdi (OVdi имеет размер диска 50 ГБ, один раздел ntfs с 40 ГБ свободного места). пробел).

Давайте выполним следующие шаги (это мой случай, вы можете адаптировать/придумать разные имена vdi):

остановить виртуальную машину (выключить питание)

создайте новый диск ( vdi ) с именем DVdi желаемого размера (в моем случае 20 ГБ..)

подключить DVdi к виртуальной машине

загрузить ВМ и установить утилиту EaseUS Backup Free

Запустите EasyUS и используйте функцию Clone EasyUS (она клонирует MBR OVdi и раздел ntfs OVdi, сжимая его до нового диска < em>DVdi)

Выключите виртуальную машину

Отключить OVdi от ВМ

Проверьте, является ли DVdi первым загрузочным устройством для виртуальной машины

Не забудьте удалить том OVdi.

Следуя этим шагам, я успешно уменьшил размер диска ВМ с 50 ГБ до 20 ГБ


Я считаю, что это решение чрезвычайно опасно! Он основан на том, что все файлы находятся в первых 153 ГБ исходного раздела размером 300 ГБ. Команда dd не копирует файлы.Он просто последовательно копирует ВСЕ блоки. Таким образом, если вам не повезло иметь важные файлы ПОСЛЕ ограничения в 160 ГБ, dd не будет знать, нужно ли их копировать.

Типичное решение, которое я встречал во многих сообщениях, состоит в том, чтобы включить виртуальную машину Windows и использовать некоторую комбинацию инструментов дефрагментации и инструментов администрирования для объединения всех файлов на переднюю часть диска. не перемещать неперемещаемые системные файлы Windows (мне пришлось отключить восстановление системы, чтобы удалить неперемещаемый фрагмент диска размером 7 ГБ), которые находятся где-то в середине пространства, которое вы пытаетесь консолидировать.

После того, как вы объединили файлы на передний план диска (MyDefrag — это бесплатная программа, которая показывает, где на диске находятся ваши файлы), вы должны уменьшить размер раздела Windows. Я использовал инструмент diskpart с параметром сжатия.

На этом этапе вы можете использовать dd, чтобы скопировать теперь меньший раздел в новый vdi.

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

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

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

9 ответов 9

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

Запустить дефрагментацию в гостевой системе (только для Windows)

Обнуление свободного места:

В гостевой системе Linux выполните следующее:

В качестве гостя Windows загрузите SDelete с сайта Sysinternals и запустите следующее:

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

Выключите гостевую ВМ

Теперь запустите команду ModifyMedium VBoxManage с параметром --compact:

На хосте Linux выполните следующее:

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

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

Это уменьшает размер виртуального рабочего стола.


Для следующего человека моя команда выглядела так: "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"modifyhd "C:\Users\daniel\VirtualBox VMs\.\thedisk.vdi" -компактный

Согласно справочной странице утилиты zerofree для Linux (manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html), для этой работы zerofree должен быть лучше, чем dd. dd не рекомендуется, потому что «он медленный», «он заставляет образ диска (временно) увеличиваться до максимального размера», «он (временно) использует все свободное пространство на диске, поэтому другие одновременные действия записи могут завершиться ошибкой». Zerofree доступен в Ubuntu Linux через apt, или вы можете скомпилировать его самостоятельно.

Забавно, что на справочной странице zerofree указано, что с dd другие одновременные операции записи завершатся ошибкой, но для zerofree требуется, чтобы файловая система была смонтирована только для чтения! *да*

Совет. Поместите две команды в одну строку следующим образом: dd . ; rm /bigfile , это сведет к минимуму время с полным диском, если вы не ждете завершения dd.

@Dakatine При использовании VirtualBox 4.3.10 файл образа диска не увеличился до максимального размера. VirtualBox достаточно умен, чтобы не записывать все нулевые блоки на физический диск.

Я работаю на узле Windows 7 с гостевой ОС Windows. Вот пакетный файл, который я написал для сжатия всех VDI в дереве папок

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


Вы могли бы подумать, что на таких сайтах должна быть какая-то подсветка синтаксиса для DOS, но нет. В Notepad++ это выглядит намного красивее

@CAD_bloke, для которого потребуется механизм синтаксического анализа, а если учесть количество различных языков, размещенных в SE, вы видите ОГРОМНЫЙ проект. Просто подумайте, сколько существует версий и диалектов DOS, например, и это еще до того, как вы доберетесь до Linux и т. д.

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

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

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

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

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

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

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

Гостевая конфигурация

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

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

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

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

На этом этапе размер файловых систем внутри ВМ и размер образов ВМ должны быть довольно близки по значению.

  • Гость 1: Debian 8.7, ядро: linux 4.8 grsec из резервных копий, файловая система: ext4
  • Гость 2: Debian 9 RC2, ядро: linux 4.9, файловая система: ext4
  • Host1: VBox 5.1.14, Win7, формат изображения: VDI
  • Host2: VBox 5.1.14, Win8.1, формат изображения: VDI


Для MacOS Guest сделайте следующее:

Обнуление свободного места в гостевой системе:

(замените /Volumes/Macintosh HD именем вашего диска)

Выключите гостевую ВМ

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


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

Команды в Debian:

Команды в Windows:


ВАЖНОЕ ПРИМЕЧАНИЕ ДЛЯ УСТАРЕВШИХ (~1997-2007) ОПЕРАЦИОННЫХ СИСТЕМ

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

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

вместо ожидаемого:

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

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

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

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


Микаэль Франссон

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

  • Фиксированный размер сразу же займет указанный вами размер. Он будет работать немного лучше, но его создание займет больше времени. Если вы укажете 60 ГБ, оно займет это место на вашем хосте независимо от того, заполните ли вы чем-нибудь виртуальную машину или нет.
  • Файл динамического диска создается мгновенно и увеличивается по мере необходимости. Однако он будет только расти, а не уменьшаться, отсюда и этот пост в блоге. Поскольку размер файла на диске увеличивается по мере необходимости, он также будет расходовать некоторые ресурсы, поэтому вы можете заметить влияние на производительность. Большинство пользователей ноутбуков и настольных компьютеров будут использовать этот тип диска, поскольку пространство всегда ограничено. В большинстве ноутбуков теперь также используются SSD-накопители, поэтому снижение производительности больше не является проблемой.

VirtualBox имеет несколько очень мощных инструментов командной строки для работы с различными аспектами управления виртуальными машинами. Сокращение и восстановление дискового пространства для файлов динамического диска — одна из тех задач, которые вы выполняете из командной строки. Вы можете использовать Vboxmanage, который поставляется с Virtualbox, или использовать сторонний инструмент. Оба метода описаны ниже.

Случаи использования

Многие из нас используют Virtualbox и несколько виртуальных машин на своих ноутбуках. У нас нет неограниченного хранилища. Сжатие файлов виртуального диска может сэкономить гигабайты

Теперь можно экспортировать/загружать виртуальные машины Virtualbox в OCI.Сжатие файла диска виртуальной машины сэкономит пропускную способность и время при загрузке в OCI.

Подготовка

Прежде чем сжимать файл образа диска ВМ, необходимо обнулить все неиспользуемые блоки диска. Итак, для каждой файловой системы (это для файловых систем Linux) в гостевой системе вам нужно сделать что-то вроде этого (как root):

dd if=/dev/zero of=zero.tmp bs=10M; rm -f ноль.tmp

Есть несколько альтернативных методов и инструментов, но все они в основном делают одно и то же. Запишите нули в неиспользуемые блоки.

Для Windows есть инструмент под названием sdelete (безопасное удаление?), который сделает это.

Путь VirtualBox

Остановите виртуальную машину и выполните указанную ниже команду в командной строке для каждого файла на диске, который у вас есть.

VBoxManagemodifyhd -compactthediskfile.vdi

Это также работает только с файлами VDI. Если ваша виртуальная машина имеет другой формат образа диска, например vmdk, вы можете использовать функцию клонирования Vboxmanage.

VBoxManage clonehd myoldfile.vmdk mynewfile.vdi --format VDI

Сторонний способ

Существует бесплатный инструмент CloneVDI, который можно загрузить и использовать. Он существует уже более 10 лет. Это инструмент Windows, но, как вы можете видеть на скриншоте ниже, я использую его с Wine (WineBottler — хорошая упаковка Wine для macOS, я использую последние сборки разработки) на своем Mac. Вы также можете установить Wine через Homebrew.

Wine и CloneVDI не работают на macOS Catalina. Вероятно, из-за того, что CloneVDI является 32-разрядным приложением.

Этот инструмент читает виртуальные диски практически любого формата (читает файлы VDI, VHD, VHDX, VMDK, Parallels HDD, RAW и физические диски, записывает VDI). Я просто выделил две функции на изображении выше, но здесь есть еще что почитать. CloneVDI знает о файловой системе виртуальной машины, поэтому в процессе клонирования он будет записывать только используемые блоки данных в новый файл VDI (конечно, вам нужно установить флажок, показанный выше).

Однако вам все равно нужно обнулить неиспользуемые блоки, см. выше.

Процесс записи нового файла образа диска очень быстрый и стабильный. Я использовал CloneVDI в течение многих лет, и он никогда не выдавал поврежденных выходных данных. Он также никогда не затрагивает исходный файл на диске, поэтому я считаю этот метод безопасным. Это мой предпочтительный метод.

Использование CloneVDI

При клонировании файла с указанными выше настройками вы получите новый файл образа диска меньшего размера в той же папке, что и оригинал. Поскольку он имеет тот же UUID, вы можете просто переместить или переименовать исходный файл и переименовать клон, чтобы он имел имя исходного файла. Virtualbox не заметит, что вы заменили файл образа диска. Не удаляйте исходный файл на диске, пока не убедитесь, что клон работает. Я никогда не видел, чтобы клон не работал, но вы не должны быть осторожны с деструктивными командами.

Использование WineBottler для сборки/запуска CloneVDI на macOS

Эти настройки я использовал с WinBottler для создания автономного приложения. Это приложение будет огромным (+1 ГБ), так как оно содержит все библиотеки Wine, но вам не нужно беспокоиться о зависимостях.

Читайте также: