Atnimak`s journey     О блоге     Архив     Теги     Резюме

From a little boy to a java developer

Сжать динамический диск

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


Очищаем свободное пространство диска

Для начала сделайте бекап виртуальной машины, например, экспортируйте ее. Удалите все все снимки состояния системы, если этого не сделать можно получить ошибку. Затем удалите все лишнее на вашем виртуальном диске. Теперь скачиваем на виртуальную машину программу Sdelete, она небольшая и не требует установки. Sdelete окончательно очистит свободное место, записав нулевые биты во все свободное пространство диска. Итак:

cd C:\
sdelete.exe -s -z C:

таким образом мы очистили раздел C на диске. Если на диске есть другие разделы, очищаем их аналогичным образом.

Сжимаем диск

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

Ваш диск VHD

Запускаем утилиту diskpart

diskpart

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

select vdisk file="c:\Data\DAT22GB.vhd"

Теперь нам нужно подключить диск в режиме Read-only:

attach vdisk readonly

Сжимаем:

compact vdisk

Эта процедура может занять значительное время, в зависимости от размера виртуального диска.

Если сжатие прошло успешно, появится надпись:

DiskPart successfully compacted the virtual disk file

Осталось отмонтировать диск VHD:

detach vdisk

Ваш диск VDI

Переходим в директорию установки VitrualBox

cd C:\Program Files\Oracle\VirtualBox

Указываем путь к файлу нашего диска и сжимаем его с помощью команды modifyhd и ключа compact.

VboxManage.exe modifyhd "D:\Oracle VM VirtualBox\Windows 10 x86 Ent 1607.vdi" --compact

Эта процедура может занять значительное время, в зависимости от размера виртуального диска.

Ваш диск не VHD или VDI

Например, если вы решили сжать диск после импорта виртуальной машины по инструкции из этой статьи, ваши диски после импорта будут иметь расширение VMDK. Чтобы сжать такой диск на нужно сначала сконвертировать его в формат VDI, затем сжать. После этого можно либо сконвертировать его обратно в VMDK, либо открепить диск в формате VMDK от виртуальной машины и прикрепить вместо него диск в формате VDI.

Сначала нам нужно узнать UUID диска. Он понадобиться, если мы решим конвертировать диски обратно в VMDK - нам нужно будет присвоить новым дискам старый UUID, чтобы VirtualBox не заметила подмены.

Сначала переходим в папку с VirtualBox и запускаем коммандную строку там, если мы под Windows, а потом указываем полные пути к дискам. Или, если мы под Linux, запускаем терминал прямо в папке с дисками, чтобы не париться с полными путями дисков.

cd C:\Program Files\Oracle\VirtualBox

Итак, запрашиваем информацию о диске

vboxmanage showhdinfo diskname-disk001.vmdk

Вывод будет примерно такой:

vboxmanage showhdinfo diskname-disk001.vmdk
UUID:           53cb1079-e36f-4141-a58d-9d9b017a064c
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /media/virtualdisks/diskname-disk001.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity:       102400 MBytes
Size on disk:   63869 MBytes
Encryption:     disabled
In use by VMs:  maximka_server (UUID: c8fb6c1c-6213-4ecb-9f59-4638efcc0223)

В моем примере путь к диску в Linux системе выглядит не совсем так, как выглядел бы в Windows, но это не проблема. Запоминаем UUID.

Теперь клонируем диск в формат VDI.

VBoxManage clonehd diskname-disk001.vmdk diskname-disk001.vdi --format vdi

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

Как только операция выполнена, можно удалить оригинальный VMDK диск и сжимать новый VDI диск.

Удаляем исходный диск.

rm diskname-disk001.vmdk

Сжимаем клонированный диск.

VBoxManage modifyhd diskname-disk001.vdi --compact

Эта операция также может занять некоторое время, в зависимости от размеров диска.

Дальнейшие наши действия зависят от того, хотим ли мы “вернуть” нашему диску формат VMDK или оставить его в VDI. Если хотим оставить VDI, то заходим в настройки виртуальной машины, в раздел “Носители”, открепляем VMDK диск и на его место прикрепляем VDI диск. Все! Можно запускать виртуальную машину.

Если ходим вернуть диск в формат VMDK, то клонируем его обратно.

VBoxManage clonehd diskname-disk001.vdi diskname-disk001.vmdk --format vmdk

Удаляем, ненужный больше, VDI диск.

rm diskname-disk001.vdi

Если мы сейчас попробуем запустить виртуальную машину, она выдаст нам ошибку, что UUID нашего VMDK диска не совпадает с тем диском, который она “помнит” и “ожидает” найти на месте нашего нового диска. Чтобы этого не произошло, мы присваиваем сжатому и свежеклонированному VMDK диску UUID старого VMDK диска.

vboxmanage internalcommands sethduuid ./maximka_server-disk001.vmdk 53cb1079-e36f-4141-a58d-9d9b017a064c

Все! Можно запускать VirtualBox, теперь она не заметить “подмены”!

Пояснения

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