Làm cách nào để thu gọn kích thước tệp VDI của VirtualBox?


301

Tôi có một VirtualBox VM có cấu hình kích thước ổ cứng rất lớn (lớn hơn máy chủ). Do lỗi của tôi, một chương trình trên VM đã tạo ra rất nhiều tệp nhật ký và kích thước tệp VDI tiếp tục tăng cho đến khi không còn chỗ trống trên máy chủ.

Bây giờ tôi đã xóa các tệp nhật ký nhưng kích thước tệp VDI không nhỏ hơn sau khi sử dụng VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

Có cách nào để thực sự nén kích thước tệp VDI không? Cảm ơn!

Câu trả lời:


507

Bạn phải làm các bước sau:

  1. Chạy phân mảnh trong máy khách (chỉ dành cho Windows)
  2. Nullify không gian trống:

    Với một Khách Linux chạy điều này:

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

    Hoặc là:

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

    Với Windows Guest , tải xuống SDelete từ Sysiternals và chạy nó:

    sdelete.exe c: -z
    

    (thay thế C: bằng ký tự ổ đĩa của VDI)

  3. Tắt máy khách VM

  4. Bây giờ hãy chạy modifymediumlệnh của VBoxManage với --compacttùy chọn:

    Với Máy chủ Linux chạy này:

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

    Với Windows Host chạy này:

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

    Với máy chủ Mac chạy này:

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

Điều này làm giảm kích thước vdi.


15
Đối với người tiếp theo, lệnh của tôi cuối cùng trông như thế này: "C: \ Chương trình tập tin \ Oracle \ VirtualBox \ VBoxManage.exe" sửa đổi "C: \ Users \ daniel \ VirtualBox VMs .... .... thedisk.vdi" - -compact
Daniel

36
Theo trang quản lý tiện ích Linux của zerofree ( manpages.ubfox.com/manpages/natty/man8/zerofree.8.html ), zerofree nên tốt hơn dd cho công việc này. dd sẽ không được khuyến nghị vì "nó chậm", "nó làm cho hình ảnh đĩa (tạm thời) phát triển đến mức tối đa", "nó (tạm thời) sử dụng tất cả không gian trống trên đĩa, do đó các hành động ghi đồng thời khác có thể thất bại". Zerofree có sẵn trên Ubuntu Linux thông qua apt hoặc bạn có thể tự biên dịch nó.
Dakatine

27
Thật vui khi trang chủ của zerofree nói rằng với dd ghi đồng thời khác sẽ thất bại, nhưng zerofree cần hệ thống tập tin được gắn ở chế độ chỉ đọc! * duh *
Madarco

7
Mẹo: Đặt hai lệnh trên một dòng như vậy : dd ...; rm /bigfile, điều này sẽ giảm thiểu thời gian với một đĩa đầy trong trường hợp bạn không chờ đợi ddđể hoàn thành.
jlh

21
@Dakatine Sử dụng VirtualBox 4.3.10, tệp hình ảnh đĩa không phát triển đến mức tối đa của nó. VirtualBox đủ thông minh để không bận tâm ghi tất cả các khối 0 vào đĩa vật lý.
jlh

12

Tôi đang sử dụng máy chủ Windows 7 với khách Windows, Đây là tệp bó tôi đã viết cho Compact tất cả các VDI ​​trong cây thư mục

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

Tôi đã để lại các liên kết trong các ý kiến ​​để bạn có thể (sắp xếp) cho biết cách thức hoạt động của nó.

biên tập

Chà, sau tất cả những điều đó, tôi đã thử công cụ CloneVDI và nó đã làm rất tốt trong thời gian ngắn hơn và chỉ trong một cú nhấp chuột.


5
Bạn sẽ nghĩ trên loại trang web này sẽ có một số loại cú pháp tô sáng cho DOS nhưng không. Nó trông đẹp hơn nhiều trong Notepad ++
CAD bloke

1
@CAD_bloke sẽ yêu cầu một công cụ phân tích cú pháp và khi bạn xem xét số lượng ngôn ngữ khác nhau được đăng trên SE, bạn đang xem một dự án HUGE. Chỉ cần nghĩ có bao nhiêu phiên bản và phương ngữ của DOS chẳng hạn và đó là trước khi bạn thậm chí truy cập Linux, v.v.
Caltor

Điểm rất tốt. Trớ trêu thay, nó được tô sáng trên ứng dụng iOS trao đổi ngăn xếp.
CAD bloke

2
Yeah CloneVDI là cách tốt hơn và nhanh hơn để sử dụng cá nhân
VarunAgw

6

Máy khách Debian trên máy chủ Windows sử dụng loại bỏ / TRIM.

Đây không phải là câu trả lời trực tiếp, vì tôi đang giải quyết vấn đề chứ không phải câu hỏi. Thay vì nén hình ảnh định kỳ, giải pháp này sử dụng loại bỏ để tự động loại bỏ các khối không sử dụng trong hình ảnh đĩa VM của máy chủ.

Giải pháp này yêu cầu một hệ thống tệp khách hỗ trợ TRIM liên tục. Wiki Arch Linux có một danh sách các hệ thống tập tin hỗ trợ các hoạt động TRIM .

FDE và tiền điện tử đặc biệt không được bảo hiểm, vì có những lo ngại về bảo mật và không có giải pháp nào khác cho câu hỏi này sẽ cho phép nén. Wiki Arch Linux có thông tin về các thiết bị TRIM và dm-crypt .

Về lý thuyết, điều này sẽ hoạt động cho tất cả các khách Linux trên máy chủ VBox sử dụng bộ lưu trữ VDI.

Cấu hình máy chủ

Khi VBox đã thoát và không có máy ảo nào đang chạy, hãy thêm hỗ trợ loại bỏ vào các đĩa của bạn bằng cách đặt cả hai discardnonrotationalcho mỗi đĩa trong tệp cấu hình cho VM. Tại thời điểm discardnày không có trong GUI, nhưng nonrotationalđược hiển thị dưới dạng hộp kiểm "Ổ đĩa trạng thái rắn". (ref: diễn đàn vbox, loại bỏ hỗ trợ )

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

Khởi động VM lên và xác minh rằng hỗ trợ TRIM đã được bật:

sudo hdparm -I /dev/sda | grep TRIM

Cấu hình khách

Nếu LVM đang được sử dụng, hãy thay đổi cài đặt loại bỏ trong /etc/lvm/lvm.conf. (ref: wiki debian, ví dụ lvm.conf )

devices {
...
    issue_discards = 1
}

Trong fstab, thêm discardtùy chọn vào các hệ thống tệp bạn muốn tự động loại bỏ (ref: debian wiki, ví dụ 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

Kể lại các hệ thống tập tin để yêu cầu chúng chọn các tùy chọn mới.

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

Cắt thủ công khối miễn phí bây giờ với fstrim. fstrimsử dụng hệ thống tập tin được gắn kết, không phải thiết bị khối sao lưu nó. Thay vì thiết lập loại bỏ liên tục fstab, điều này có thể được thực hiện trên một cron hàng tuần. (Các cron hàng tuần được khuyến khích cho ổ SSD vật lý có thể có hỗ trợ đáng ngờ cho TRIM, nhưng điều này là không liên quan ở đây kể từ SSD cơ bản được xử lý bởi hệ điều hành máy chủ xem:. Cảnh báo cắt ssd ).

fstrim /
fstrim /build

Tại thời điểm này, kích thước của các hệ thống tệp bên trong VM và kích thước của hình ảnh VM sẽ khá gần nhau về giá trị.

Đã thử nghiệm với:

  • Khách1: Debian 8.7, kernel: linux 4.8 grsec từ backport, filesystem: ext4
  • Khách2: Debian 9 RC2, kernel: linux 4.9, hệ thống tập tin: ext4
  • Máy chủ1: VBox 5.1,14, Win7, hình ảnh fmt: VDI
  • Máy chủ2: VBox 5.1.14, Win8.1, hình ảnh fmt: VDI

2

Đối với khách MacOS, hãy làm điều này:

  1. Nullify không gian trống trong hệ thống khách:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (thay thế / Tập / Macintosh HD bằng tên ổ đĩa của bạn)

  2. Tắt máy khách VM

  3. Chạy lệnh này để giảm kích thước hình ảnh đĩa VDI

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

    HOẶC LÀ

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

1

Tôi sử dụng điều này cho hình ảnh VDI của tôi được gắn vào Debian ảo trong Windows VirtualBox. Đó không phải là một giải pháp chung, nhưng ít nhất nó sẽ cung cấp cho bạn ý chính về những gì tôi làm.

Các lệnh trong Debian:

root@debian:~# lsblk  # show partitions
TÊN MAJ: MIN RM KÍCH THƯỚC RO LOẠI MOUNTPOINT 
sdb 8:16 0 128G 0 đĩa 
└─sdb1 8:17 0 128G 0 phần / mnt / web # ĐÂY LÀ PHẦN THAM GIA CỦA LÃI!
sda 8: 0 0 64G 0 đĩa 
├─sda1 8: 1 0 61,4G 0 phần / 
├─sda2 8: 2 0 1K 0 phần 
└─sda5 8: 5 0 2,7G 0 phần 
[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

Các lệnh trong Windows:

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

Hy vọng nó giúp :)


1

Tôi không muốn kích hoạt hỗ trợ TRIM trong HĐH, vì mọi thao tác xóa dữ liệu sẽ buộc nén dữ liệu trong tệp VDI, khiến hệ thống khách không thể sử dụng được khi tệp VDI nằm trên đĩa quay cổ điển. Đối với tôi tốt hơn là thực hiện nén bằng tay, ví dụ mỗi tháng một lần.

Trong quá trình nén thông thường, nội dung tệp VDI được sao chép sang tệp mới. Điều này đòi hỏi một số không gian (đôi khi lớn) trên đĩa máy chủ.

Tôi đã có giải pháp tương tự như được chỉ ra bởi Andrew Domaszek. Nó hoạt động rất tốt ngay cả với NTFS (Windows10).

Để làm điều này:

  • tạo máy ảo mới khởi động với GParted Live CD (bạn có thể sử dụng bản phân phối Linux yêu thích của mình).
  • Chỉnh sửa cài đặt máy và đặt bộ điều khiển đĩa SATA
  • Thêm các tệp VDI hiện có mà bạn muốn thu gọn
  • Thay đổi đĩa dựa trên VDI để hiển thị dưới dạng SSD có hỗ trợ 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
    
  • khởi động máy

  • Trong Linux root shell, gắn kết phân vùng NTFS mount /dev/sda2 /mnt
  • không gian trống dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • buộc nén VDI mà không tạo tệp mới: fstrim -v /mnt

0

Một mẹo rất gọn gàng để bổ sung cho câu trả lời được chấp nhận là bạn có thể thoát khỏi mà không cần thực hiện bất kỳ việc nén nào sau khi xóa không gian khách, bằng cách sử dụng hệ thống tệp nén trên máy chủ (ví dụ: chọn nén thư mục ổ đĩa ảo trên các thuộc tính NTFS trên Máy chủ Windows). Trên thực tế, điều này có lợi cho việc tiết kiệm nhiều dung lượng hơn vì các hệ điều hành có xu hướng chứa nhiều tệp văn bản hoặc tệp nhị phân lặp đi lặp lại (ví dụ: ổ đĩa khách 30 GB có dung lượng trống 15 GB có thể chuyển sang 4GB trên ổ đĩa máy chủ).

Hãy cẩn thận bao gồm rằng truy cập ổ đĩa trên phần cứng thực có thể tăng và sử dụng CPU tăng nhẹ.


0

LƯU Ý QUAN TRỌNG CHO HỆ THỐNG PHÁP LÝ (~ 1997-2007)

Nói chung, các kỹ thuật trong các câu trả lời trước đây là hợp lệ; TUY NHIÊN, có một trường hợp đặc biệt rất quan trọng.

Trong một khoảng thời gian vài năm - có lẽ 1997-2007 hoặc lâu hơn-- hệ điều hành 32 bit vẫn là chuẩn mực, nhưng các đĩa cứng lớn hơn 2GB đã được sử dụng. Kết quả là, khi cố gắng tiêu thụ hết dung lượng trống bằng cách viết một tệp số 0 (phải luôn luôn được thực hiện dưới dạng root, để bao gồm không gian trống đặc quyền của root, mà không ai có thể chạm vào), bạn có thể thấy:

Tệp quá lớn

thay vì những gì bạn mong đợi:

Không còn chỗ trống trên thiết bị.

Nếu điều này xảy ra, rất có thể bạn đã đạt giới hạn kích thước tệp 2GB. Điều này là phổ biến tại thời điểm đó vì nhiều thao tác tệp đã trả về kết quả trong các số nguyên 32 bit đã ký, do đó các giá trị âm có thể báo cáo mã lỗi. Điều này có nghĩa là kết quả bù được giới hạn ở mức 2 ^ 31 byte mà không cần các biện pháp đặc biệt.

Cách giải quyết rất đơn giản: tiếp tục tạo các tệp zeroing riêng biệt, được đặt tên khác nhau cho đến khi đĩa thực sự hết dung lượng.

Nếu bạn là người hướng dẫn muốn chứng minh tình huống này cho một lớp, hình ảnh đĩa 4GB với bản sao cũ của Red Hat Linux 7.0 là đủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.