Я запускаю сервер виртуализации на основе KVM (а именно, Proxmox), где некоторые машины на базе Debian работают в виртуальных машинах KVM. Proxmox может создавать резервные копии виртуальных машин, а также сжимать образы дисков виртуальных машин.
Как мы понимаем, размеры резервных копий со временем увеличиваются, поскольку больше данных, хранящихся на каждом диске ВМ, и большее количество «чистых» блоков диска ВМ становятся «грязными» (то есть содержат оставшиеся старые файлы). Итак, даже если я удалю все файлы на таком виртуальном диске с помощью rm -rf
Фактически, резервная копия будет того же размера, поскольку при этом не будут очищены все блоки диска виртуальной машины.
Я могу «очистить» диск виртуальной машины, выполнив что-то вроде dd if=/dev/zero of=/BIG.txt
а потом rm -f /BIG.txt
- таким образом я создаю большой файл, полный нулей, который будет использовать все дисковое пространство, и после его удаления его бывшие блоки будут содержать нули. Обратной стороной является то, что на мгновение диск заполняется, что влияет на каждую программу, которая хочет что-либо записать.
Но, может быть, есть другой способ очистить неиспользуемые блоки диска нулями, чтобы резервное копирование сжимало такой диск с большей скоростью? Некоторые программы для Windows предлагают опции для «очистки неиспользуемого дискового пространства» (например, CCleaner), но мне это нужно для Linux.
Последние версии libvirt / kvm поддерживают discard
опция vdisc (только для типа SCSI vdisk). Если этот параметр включен, вы можете выдать fstrim /
в гостевой файловой системе и неиспользуемые блоки будут немедленно отброшены образом хоста vm, сжимая / уменьшая его с помощью перфорации.
Видеть Вот (раздел драйверов, ищите 'discard') и Вот Чтобы получить больше информации.
Если вы не можете использовать метод обрезки / сброса, вы можете продолжить использовать текущий метод обнуления (dd
из /dev/zero
) с изюминкой: проблема два dd
проходов, каждый из которых имеет лишь немногим более половины свободного места на диске, разделенный fsync; rm BIG.txt
команда. Этого должно хватить, чтобы восстановить почти все свободное пространство, не заполняя его сразу.