Bagaimana cara memadatkan ukuran file VDI VirtualBox?


301

Saya sudah VM VirtualBox yang mengkonfigurasi ukuran hard disk yang sangat besar (lebih besar dari host). Dengan kesalahan saya, sebuah program di VM menghasilkan banyak file log dan ukuran file VDI terus bertambah hingga tidak ada ruang di host.

Sekarang saya telah menghapus file log tetapi ukuran file VDI tidak semakin kecil setelah menggunakan VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

Apakah ada cara untuk benar-benar memadatkan ukuran file VDI? Terima kasih!

Jawaban:


507

Anda harus melakukan langkah-langkah berikut:

  1. Jalankan defrag di guest (hanya Windows)
  2. Hapus ruang kosong:

    Dengan Linux Guest jalankan ini:

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

    Atau:

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

    Dengan Tamu Windows , unduh SDelete dari Sysinternals dan jalankan ini:

    sdelete.exe c: -z
    

    (ganti C: dengan huruf drive VDI)

  3. Matikan VM tamu

  4. Sekarang jalankan modifymediumperintah VBoxManage dengan --compactopsi:

    Dengan Linux Host jalankan ini:

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

    Dengan Host Windows jalankan ini:

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

    Dengan Mac Host jalankan ini:

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

Ini mengurangi ukuran vdi.


15
Untuk orang berikutnya, perintah saya akhirnya tampak seperti ini: "C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" modifiedhd "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -compact
Daniel

36
Menurut manual utilitas zerofree Linux ( manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html ), zerofree harus lebih baik daripada dd untuk pekerjaan ini. dd tidak akan direkomendasikan karena "itu lambat", "itu membuat gambar disk (sementara) tumbuh hingga batas maksimal", "itu (sementara) menggunakan semua ruang kosong pada disk, sehingga tindakan penulisan bersamaan lainnya mungkin gagal". Zerofree tersedia di Ubuntu Linux melalui apt , atau Anda dapat mengompilasinya sendiri.
Dakatine

27
Sangat menyenangkan bahwa halaman manual zerofree menyatakan bahwa dengan dd penulisan bersamaan lainnya akan gagal, tetapi zerofree memerlukan sistem file untuk dipasang hanya-baca! * duh *
Madarco

7
Tip: Letakkan dua perintah pada satu baris seperti dd ...; rm /bigfileini:, ini akan meminimalkan waktu dengan disk penuh jika Anda tidak menunggu untuk ddmenyelesaikannya.
jlh

21
@ Dakatine Menggunakan VirtualBox 4.3.10, file gambar disk tidak tumbuh secara maksimal. VirtualBox cukup pintar untuk tidak repot-repot menulis semua nol blok ke disk fisik.
jlh

12

Saya berada di host Windows 7 dengan tamu Windows, Ini adalah file batch yang saya tulis ke Compact semua VDI di pohon folder

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

Saya meninggalkan tautan di komentar sehingga Anda dapat (mengetahui) cara kerjanya.

sunting

Yah, setelah semua itu, saya mencoba alat CloneVDI dan itu melakukan pekerjaan dengan baik dalam waktu yang jauh lebih sedikit dan dalam satu klik.


5
Anda akan berpikir pada situs semacam ini akan ada semacam penyorotan sintaks untuk DOS tetapi tidak. Ini terlihat jauh lebih cantik di Notepad ++
CAD bloke

1
@CAD_bloke yang akan membutuhkan mesin parsing dan ketika Anda mempertimbangkan jumlah bahasa yang berbeda diposting di SE Anda sedang melihat proyek BESAR. Pikirkan berapa banyak versi dan dialek DOS yang ada misalnya dan itu bahkan sebelum Anda sampai ke Linux dll.
Caltor

Poin yang sangat bagus. Ironisnya hal tersebut disorot di bursa tumpukan iOS app.
CAD

2
Ya CloneVDI jauh lebih baik dan lebih cepat untuk penggunaan pribadi
VarunAgw

6

Tamu Debian pada host Windows menggunakan discard / TRIM.

Ini bukan jawaban langsung, karena saya sedang mengatasi masalah, bukan pertanyaan. Alih-alih memadatkan gambar secara berkala, solusi ini menggunakan discard untuk secara otomatis menghapus blok yang tidak digunakan dalam image disk VM host.

Solusi ini memerlukan sistem file tamu yang mendukung TRIM berkelanjutan. Wiki Arch Linux memiliki daftar sistem file yang mendukung operasi TRIM .

FDE dan cryptoroot tidak dicakup secara khusus, karena ada masalah keamanan dan tidak ada solusi lain untuk pertanyaan ini yang akan memungkinkan pemadatan juga. Wiki Arch Linux memiliki informasi tentang TRIM dan perangkat dm-crypt .

Secara teori, ini akan bekerja untuk semua tamu Linux di host VBox menggunakan penyimpanan VDI.

Konfigurasi host

Dengan keluarnya VBox dan tidak ada VM yang berjalan, tambahkan dukungan discard ke disk Anda dengan mengatur keduanya discarddan nonrotationaluntuk setiap disk dalam file konfigurasi untuk VM. Saat ini discardtidak ada dalam GUI, tetapi nonrotationaldiekspos sebagai kotak centang "Solid-state Drive". (ref: forum vbox, buang dukungan )

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

Boot VM ke atas, dan verifikasi bahwa dukungan TRIM diaktifkan:

sudo hdparm -I /dev/sda | grep TRIM

Konfigurasi Tamu

Jika LVM sedang digunakan, ubah pengaturan buang di /etc/lvm/lvm.conf. (ref: wiki debian, contoh lvm.conf )

devices {
...
    issue_discards = 1
}

Di fstab, tambahkan discardopsi ke sistem file yang ingin Anda buang otomatis (ref: debian wiki, contoh fstab )

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

Remount filesystem agar mereka mengambil opsi baru.

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

Potong blok gratis secara manual sekarang dengan fstrim. fstrimmenggunakan sistem file yang dipasang, bukan perangkat blok yang mendukungnya. Alih-alih mengatur buang berkelanjutan fstab, ini bisa dilakukan pada cron mingguan. (Cron mingguan direkomendasikan untuk SSD fisik yang mungkin memiliki dukungan yang dipertanyakan untuk TRIM, tetapi ini tidak relevan di sini karena SSD yang mendasarinya ditangani oleh OS host. Lihat: peringatan trim ssd ).

fstrim /
fstrim /build

Pada titik ini, ukuran filesystem di dalam VM dan ukuran gambar VM harus cukup dekat nilainya.

Diuji dengan:

  • Guest1: Debian 8.7, kernel: linux 4.8 grsec dari backports, filesystem: ext4
  • Guest2: Debian 9 RC2, kernel: linux 4.9, filesystem: ext4
  • Host1: VBox 5.1.14, Win7, image fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, image fmt: VDI

2

Untuk MacOS Guest, lakukan ini:

  1. Hapus ruang kosong di sistem tamu:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (ganti / Volume / Macintosh HD dengan nama drive Anda)

  2. Matikan VM tamu

  3. Jalankan perintah ini untuk mengurangi ukuran gambar disk VDI

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

    ATAU

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

1

Saya menggunakan ini untuk gambar VDI saya yang dipasang ke Debian virtual di Windows VirtualBox. Ini bukan solusi umum, tetapi setidaknya harus memberi Anda inti dari apa yang saya lakukan.

Perintah dalam Debian:

root@debian:~# lsblk  # show partitions
NAMA MAJ: MIN RM UKURAN RO TYPE MOUNTPOINT 
sdb 8:16 0 128G 0 disk 
└─sdb1 8:17 0 128G 0 bagian / mnt / web # INI ADALAH PARTISI BUNGA!
sda 8: 0 0 64G 0 disk 
├─sda1 8: 1 0 61,4G 0 bagian / 
├─sda2 8: 2 0 1K 0 bagian 
└─sda5 8: 5 0 2,7G 0 bagian 
[SWAP] sr0 11: 0 1 56,3M 0 rom
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

Perintah di Windows:

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

Semoga bermanfaat :)


1

Saya tidak ingin mengaktifkan dukungan TRIM di OS, karena setiap penghapusan data akan memaksa pemadatan data dalam file VDI, membuat sistem tamu tidak dapat digunakan ketika file VDI ada pada disc rotasi klasik. Bagi saya yang lebih baik adalah melakukan pemadatan dengan tangan misalnya sebulan sekali.

Selama pemadatan normal, konten file VDI disalin ke file baru. Ini membutuhkan ruang kosong (terkadang besar) pada disk host.

Saya sudah solusi yang mirip dengan yang ditunjukkan oleh Andrew Domaszek. Ini bekerja sangat baik bahkan dengan NTFS (Windows10).

Untuk melakukan ini:

  • buat mesin virtual baru yang melakukan booting dengan GParted Live CD (Anda dapat menggunakan distro Linux favorit Anda).
  • Edit pengaturan mesin dan atur pengontrol disk SATA
  • Tambahkan file VDI yang sudah ada yang ingin Anda padatkan
  • Ubah disk berbasis VDI agar terlihat sebagai SSD dengan dukungan 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
    
  • mulai mesin

  • Di shell root Linux, mount partisi NTFS mount /dev/sda2 /mnt
  • nol ruang kosong dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • memaksakan pemadatan VDI tanpa membuat file baru: fstrim -v /mnt

0

Trik yang sangat rapi untuk melengkapi jawaban yang diterima adalah bahwa Anda dapat pergi tanpa melakukan pemadatan sama sekali setelah memusatkan ruang tamu, dengan menggunakan sistem file terkompresi pada host (misalnya memilih untuk mengkompres folder drive virtual pada properti NTFS pada properti Tuan rumah Windows). Ini sebenarnya memiliki manfaat untuk menghemat lebih banyak ruang karena sistem operasi cenderung menyimpan banyak teks berulang atau file biner (misalnya drive 30GB tamu yang memiliki ruang 15GB yang memusatkan perhatian dapat berubah menjadi 4GB pada drive host).

Peringatan termasuk bahwa akses drive pada perangkat keras nyata dapat meningkat dan ada sedikit peningkatan dalam penggunaan CPU.


0

CATATAN PENTING UNTUK LEGACY (~ 1997-2007) SISTEM OPERASI

Secara umum, teknik dalam jawaban yang diberikan sebelumnya valid; NAMUN, ada kasus khusus yang sangat penting.

Untuk periode beberapa tahun - mungkin 1997-2007 atau lebih - sistem operasi 32-bit masih menjadi norma, tetapi hard disk yang lebih besar dari 2GB sudah digunakan. Akibatnya, ketika mencoba menggunakan semua ruang kosong dengan menulis file nol (yang harus selalu dilakukan sebagai root, untuk memasukkan ruang bebas root, yang tidak dapat disentuh orang lain), Anda mungkin melihat:

File terlalu besar

alih-alih apa yang Anda harapkan:

Tidak ada ruang yang tersisa di perangkat.

Jika ini terjadi, Anda kemungkinan besar mencapai batasan ukuran file 2GB. Ini umum pada saat itu karena banyak operasi file mengembalikan hasil dalam bilangan bulat 32-bit yang ditandatangani, sehingga nilai negatif dapat melaporkan kode kesalahan. Ini secara efektif berarti bahwa hasil offset dibatasi hingga 2 ^ 31 byte tanpa tindakan khusus.

Solusinya sangat mudah: tetap membuat file zeroing yang terpisah dan diberi nama berbeda sampai disk benar-benar kehabisan ruang.

Jika Anda seorang instruktur yang ingin mendemonstrasikan situasi ini untuk sebuah kelas, gambar disk 4GB dengan salinan lama Red Hat Linux 7.0 sudah cukup.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.