วิธีการกระชับขนาดไฟล์ VDI ของ VirtualBox?


301

ฉันเป็น VirtualBox VM ซึ่งกำหนดค่าขนาดฮาร์ดดิสก์ที่ใหญ่มาก (ใหญ่กว่าโฮสต์) โดยความผิดพลาดของฉันโปรแกรมบน VM สร้างล็อกไฟล์จำนวนมากและขนาดไฟล์ VDI ยังคงเพิ่มขึ้นเรื่อย ๆ จนกระทั่งไม่มีพื้นที่บนโฮสต์

ตอนนี้ฉันได้ลบไฟล์บันทึก แต่ขนาดไฟล์ VDI ไม่ได้เล็กลงหลังจากใช้ VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

มีวิธีกระชับขนาดไฟล์ VDI หรือไม่? ขอบคุณ!

คำตอบ:


507

คุณต้องทำตามขั้นตอนต่อไปนี้:

  1. เรียกใช้ defrag ใน guest (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 Guestให้ดาวน์โหลดSDeleteจาก Sysinternals และรันสิ่งนี้:

    sdelete.exe c: -z
    

    (แทนที่ C: ด้วยอักษรชื่อไดรฟ์ของ VDI)

  3. ปิดใช้งาน VM guest

  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" modifiedhd "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -compact
Daniel

36
ตาม maner ยูทิลิตี้ zerofree Linux ( manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html ) zerofree ควรจะดีกว่าddสำหรับงานนี้ ไม่แนะนำให้ใช้ddเพราะ "ช้า", "ทำให้ดิสก์อิมเมจ (ชั่วคราว) ขยายตัวจนถึงระดับสูงสุด", "มัน (ชั่วคราว) ใช้พื้นที่ว่างทั้งหมดบนดิสก์ดังนั้นการดำเนินการเขียนอื่นพร้อมกันอาจล้มเหลว" Zerofree มีให้บริการบน Ubuntu Linux ผ่านaptหรือคุณสามารถรวบรวมได้ด้วยตนเอง
Dakatine

27
มันสนุกที่ manpage ของzerofreeระบุว่าด้วยdd การเขียนพร้อมกันอื่น ๆ จะล้มเหลว แต่ zerofree ต้องการให้ระบบไฟล์ติดตั้งแบบอ่านอย่างเดียว! * duh *
Madarco

7
เคล็ดลับ: ใส่คำสั่งสองคำสั่งในหนึ่งบรรทัดดังนี้: dd ...; rm /bigfileซึ่งจะเป็นการลดเวลาด้วยดิสก์เต็มรูปแบบในกรณีที่คุณไม่รอให้คำddสั่งดำเนินการจนเสร็จสิ้น
jlh

21
@Dakatine ใช้ VirtualBox 4.3.10 ไฟล์อิมเมจของดิสก์ไม่ขยายใหญ่สุด VirtualBox ฉลาดพอที่จะไม่รบกวนการเขียนบล็อคศูนย์ทั้งหมดลงในฟิสิคัลดิสก์
jlh

12

ฉันใช้โฮสต์ Windows 7 กับแขกของ Windows นี่คือไฟล์แบตช์ที่ฉันเขียนลงใน Compact VDIs ทั้งหมดในแผนผังโฟลเดอร์

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 bloke

1
@CAD_bloke ที่ต้องใช้เครื่องมือในการแยกวิเคราะห์และเมื่อคุณพิจารณาจำนวนภาษาต่าง ๆ ที่โพสต์ใน SE คุณกำลังดูโครงการขนาดใหญ่ แค่คิดว่ามีกี่เวอร์ชั่นและสำเนียงของ DOS ที่เป็นตัวอย่างและนั่นคือก่อนที่คุณจะไปถึง Linux และอื่น ๆ
Caltor

จุดที่ดีมาก แดกดันมันถูกเน้นในแอป iOS แลกเปลี่ยนสแต็ค
CAD bloke

2
Yeah CloneVDI เป็นวิธีที่ดีกว่าและเร็วกว่าสำหรับการใช้งานส่วนตัว
VarunAgw

6

Debian guest บนโฮสต์ Windows โดยใช้ discard / TRIM

นี่ไม่ใช่คำตอบโดยตรงต่อฉันเป็นฉันแก้ไขปัญหาไม่ใช่คำถาม แทนที่จะบีบอัดรูปภาพเป็นระยะทางออกนี้ใช้ทิ้งเพื่อลบบล็อกที่ไม่ได้ใช้ในดิสก์อิมเมจ VM ของโฮสต์โดยอัตโนมัติ

โซลูชันนี้ต้องการระบบไฟล์ของแขกที่รองรับ TRIM อย่างต่อเนื่อง วิกิพีเดีย Arch Linux มีรายชื่อของระบบไฟล์สนับสนุนการดำเนินงาน TRIM

FDE และ cryptoroot นั้นไม่ครอบคลุมโดยเฉพาะเนื่องจากมีข้อกังวลด้านความปลอดภัยและไม่มีวิธีการแก้ปัญหาอื่นสำหรับคำถามนี้ที่จะช่วยให้กระชับได้เช่นกัน วิกิพีเดีย Arch Linux มีข้อมูลเกี่ยวกับอุปกรณ์ตัดและ DM-ฝังศพใต้ถุนโบสถ์

ในทางทฤษฎีสิ่งนี้จะทำงานสำหรับแขก Linux ทั้งหมดบนโฮสต์ VBox โดยใช้ที่จัดเก็บ VDI

การกำหนดค่าโฮสต์

ด้วย VBox ที่ออกและไม่มี VM ทำงานให้เพิ่มการสนับสนุนทิ้งไปยังดิสก์ของคุณโดยการตั้งค่าทั้งสองdiscardและnonrotationalสำหรับแต่ละดิสก์ในไฟล์ปรับแต่งสำหรับ VM ในเวลาdiscardนี้ไม่ได้อยู่ใน GUI แต่nonrotationalจะเปิดเผยเป็นช่องทำเครื่องหมาย "Solid-state Drive" (การอ้างอิง: ฟอรัม vbox, ยกเลิกการสนับสนุน )

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

บูต VM up และตรวจสอบว่าเปิดใช้งานการสนับสนุน TRIM:

sudo hdparm -I /dev/sda | grep TRIM

การกำหนดค่าของแขก

หาก LVM /etc/lvm/lvm.confอยู่ในการใช้เปลี่ยนการตั้งค่าในการทิ้ง (การอ้างอิง: debian wiki, ตัวอย่าง lvm.conf )

devices {
...
    issue_discards = 1
}

ใน fstab ให้เพิ่มdiscardตัวเลือกในระบบไฟล์ที่คุณต้องการทิ้งอัตโนมัติ (อ้างอิง: debian wiki, 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

ประกอบระบบไฟล์ใหม่เพื่อให้พวกเขาเลือกตัวเลือกใหม่

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

ตัดแต่งบล็อกฟรีด้วยตนเองfstrimทันทีด้วย fstrimใช้ระบบไฟล์ที่เมาท์ไม่ใช่อุปกรณ์บล็อกที่สำรองข้อมูล แทนที่จะปล่อยทิ้งไว้อย่างต่อเนื่องfstabสิ่งนี้สามารถทำได้ใน cron รายสัปดาห์ (แนะนำให้ใช้ cron รายสัปดาห์สำหรับฟิสิคัล SSD ซึ่งอาจมีการสนับสนุนที่น่าสงสัยสำหรับ TRIM แต่ไม่เกี่ยวข้องที่นี่เนื่องจาก SSD พื้นฐานถูกจัดการโดยโฮสต์ระบบปฏิบัติการดูที่: คำเตือนการตัดแต่ง ssd )

fstrim /
fstrim /build

ณ จุดนี้ขนาดของระบบไฟล์ภายใน VM และขนาดของอิมเมจ VM น่าจะใกล้เคียงกัน

ทดสอบกับ:

  • แขก 1: Debian 8.7, เคอร์เนล: linux 4.8 grsec จาก backports, ระบบไฟล์: ext4
  • แขก 2: Debian 9 RC2, เคอร์เนล: linux 4.9, ระบบไฟล์: ext4
  • โฮสต์ 1: VBox 5.1.14, Win7, รูปภาพ fmt: VDI
  • โฮสต์ 2: VBox 5.1.14, Win8.1, รูปภาพ fmt: VDI

2

สำหรับแขก MacOSทำสิ่งนี้:

  1. ลบล้างพื้นที่ว่างในระบบแขก:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (แทนที่ / ปริมาณ / Macintosh HD ด้วยชื่อไดรฟ์ของคุณ)

  2. ปิดใช้งาน VM guest

  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
ชื่อ MAJ: MOUNTPOINT ประเภทขั้นต่ำของ RM RM 
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 จะถูกคัดลอกไปยังไฟล์ใหม่ สิ่งนี้ต้องการพื้นที่ว่าง (บางครั้งใหญ่) บนโฮสต์ดิสก์

ฉันแก้ปัญหาคล้ายกับชี้โดย Andrew Domaszek มันใช้งานได้ดีมากแม้กับ NTFS (Windows10)

เพื่อทำสิ่งนี้:

  • สร้างเครื่องเสมือนใหม่ซึ่งบู๊ตด้วย GParted Live CD (คุณสามารถใช้ Linux distro ที่คุณโปรดปราน)
  • แก้ไขการตั้งค่าเครื่องและตั้งค่าดิสก์คอนโทรลเลอร์ 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 root shell ให้เมาต์พาร์ติชัน NTFS mount /dev/sda2 /mnt
  • พื้นที่ว่างเป็นศูนย์ dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • บังคับให้กระชับ VDI โดยไม่ต้องสร้างไฟล์ใหม่: fstrim -v /mnt

0

เคล็ดลับที่เป็นระเบียบมากเพื่อเสริมคำตอบที่ยอมรับคือคุณสามารถออกไปได้โดยไม่ต้องทำการบีบอัดใด ๆ เลยหลังจาก zeroing guest space โดยใช้ระบบไฟล์บีบอัดบนโฮสต์ (เช่นการเลือกที่จะบีบอัดโฟลเดอร์ของไดรฟ์เสมือนบนคุณสมบัติ NTFS บน โฮสต์ Windows) ในความเป็นจริงสิ่งนี้มีประโยชน์ในการประหยัดพื้นที่ได้มากขึ้นเนื่องจากระบบปฏิบัติการมักจะเก็บข้อความซ้ำหรือไฟล์ไบนารีจำนวนมาก (เช่นไดรฟ์แขก 30GB ที่มีพื้นที่ว่าง 15GB zeroed สามารถเปลี่ยนเป็น 4GB บนโฮสต์ไดรฟ์)

ข้อ จำกัด รวมถึงการเข้าถึงไดรฟ์บนฮาร์ดแวร์จริงที่อาจเพิ่มขึ้นและมีการใช้งาน CPU เพิ่มขึ้นเล็กน้อย


0

หมายเหตุที่สำคัญสำหรับระบบปฏิบัติการที่ถูกกฎหมาย (~ 1997-2007)

โดยทั่วไปเทคนิคในคำตอบที่ได้รับก่อนหน้านี้จะถูกต้อง อย่างไรก็ตามมีกรณีพิเศษที่สำคัญมาก

เป็นเวลาหลายปี - อาจปี 1997-2007 หรือมากกว่านั้น - ระบบปฏิบัติการ 32 บิตยังคงเป็นบรรทัดฐาน แต่ฮาร์ดดิสก์ขนาดใหญ่กว่า 2GB ถูกใช้งานไปแล้ว ดังนั้นเมื่อพยายามใช้พื้นที่ว่างทั้งหมดโดยการเขียนไฟล์เป็นศูนย์ (ซึ่งควรทำในฐานะ root เสมอเพื่อรวมพื้นที่ว่างพิเศษของรูทซึ่งไม่มีใครสามารถแตะได้) คุณอาจเห็น:

ไฟล์ใหญ่เกินไป

แทนที่จะเป็นสิ่งที่คุณคาดหวัง:

ไม่มีพื้นที่เหลือบนอุปกรณ์

หากเกิดเหตุการณ์นี้คุณมีข้อ จำกัด ขนาดไฟล์ที่ 2GB นี่เป็นเรื่องปกติในเวลานั้นเนื่องจากการดำเนินการไฟล์จำนวนมากส่งคืนผลลัพธ์ในจำนวนเต็ม 32 บิตที่ลงชื่อดังนั้นค่าลบอาจรายงานรหัสข้อผิดพลาด ซึ่งหมายความว่าผลลัพธ์ออฟเซ็ตถูก จำกัด ที่ 2 ^ 31 ไบต์โดยไม่มีมาตรการพิเศษ

วิธีแก้ปัญหาคือตรงไปตรงมา: สร้างไฟล์ zeroing ที่ชื่อต่างกันไปเรื่อย ๆ จนกว่าดิสก์จะหมดพื้นที่จริง

หากคุณเป็นผู้สอนที่ต้องการสาธิตสถานการณ์นี้ในชั้นเรียนอิมเมจดิสก์ 4GB ที่มี Red Hat Linux 7.0 รุ่นเก่าก็เพียงพอแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.