Виртуальная коробка vdi занимает гораздо больше места, чем фактический размер
У меня есть экземпляр Ubuntu динамического диска, который df сообщает, использует 30gig (это о том, что df
отчеты тоже) и все же файл vdi 130gig на диске:
Я не помню, чтобы он занимал так много места раньше - (но не на 100%) - почти как если бы гость использовал больше дискового пространства, а затем однажды хост вдруг изменил его размер до гораздо большего размера, чем требуется.
На самом деле я не хочу уменьшать размер динамически изменяемого диска (что невозможно), но мне интересно, почему фактический VDI должен предполагать 5-кратное пространство основного гостя - это не кажется очень "динамичным"
2 ответа
Ответ на это на самом деле довольно прост.
Каждый раз, когда ваш гость записывает на диск в место, в которое ранее не было записано, размер VDI увеличивается в соответствии с "новыми" данными. VirtualBox не знает, что хранится на диске. Таким образом, не имеет значения, если это неиспользуемое пространство. Единственное, что имеет значение, это то, что пространство использовалось в какой-то момент.
Теперь, если гость записал 20 ГБ непрерывных данных (один байт после следующего), тогда для файла VDI потребуется 20 ГБ физического места на жестком диске.
Но на самом деле это не так. Вместо этого гостевая виртуальная машина будет постоянно читать / записывать / перемещать данные. Даже если те же 20 ГБ данных будут перемещены в новые области раздела, VDI будет расти для размещения "новых" данных.
Файл VDI никогда не будет сжиматься и в конечном итоге всегда будет иметь максимальный размер при заданном вами максимальном размере.
Образы тонких (или так называемых разреженных или динамических в терминологии virtualbox) файлов со временем будут увеличиваться, но никогда не уменьшатся. Вот пример: вы создаете тонкий VDI-диск объемом 10 ГБ, монтируете его, а затем начинаете создавать / удалять серии относительно небольших файлов в цикле. Даже если размер каждого из этих небольших файлов не будет превышать 100 МБ, ваш VDI-диск быстро увеличится до максимального размера.
Начнем с диска 10G, который был только что создан и смонтирован. Вот так это выглядит в ВМ
[root@localhost ~]# df -h | egrep "^Filesystem|test"
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/test-lvol 9.9G 23M 9.4G 1% /mnt
И вот так это выглядит вне ВМ (на хосте)
ls -lh|grep New
-rw------- 1 dmitryzayats staff 94M Oct 28 23:33 NewVirtualDisk1.vdi
Так что на хосте уходит всего чуть меньше 100M.
Теперь мы запустим этот скрипт в одной последовательности. Создание и удаление 1000 относительно небольших файлов размером 100 млн. В любой момент времени наша виртуальная машина покажет, что мы используем только 200 МБ в файловой системе.
for i in {1..1000}; do echo "Run=$i"; dd if=/dev/urandom of=/mnt/testfile${i} bs=1M count=100; df -h; rm -f /mnt/testfile$(($i-1)); done
Run=319
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.944908 s, 111 MB/s
Filesystem Size Used Avail Use% Mounted on
devtmpfs 992M 0 992M 0% /dev
tmpfs 1001M 0 1001M 0% /dev/shm
tmpfs 1001M 584K 1000M 1% /run
tmpfs 1001M 0 1001M 0% /sys/fs/cgroup
/dev/mapper/fedora-root 13G 4.3G 7.4G 37% /
/dev/sda1 976M 82M 828M 9% /boot
tmpfs 1001M 4.0K 1001M 1% /tmp
tmpfs 201M 0 201M 0% /run/user/0
/dev/mapper/test-lvol 9.9G 223M 9.2G 3% /mnt
Но с точки зрения хозяина все будет выглядеть иначе.
ls -lh|grep New
-rw------- 1 dmitryzayats staff 9.8G Oct 29 00:13 NewVirtualDisk1.vdi
Причина в том, что каждый раз, когда создается новый файл - ОС может записывать данные в другое место на блочном устройстве. Затем, когда файл удален - с точки зрения пространства VM теперь свободен, но на лежащем в основе пространстве VDI уже было зарезервировано, размер файла VDI вырос, и нет возможности уменьшить его. Есть некоторые возможности уменьшить его, но для этого потребуется закрыть виртуальную машину и пробить дыры в файле VDI. Вы можете Google для "пробивая дыры в разреженных файлах".
Некоторые рабочие нагрузки ведут себя особенно плохо с тонкими дисками. Например, если база данных Oracle находится в режиме архива - она создаст много архивных журналов, и даже если они регулярно удаляются при запуске rman - она быстро заполнит тонкий диск до максимального размера.