В VMware виртуальные диски (vmdk) бывают двух типов это pre-allocated и growable. Тип диска growable занимает объем физического диска по мере заполнения виртуального диска, т.е. виртуальный диск на 120 Гб, занято 10 Гб, размер файла *.vmdk соответственно 10 Гб. В случае освобождения пространства на виртуальном диске, физический размер диска *.vmdk не уменьшается. Для уменьшения диска необходимо выполнить операцию Defragment (дефрагментация) затем и Compact (сжатие). После этого размер диска *.vmdk будет соответствовать занимаемому пространству в виртуальном диске, но это так работает, если установлена гостевая-ОС Windows. В публикации рассматривается уменьшение размера виртуальной машины VMware в случае гостевой-ОС Linux и освобождение пространства на диске.
Постановка задачи
Уменьшить физический размер виртуального диска (vmdk) типа growable путем выполнения процедур соответствия фактическому занятому пространству в виртуальном диске. Для примера используется виртуальная машина VMWare VM-SoftEther-VPN-router работающая под ОС Ubuntu 22.04.2 LTS (Jammy Jellyfish), полученная в ходе создания VPN-маршрутизатора.
- Виртуальная машина соответствует версии VMware Workstation 17 Pro.
Заполнение свободного пространства виртуального диска нулями
При удалении информации с диска не происходит ее физическое удаление. На диске сектора данных, в которых размещался файл помечаются как свободные. Алгоритм сжатия диска VMware основан на проверке пространства нулями, таким образом, после удаления файла в виртуальной машине физически занимаемое пространство на диске не изменится. Для решения этой задачи выполняются две операции, это дефрагментация файловой системы в Ubuntu и заполнение оставшегося пространства на диске нулями. До выполнения процедуры сжатия физический размер диска *.vmdk ВМ VM-SoftEther-VPN-router равен 9,67 Гб при фактически занятом пространстве 6,8 Гб. Таким образом можно освободить 2,87 Гб.
Сжатие диска ВМ можно выполнить путем запуска одной команды при условии установленных драйверов и утилит Open-VM Tools (OVT). Для установки OVT необходимо выполнить команды:
$ sudo apt-get update $ sudo apt-get install -y open-vm-tools $ sudo reboot now
Затем выполнить команду сжатия диска:
$ sudo vmware-toolbox-cmd disk shrink /
Выполнение команды заблокирует взаимодействие с ВМ из-за показа диалогового модального окна.
Этот вариант выполняется быстрее, чем представленная инструкция ниже. Но у команды сжатия есть два нюанса:
- Запуск возможен только при наличие утилит Open-VM Tools;
- Для сжатия диска необходимо наличие свободного места в Host системе где размещается диск ВМ. Если для сжатия диска не будет хватать места, то VMWare сообщит об этом только фактически когда возникнет проблема. При использование инструкции ниже, при выполнение действия Defragment (дефрагментация), VMWare сразу сообщит о нехватке дискового пространства.
Шаг 1 — Установка утилиты дефрагментации
Для дефрагментации диска используется утилита e4defrag входящая в пакет e2fsprogs , установим данный пакет:
$ sudo apt update $ sudo apt install -y e2fsprogs
Шаг 2 — Удаление временных и второстепенных файлов
Дальнейшая работа с ВМ VM-SoftEther-VPN-router не предусматривается, поэтому справочные файлы, кэш пакетов, и т.д. можно удалить. Для этого необходимо выполнить команду:
$ sudo apt-get clean autoclean -y \ && sudo apt-get autoremove -y \ && sudo rm -rf /var/lib/{apt,cache,log}/ \ && sudo rm -rf /var/log/* \ && sudo rm -rf /tmp/* /var/tmp/* \ && sudo rm -rf /usr/share/doc/ \ && sudo rm -rf /usr/share/man/ \ && sudo rm /var/lib/apt/lists/* -vf
Шаг 3 — Дефрагментация диска
Для дефрагментации диска воспользуемся утилитой e4defrag. Определим блочные устройства хранения данных командами:
$ sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL $ df -h
Результат выполнения:
root@ubuntu:~# sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL NAME FSTYPE SIZE MOUNTPOINT LABEL sda 120G ├─sda1 1M ├─sda2 ext4 2G /boot └─sda3 LVM2_member 118G └─ubuntu--vg-ubuntu--lv ext4 118G / sr0 1024M root@ubuntu:~# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 193M 3.4M 190M 2% /run /dev/mapper/ubuntu--vg-ubuntu--lv 116G 6.3G 104G 6% / tmpfs 965M 0 965M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sda2 2.0G 252M 1.6G 14% /boot overlay 116G 6.3G 104G 6% /var/lib/docker/overlay2/f932c60a4a27972023dbf3b6f0b23afcb802db8f7a989adc926f271e7996c981/merged tmpfs 193M 4.0K 193M 1% /run/user/0
Из полученного результата определим список устройств:
- /dev/sda1
- /dev/sda2
- /dev/sda3
- /dev/mapper/ubuntu—vg-ubuntu—lv
Где основные устройства представлены с префиксом /dev/sda*. Для дефрагментации доступны только те устройства, которые имеют точку монтирования, заголовок MOUNTPOINT и Mounted on. Основной диск в 118 Гб это устройство /dev/sda3 , для обращения к нему будем использовать путь /dev/mapper/ubuntu—vg-ubuntu—lv . Таким образом, получим итоговые блочные устройства для дефрагментации:
- /dev/sda2
- /dev/mapper/ubuntu—vg-ubuntu—lv
Выполним команду дефрагментации для каждого устройства:
$ sudo e4defrag /dev/sda2 $ sudo e4defrag /dev/mapper/ubuntu--vg-ubuntu--lv
Необходимо обратить внимание на то, что некоторые используемые файлы не будут дефрагментированы.
Шаг 4 — Заполнение диска нулями
Для заполнения диска нулями выполним команду:
$ dd if=/dev/zero of=wipefile bs=1024x1024 status=progress; rm wipefile
Если после выполнения команды на диске остался файл с названием wipefile, то удалите его командой rm wipefile .
Теперь необходимо выключить ВМ командой:
$ sudo shutdown now
Шаг 5 — Выполнение операции Defragment (дефрагментация) и Compact над диском
После выключения ВМ необходимо открыть настройки ВМ, меню VM > Settings…, среди устройств выбрать виртуальный диск Hard Disk и выполнить над ним последовательно операции Defragment (дефрагментация) и Compact (сжатие).
Свойства виртуального диска виртуальной машины VMWare
После сжатия размер диска *.vmdk уменьшился до 5,43 Гб, что на 4.24 Гб меньше предыдущего размера.