Як компактний розмір VDI-файлу VirtualBox?


301

У мене VirtualBox VM, який налаштував дуже великий розмір жорсткого диска (більший, ніж хост). З моєї помилки, програма в VM генерувала безліч файлів журналів, а розмір файлу VDI постійно зростає, поки на хості немає місця.

Тепер я видалив файли журналу, але розмір файлу VDI не зменшується після використання VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

Чи існує спосіб компактного розміру файлу VDI? Дякую!

Відповіді:


507

Ви повинні виконати наступні дії:

  1. Запустити дефрагментацію в гості (лише для Windows)
  2. Зніміть вільний простір:

    З гостем Linux запустіть це:

    dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile
    

    Або:

    telinit 1
    mount -o remount,ro /dev/sda1
    zerofree -v /dev/sda1
    

    За допомогою гостя Windows завантажте SDelete з Sysinternals і запустіть це:

    sdelete.exe c: -z
    

    (замініть C: літерою диска VDI)

  3. Вимкнення гостя В.М.

  4. Тепер запустіть modifymediumкоманду VBoxManage з --compactопцією:

    За допомогою Linux Host запустіть це:

    vboxmanage modifymedium --compact /path/to/thedisk.vdi
    

    За допомогою Windows Host запустіть це:

    VBoxManage.exe modifymedium --compact c:\path\to\thedisk.vdi
    

    За допомогою Mac Host запустіть це:

    VBoxManage modifymedium --compact /path/to/thedisk.vdi
    

Це зменшує розмір vdi.


14
Для наступної людини моя команда виглядала приблизно так: "C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" modifyhd "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -compact
Даніель

36
Відповідно до нульової сторінки утиліти Linux ( manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html ), zerofree має бути кращим, ніж dd для цієї роботи. dd не рекомендується, оскільки "це повільно", "змушує образ диска (тимчасово) зростати до максимальної міри", "він (тимчасово) використовує весь вільний простір на диску, тому інші паралельні дії запису можуть не працювати". Zerofree доступний на Ubuntu Linux через apt , або ви можете скласти його самостійно.
Дакатін

27
Приємно, що на сторінці " zerofree" зазначено, що при dd інші паралельні записи не зможуть, але потрібна файлова система, яка встановлюється лише для читання! * duh *
Мадарко

7
Порада. Покладіть дві команди в один рядок так:, dd ...; rm /bigfileце скоротить час із повним диском у випадку, якщо ви не чекаєте ddзавершення.
jlh

21
@Dakatine За допомогою VirtualBox 4.3.10 файл зображення диска не зростав до максимальної міри. VirtualBox досить розумний, щоб не заважати писати всі нульові блоки на фізичний диск.
jlh

12

Я на хості Windows 7 з гостями Windows. Ось пакетний файл, який я написав для компактності всіх VDI в дереві папок

echo off
mode con:cols=140 lines=200
cls
:: see https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: How can I reduce the size of a dynamic VDI on disk?
:: but that page says to use sdelete -s which is suboptimal. 
:: use -z as per http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx

:: First run the sdelete -z c: inside the VMs that zero-out all the free space
:: THEN run this batch file 

Title Compacting Free space on Virtual Machine VMs

:: http://ss64.com/nt/for_r.html
:: http://stackoverflow.com/questions/8836368/windows-batch-file-how-to-loop-through-files-in-a-directory/8836401#8836401

Setlocal EnableDelayedExpansion
:: http://ss64.com/nt/delayedexpansion.html ... 
:: Notice that within the for loop we use !variable! instead of %variable%.

For /R %CD% %%G IN (*.vdi) DO (
 set ohai=%%G
 set lastfive=!ohai:~-5!
:: Skip snapshots which are named {guid}.vdi
 if NOT !lastfive!==}.vdi (
 echo .
 echo Compacting %%G
 "C:\Program Files\Oracle\VirtualBox\VboxManage.exe" modifyhd "%%G" --compact )
 )

pause 
exit

Я залишив посилання в коментарях, щоб ви могли (свого роду) розповісти, як це працює.

редагувати

Ну, зрештою, я спробував інструмент CloneVDI, і він зробив гарну роботу за набагато менше часу та одним клацанням.


5
Ви б могли подумати, що на такому сайті буде виділятися якесь синтаксичне виділення для DOS, але ні. Це виглядає набагато красивіше в Notepad ++
CAD блокується

1
@CAD_bloke, який вимагатиме розбору двигунів, і коли ви враховуєте кількість різних мов, розміщених у SE, ви дивитесь на ВЕЛИЧИЙ проект. Подумайте, скільки версій і діалектів DOS є, наприклад, і це ще до того, як ви навіть потрапите до Linux тощо.
Caltor,

Дуже хороший момент. Як не дивно це буде виділено на обмінному стека IOS додаток.
CAD блокується

2
Так, CloneVDI - це набагато кращий і швидший спосіб для особистого використання
VarunAgw

6

Гість Debian на хості Windows за допомогою відкидання / TRIM.

Це не пряма відповідь сама по собі, тому що я розглядаю проблему, а не питання. Замість періодичного ущільнення зображення, це рішення використовує відмову для автоматичного видалення невикористаних блоків у зображенні диска VM хоста.

Для цього рішення потрібна гостьова файлова система, яка підтримує постійний TRIM. У вікі Arch Arch є список файлових систем, що підтримують операції TRIM .

FDE та cryptoroot спеціально не охоплені, оскільки є проблеми безпеки, і жодне з інших рішень цього питання не дозволило б ущільнити будь-яке. У вікі Arch Arch є інформація про пристрої TRIM та dm-crypt .

Теоретично це буде працювати для всіх гостей Linux на хостах VBox, що використовують VDI-накопичувач.

Конфігурація хоста

Коли VBox не вийшов і не працює ВМ, додайте підтримку відкидання на свої диски, встановивши як discardі nonrotationalкожен диск у конфігураційному файлі для VM. Наразі це discardне в графічному інтерфейсі, але nonrotationalвиставлено як прапорець "Твердотільний накопичувач". (ref: форуми vbox, підтримка відмов )

<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >

Завантажте VM та переконайтеся, що підтримка TRIM увімкнена:

sudo hdparm -I /dev/sda | grep TRIM

Конфігурація гостя

Якщо LVM використовується, змініть налаштування для скидання /etc/lvm/lvm.conf. (посилання: wiki debian, приклад lvm.conf )

devices {
...
    issue_discards = 1
}

У fstab додайте discardпараметр у файлові системи, які ви хочете автоматично відкинути (ref: debian wiki, fstab example )

UUID=8db6787f-1e82-42d8-b39f-8b7491a0523c   /   ext4    discard,errors=remount-ro   0   1
UUID=70bfca92-8454-4777-9d87-a7face32b7e7   /build  ext4    discard,errors=remount-ro,noatime   0   1

Переназначте файлові системи, щоб вони підбирали нові параметри.

sudo mount -o remount /
sudo mount -o remount /build

Ручні обрізки вільних блоків тепер за допомогою fstrim. fstrimвикористовує змонтовану файлову систему, а не блоковий пристрій, що її підтримує. Замість того, щоб встановлювати безперервну відмову fstab, це можна зробити на щотижневому кроні. (Рекомендується щотижневий крон для фізичних SSD, які можуть мати сумнівну підтримку TRIM, але це не має значення тут, оскільки базові SSD обробляються хост-системою. Див.: Попередження ssd про обробку ).

fstrim /
fstrim /build

На даний момент розмір файлових систем всередині VM та розмір зображень VM повинні бути досить близькими за значенням.

Тестували:

  • Guest1: Debian 8.7, ядро: linux 4.8 grsec з backports, файлова система: ext4
  • Guest2: Debian 9 RC2, ядро: linux 4.9, файлова система: ext4
  • Host1: VBox 5.1.14, Win7, зображення fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, зображення fmt: VDI

2

Для MacOS Guest зробіть це:

  1. Зніміть вільний простір у гостьовій системі:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (замініть / Томи / Macintosh HD своїм ім'ям диска)

  2. Вимкнення гостя В.М.

  3. Виконайте цю команду, щоб зменшити розмір зображення VDI диска

    VBoxManage modifyhd /path/to/thedisk.vdi --compact
    

    АБО

    VBoxManage modifymedium /path/to/thedisk.vdi --compact
    

1

Я використовую це для свого VDI-зображення, встановленого на віртуальному Debian у Windows VirtualBox. Це не загальне рішення, але воно повинно принаймні дати вам суть того, що я роблю.

Команди в Debian:

root@debian:~# lsblk  # show partitions
ІМЕЙ МАЙ: МІН RM РОЗМІР РОЗВИТОК ТИПУ RO 
sdb 8:16 0 128G 0 диск 
└─sdb1 8:17 0 128G 0 частина / mnt / web # ЦЕ СТОРІНКА ІНТЕРЕСУ!
sda 8: 0 0 64G 0 диск 
├─sda1 8: 1 0 61,4G 0 частина / 
├─sda2 8: 2 0 1K 0 частина 
└─sda5 8: 5 0 2,7G 0 частина 
[SWAP] sr0 11: 0 1 56,3M 0 ром
root@debian:~# service mysql stop  # terminate all operations with partition
root@debian:~# service apache2 stop  # terminate all operations with partition
root@debian:~# umount /mnt/web  # unplug partition
root@debian:~# apt-get install zerofree  # install tool for filling in zeros to empty space
root@debian:~# zerofree -v /dev/sdb1  # fill with zeros
root@debian:~# poweroff  # shut down machine

Команди в Windows:

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd --compact "D:\VirtualBox VMs\web.vdi"  # convert zeros to empty space

Сподіваюся, це допомагає :)


1

Я не хочу ввімкнути підтримку TRIM в ОС, тому що кожне видалення даних примусить ущільнення даних у файлі VDI, зробивши гостьову систему непридатною, коли файл VDI знаходиться на класичному обертовому диску. Для мене краще - виконувати ущільнення вручну, наприклад, раз на місяць.

Під час звичайного ущільнення вміст файлів VDI копіюється в новий файл. Для цього потрібно трохи (іноді великого) вільного місця на хост-диску.

У мене є рішення, подібне до вказаного Андрієм Домашеком. Це дуже добре працює навіть з NTFS (Windows10).

Зробити це:

  • створити нову віртуальну машину, яка завантажується з GParted Live CD (можна використовувати улюблений дистрибутив Linux).
  • Відредагуйте параметри машини та встановіть контролер диска SATA
  • Додайте наявні VDI-файли, які ви хочете ущільнити
  • Змініть диски на основі VDI, щоб вони були видимими як SSD з підтримкою TRIM:

    VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on
    VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on
    
  • пускова машина

  • У кореневій оболонці Linux змонтуйте розділ NTFS mount /dev/sda2 /mnt
  • нульовий вільний простір dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • примусово ущільнювати VDI без створення нового файлу: fstrim -v /mnt

0

Дуже акуратний трюк для доповнення прийнятої відповіді полягає в тому, що ви можете піти, не роблячи взагалі ніякого ущільнення після нульового простору гостя, використовуючи стиснуту файлову систему на хості (наприклад, вибравши для стиснення папки віртуальних дисків на властивостях NTFS на Хост Windows). Це насправді має перевагу економити набагато більше місця, оскільки операційні системи, як правило, вміщують багато повторюваних текстових чи двійкових файлів (наприклад, гостьовий накопичувач на 30 ГБ, у якого занулено 15 ГБ місця, може перетворитись на 4 ГБ на хост-диску.

Застереження включають, що доступ до накопичувача на реальному апаратному забезпеченні може збільшитися і незначне збільшення використання процесора.


0

ВАЖЛИВА ПРИМІТКА ДЛЯ ЛЕГАТІЇ (~ 1997-2007) ЕКСПЛУАТАЦІЙНИХ СИСТЕМ

Загалом, прийоми у наведених раніше відповідях є дійсними; ЯКЩО є дуже важливий особливий випадок.

Протягом декількох років - можливо, 1997-2007 рр. Або близько того - 32-розрядні операційні системи все ще були нормою, але жорсткі диски розміром більше 2 ГБ вже використовувались. В результаті, намагаючись споживати весь вільний простір, записавши файл нулів (який завжди слід робити як root, щоб включити привілейований вільний простір root, якого ніхто більше не може торкнутися), ви можете побачити:

Файл занадто великий

замість того, що ви очікуєте:

На пристрої не залишилось місця.

Якщо це сталося, ви, швидше за все, скористалися обмеженням розміру файлу 2 Гб. Це було поширеним у той час, оскільки багато файлових операцій повертали результати в підписані 32-бітні цілі числа, так що негативні значення могли повідомляти про коди помилок. Це фактично означало, що результати компенсації були обмежені 2 ^ 31 байтом без спеціальних заходів.

Вирішення проблеми просте: продовжуйте створювати окремі файли, що називаються нульовими, доки на диску фактично не вистачить місця.

Якщо ви інструктор, який бажає продемонструвати цю ситуацію для класу, достатньо 4 Гб зображення диска зі старою копією Red Hat Linux 7.0.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.