Pertanyaan Bagaimana cara memadatkan ukuran file VDI VirtualBox?


Saya punya 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 berkembang sampai tidak ada ruang pada host.

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

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


269
2018-01-07 03:41


asal




Jawaban:


Anda harus melakukan langkah-langkah berikut:

  1. Jalankan defrag di guest (hanya Windows)
  2. Nullify free space:

    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 Windows Guest, unduh SDelete dari Sysinternals dan jalankan ini:

    sdelete.exe c: -z
    

    (ganti C: dengan huruf drive dari VDI)

  3. Matikan VM tamu

  4. Sekarang jalankan VBoxManage modifymedium perintah dengan --compact pilihan:

    Dengan Linux Host jalankan ini:

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

    Dengan Windows Host 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.


452
2018-01-07 05:05



Untuk orang berikutnya, perintah saya akhirnya terlihat seperti ini: "C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" modifikasi "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -kompak - Daniel
Menurut zerofree Linux utility manpage (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 citra disk (sementara) tumbuh ke tingkat maksimal", "itu (sementara) menggunakan semua ruang kosong pada disk, sehingga tindakan tulis bersamaan lainnya mungkin gagal". Zerofree tersedia di Ubuntu Linux via tepat, atau Anda dapat meng-compile sendiri. - Dakatine
Sangat menyenangkan bahwa halaman manual zerofree menyatakan bahwa dengan DD penulisan bersamaan lainnya akan gagal, tetapi zerofree membutuhkan filesystem yang akan di-mount read-only! * duh * - Madarco
Tip: Taruh dua perintah pada satu baris seperti ini: dd ...; rm /bigfile, ini akan meminimalkan waktu dengan disk penuh jika Anda tidak menunggu dd untuk menyelesaikan. - jlh
@ Dakatine Menggunakan VirtualBox 4.3.10, file gambar disk tidak tumbuh sampai batas maksimalnya. VirtualBox cukup pintar untuk tidak repot-repot menulis semua blok nol ke disk fisik. - jlh


Jika menjalankan perintah dalam jawaban yang diterima menghasilkan pesan kesalahan yang tidak membantu seperti ini

VBoxManage.exe: error: Cannot register the hard disk 'thedisk.vdi'
{aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} because a hard disk 'thedisk.vdi'
with UUID {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} already exists

Cukup jalankan perintah oleh UUID bukan nama file:

VBoxManage.exe modifyhd {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} --compact

34
2018-06-18 07:20





Saya berada di host Windows 7 dengan tamu Windows, Berikut ini adalah file batch yang saya tulis untuk Memadatkan 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 (semacam) memberi tahu 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.


11
2018-01-09 10:25



Anda akan berpikir di situs semacam ini akan ada semacam penyorotan sintaks untuk DOS tetapi tidak. Ini terlihat lebih cantik di Notepad ++ - CAD bloke
@CAD_bloke yang akan membutuhkan mesin parsing dan ketika Anda mempertimbangkan jumlah bahasa berbeda yang diposkan di SE, Anda akan melihat proyek BESAR. Coba pikirkan berapa banyak versi dan dialek DOS yang ada misalnya dan itu bahkan sebelum Anda masuk ke Linux dll. - Caltor
Poin yang sangat bagus. Ironisnya itu aku s disorot pada aplikasi iOS pertukaran tumpukan. - CAD bloke
Ya CloneVDI jauh lebih baik dan lebih cepat untuk penggunaan pribadi - VarunAgw


Tamu Debian di host Windows menggunakan discard / TRIM.

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

Solusi ini membutuhkan filesystem tamu yang mendukung TRIM berkelanjutan. Wiki Linux Arch memiliki daftar filesystem yang mendukung operasi TRIM.

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

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

Konfigurasi host

Dengan VBox keluar dan tidak ada VM yang berjalan, tambahkan dukungan kosong ke disk Anda dengan menyetel keduanya discard dan nonrotational untuk setiap disk dalam file konfigurasi untuk VM. Pada saat ini discard bukan di GUI, tapi nonrotational ditampilkan sebagai kotak "Solid-state Drive". (ref: forum vbox, abaikan dukungan)

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

Boot VM, 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: debian wiki, contoh lvm.conf)

devices {
...
    issue_discards = 1
}

Di fstab, tambahkan discard pilihan untuk filesystem 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

Buat kembali sistem file agar mereka mengambil opsi baru mereka.

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

Secara manual memangkas blok gratis sekarang dengan fstrim. fstrim menggunakan filesystem yang di-mount, bukan perangkat blok yang mendukungnya. Daripada mengatur membuang terus menerus di 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 sangat mendekati 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, gambar fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, gambar fmt: VDI

5
2018-02-24 16:27





Untuk MacOS Guest melakukan hal ini:

  1. Nullify 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 disk image VDI

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

    ATAU

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

2
2017-12-16 17:08





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

Perintah di Debian:

root@debian:~# lsblk  # show partitions
NAMA MAJ: MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 128G 0 disk
└─sdb1 8:17 0 128G 0 bagian / mnt / web # INI ADALAH PARTISI KEPENTINGAN!
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 membantu :)


1
2018-02-05 11:31





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 berada pada disk rotasi klasik. Bagi saya lebih baik adalah melakukan pemadatan dengan tangan misalnya satu kali per bulan.

Selama pemadatan normal, konten file VDI disalin ke file baru. Ini membutuhkan beberapa ruang kosong (kadang-kadang besar) pada disk tuan rumah.

Saya punya solusi yang mirip dengan ditunjuk oleh Andrew Domaszek. Ia bekerja sangat baik bahkan dengan NTFS (Windows10).

Untuk melakukan ini:

  • membuat mesin virtual baru yang melakukan boot dengan GParted Live CD (Anda dapat menggunakan distro Linux favorit Anda).
  • Edit pengaturan mesin dan setel kontroler disc SATA
  • Tambahkan file VDI yang sudah ada yang ingin Anda ringkas
  • 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 root shell Linux, mount partisi NTFS mount /dev/sda2 /mnt
  • nol ruang kosong dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • memaksa pemadatan VDI tanpa membuat file baru: fstrim -v /mnt

1
2017-09-15 07:17





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 mengompresi folder drive virtual pada properti NTFS pada Windows host). Ini sebenarnya memiliki manfaat untuk menghemat lebih banyak ruang karena sistem operasi cenderung menyimpan banyak teks atau file biner berulang (misalnya drive tamu 30GB yang memiliki 15GB ruang yang memusatkan perhatian dapat beralih ke 4GB pada drive host).

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


0
2018-01-20 07:13