Как сжать динамически растущий VDI-диск из VirtualBox?


35

Мои динамически растущие виртуальные диски (VDI) из различных установок Ubuntu в Virtual Box на самом деле неуклонно растут.

Удаление файлов на виртуальной машине не освобождает пространство, занимаемое моим VDI-файлом на жестком диске хоста.

Как мне сжать эти файлы, чтобы вернуть неиспользуемое пространство на жестком диске обратно хосту?

Ответы:


34

Динамически растущий файл виртуального жесткого диска Virtual Box способен расти по требованию виртуальной машины до максимального размера, который мы определили при настройке этого файла. Однако это не освобождает пространство файлов, которые мы удалили в гостевой ОС.

Если диск слишком сильно вырос, мы можем сжать его снова, при условии, что неиспользуемое пространство заполнено нулями, а накопитель имеет формат VDI.

Для файловой системы ext2 - ext 4 это можно сделать из гостевой системы Ubuntu с помощью утилиты командной строки zerofree * .Установить нулевой

zerofree /dev/sdxX

Для этого необходимо, чтобы диск не использовался и был демонтирован . Поэтому нам, возможно, придется временно привязать его к другой виртуальной машине, которую мы создали для этой цели, или нам нужно загрузить на нее виртуальную среду Ubuntu.

Замените /dev/sdxXна рассматриваемый раздел в формате ext2, ext3 или ext4 .

На более чем одном разделе мы должны повторить zerofreeдля каждого раздела. Имейте в виду, что при заполнении нулями виртуальный файл будет временно увеличиваться до максимального размера.

Когда все неиспользуемое дисковое пространство заполнено нулями, мы сжимаем диск

VBoxManage modifyhd <name>.vdi --compact

Это значительно уменьшит размер нашего VDI-файла.

* В гостевой системе Windows мы можем заменить неиспользуемое пространство утилитой sdelete.


Будет ли это также работать для зашифрованной файловой системы в гостевой системе?
Смичак

Конечно. Если вы используете ecryptfs, зашифрованные файлы выглядят как обычные файлы для дисковых утилит, и это будет работать. Если вы используете
полнодисковое

Я использую раздел ext4 на блочном устройстве dm-crypt ... Я попробовал метод, и я не вижу файл .vdi меньшим после сжатия. Я думаю, что нулевые блоки сохраняются как ненулевые блоки на блочном устройстве под dm-crypt.
Смичак

2
@ Smichak: это точка шифрования. Он зашифрует все ваши диски, чтобы мы не могли видеть границы файлов.
Таккат

3
Если вы не хотите , чтобы прикрепить VDI на другую машину, вы можете загрузиться в режиме восстановления, и смонтировать диск только для чтения , mount -n -o remount,ro -t ext4 /dev/sda1а затем zerofree -v /dev/sda1.
Хамид Назари

1

Вот несколько альтернативных способов обнуления свободного дискового пространства (которое может быть наиболее трудоемким этапом). После этого вам все равно придется бежать, VBoxManage modifyhd <disk> --compactчтобы сжать фактический файл на диске.


Эта команда может обнулить диск, пока он не подключен:

apt-get install zerofree
zerofree -v /dev/sdxN


Вот пример того, как заставить dd периодически печатать вывод:

dd if=/dev/zero of=temp-file-on-disk bs=20M

# run this to get the process ID of the dd command
pgrep -l '^dd$'
# then put the process ID on the command line to "kill -USR1"
# this will tell dd to print the current status (in another terminal)
kill -USR1 $(pgrep -l '^dd$' | awk '{print $1}')


Вот ddпохожая программа, которая будет автоматически печатать выходные данные периодически:

apt-get install dcfldd
dcfldd if=/dev/zero of=temp-file-on-disk bs=20M

1
Я видел zerofreeиспользуемый на смонтированной файловой системе, но когда она была смонтирована только для чтения. Даже для корневой FS: sudo mount -o remount,ro /- но в сеансе с графическим интерфейсом корень будет занят, поэтому он потерпит неудачу. Но это возможно в уровне выполнения 1 ( telinit 1), поэтому вам не нужно загружаться с live CD для этого.
Томаш Гандор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.