|
|||||||
Как уменьшить размер динамического диска в VirtualBox для ОС Linux
Время создания: 23.11.2022 16:59
Автор: xintrea
Текстовые метки: linux, virtualbox, vdi, динамический, размер, уменьшить, сжать, очистить
Раздел: Компьютер - Linux - Виртуализация и эмуляция - VirtualBox
Запись: xintrea/mytetra_syncro/master/base/1669211953z87pebvfn4/text.html на raw.github.com
|
|||||||
|
|||||||
Формат образа диска VDI в системе виртуализации VirtualBox имеет два режима хранения данных: статический размер образа и динамически расширяемый образ диска. Для образа статического размера уменьшать размер VDI-файла не представляется возможным. А для динамического образа имеется возможность уменьшить его размер в случае, если хранимые на нем данные имеют размер меньше, чем его номинальный размер. Уменьшение размера динамически расширяемого образа происходит в два этапа. * * * Этап 1 - очистка нулями незанятого пространства диска. Это действие можно сделать двумя способами. Способ первый - через файловую систему. Необходимо внутри образа создать файл, заполненный нулями, максимально большого размера. А затем его удалить. Для этого необходимо загрузить гостевую систему (предполагается, что там установлен Linux) и под пользователем root выполнить команду: dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile Данную команду можно выполнить и под обычным пользователем, но тогда не будет очищено ~5% зарезервированного размера диска, доступные только root. Способ второй - более низкоуровневый, но более качественный (речь, на самом деле, идет о выигрыше в пару процентов относительно первого способа). Надо загрузиться в виртуальной машине с какого-нибудь ISO-файла с LiveCD дистрибутивом, например SystemRescueCd. Это необходимо сделать для того, чтобы можно было подмонтировать в режиме Read-Only все разделы диска, чтобы можно было работать с таким разделом на уровне байтов через утилиту zerofree напрямую. Утилита zerofree сама анализирует структуру диска и заполняет нулями все блоки, которые помечены в файловой системе ext2/ext3/ext4 как свободные. В принципе, если в самом дистрибутиве есть установленная программа zerofree, то грузиться с LiveCD смысла нет. Достаточно загрузиться в rescue-режиме или перейти на 1-й уровень загрузки SysV. После чего рабочий диск перемонтируется в режиме Read-Only. Делается это под рутом командами (нужно прописывать правильный диск): telinit 1 mount -o remount,ro /dev/sda1 Команда для использования zerofree следующая: zerofree -v /dev/sda1 После успешного выполнения первого этапа виртуальную машину нужно выключить. * * * Этап 2 - сжатие VDI-файла путем удаления в нем пустых (нуливых) сегментов. Делается это уже на уровне хостового компьютера. Перед тем как сжимать VDI-файл, надо разобраться, зарегистрирован ли он уже в VirtualBox. Возможно два случая: диск зарегистрирован (т. е. VirtualBox знает о данной виртуальной машине) и диск не зарегистрирован - т. е. файлы виртуальной машини лежат в каком-то каталоге, но они не добавлены в VirtualBox и VirtualBox об этой машине и образе диска машины ничего не знает. Это незарегистрированное состояние возникает, например, при переносе виртуалки или при восстановлении виртуалки из резервной копии. Если виртуальная машина (и ее диск) не зарегистрированы в VirtualBox, то сжатие происходит следующей командой: $ vboxmanage modifymedium --compact "our_disk.vdi" Если же окажется, что виртуалка и ее диск зарегистрированы, то такая команда может завершится ошибкой: $ vboxmanage modifymedium --compact our_disk.vdi VBoxManage: error: Cannot register the hard disk '/opt/vmFarm/our_disk.vdi' {1bbd8dbe-d0c7-4db7-9717-85313fe7e721} because a hard disk '/opt/vmFarm/our_disk.vdi' with UUID {1bbd8dbe-d0c7-4db7-9717-85313fe7e721} already exists VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component VirtualBoxWrap, interface IVirtualBox, callee nsISupports VBoxManage: error: Context: "OpenMedium(Bstr(pszFilenameOrUuid).raw(), enmDevType, enmAccessMode, fForceNewUuidOnOpen, pMedium.asOutParam())" at line 191 of file VBoxManageDisk.cpp Такая ошибка может возникать в случае, если VDI-файл лежит в каталоге, который является линком (link) на другой каталог. Внутри VirtualBox файл видится по одному пути, а в момент выполнения консольной sh-команды полный путь к файлу разворачивается по другому пути. И тот и тот путь правильный, но VirtualBox считает их разными, т. е. не видит их эквивалентность, от чего и происходит ошибка. В любом случе становится понятно, что диск виртуалки зарегистрирован. И для такого диска лучше применить ту же самую команду, но с использованием UUID. Если UUID диска неизвестен, его можно посмотреть командой: $ vboxmanage list hdds И далее дается команда на сжатие диска с указанием его UUID: $ vboxmanage modifymedium --compact 1bbd8dbe-d0c7-4db7-9717-85313fe7e721 Все, после того как данная команда отработает, размер динамического VDI-диска должен уменьшиться. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|