MyTetra Share
Делитесь знаниями!
Как уменьшить размер динамического диска в 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-диска должен уменьшиться.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования