Зануление свободного места на диске виртуальной машины

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

Например, при использовании ProxMox, я получаю сжатые файлы *.vma.gz или *.vma.lzo. Для некоторых виртуальных машин, работающих под операционной системой Linux (а это веб-сервера) прирост размера сжатых файлов составляет 10-30% в неделю. Однажды наблюдалось удвоение размера за неделю!

Почему это происходит? Объяснение простое: на дисках виртуальных машин создаются какие-то временные файлы во время работы. Эти файлы успешно удаляются, но удаляется заголовок, а тело файла остаётся в неизменном виде на своём месте. Да, это место считается пустым с точки зрения виртуальной машины, и туда может быть записан какой-то новый файл при необходимости. Но с точки зрения гипервизора это место остаётся всё так же занятым, поэтому архиватору придётся попыхтеть напрасно, сжимая никому не нужную информацию.

Выход один: принудительно затереть свободное место.

Написать эту статью мне пришлось после того, как я увидел, что советуют добрые люди в интернете. Сложность просто зашкаливает! Да ещё и требуются какие-то специальные утилиты.

А на самом деле всё проще простого.

Выясняем объем свободного места на виртуалке:

df -h

Запоминаем количество мегабайт, которые над принудительно обнулить.

Выполняем чтение нулей из /dev/zero и запись их на диск в /home:

dd if=/dev/zero of=/home/zero.bak bs=1000000 count=1000

В качестве последнего параметра count указываем количество мегабайт для зануления. В моём примере обнулится гигабайт.

Как показывает практика, для виртуальных машин с диском 32 Gb вполне достаточно указывать размер области зануления с точностью до гигабайта. Если же диск меньше, точность нужно повышать, но с осторожностью. Важно оставить хоть сколько-то действительно свободного места для виртуальной машины, чтобы не произошло сбоев в работе. Даже если сервер ничем в данный момент не занимается и вяло журналирует события, 100 Мб для работы всё равно следует оставить как минимум.

При выполнении команды dd будет потрачено ощутимое количество времени (в зависимости от производительности физического жёсткого диска). Поэтому есть смысл выполнять обнуление последовательно, частями, меняя каждый раз имя файла с zero.bak на какое-то другое.

Ну и в завершении надо не забыть удалить сгенерированный файл zero.bak (или набор файлов).

Теперь можно пробовать сжать виртуальную машину и порадоваться результату.

Оставить комментарий

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

Другие материалы в этой категории:

Go to top