Из-за чего это может быть и возможно ли это каким-либо образом исправить ?
Это происходит из-за особенностей реализации виртуальных дисков в системах виртуализации.
Для Linux диск это упорядоченный набор блоков одинакового размера. Linux может считать данные или записать данные в любой блок. Поэтому еще диски называют блочные устройства с произвольным доступом. Для того, что бы записать данные в какой-то блок диска, Linux отправляет контролеру диска команду, в которой указывает номер блока и данные для записи. Контролер диска сохраняет эти данные в указанный блок и сообщает Linux, что запись закончилась.
Когда Linux работает внутри вириальной машины, то вместо контролера диска команды для диска обрабатывает система виртуализации. И для того, что бы сохранить данные полученные от Linux она их сохраняет в файл виртуального диска. Таким образом файл виртуального диска начинает увеличиваться.
Когда внутри гостевой ОС Linux удаляют файл, то Linux контролеру диска не посылает сигнал стереть эти блоки, а лишь у себя в специальном списке отмечает, что теперь эти блоки свободные, хотя в них продолжается храниться информация от удалённого файла. Система виртуализации не знает, что эти блоки можно удалить из файла виртуального диска и поэтому файл вириального диска не уменьшается, если даже удалить все файлы с диска внутри виртуальной машины.
Бывают исключения и некоторые системы виртуализации поддерживают команду TRIM. Например, это реализовано в VirtualBox, но там есть куча ограничений и гостевая операционная система должна отправлять TRIM, что бы уменьшился размер файла с вириальным диском.
Если виртуальные машины используете для тестов, то создавайте новый файл для виртуального диска, а распухший файл удаляйте.