Câu hỏi Làm thế nào để nhỏ gọn kích thước tệp VDI của VirtualBox?


Tôi đã có một VirtualBox VM cấu hình một kích thước đĩa cứng rất lớn (lớn hơn host). Bởi sai lầm của tôi, một chương trình trên máy ảo đã tạo ra rất nhiều tệp nhật ký và kích thước tệp VDI tiếp tục phát triển cho đến khi không có không gian trên máy chủ lưu trữ.

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ận được 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ự nhỏ gọn kích thước tập tin VDI? Cảm ơn!


269
2018-01-07 03:41


gốc




Các câu trả lời:


Bạn phải thực hiện các bước sau:

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

    Với một Khách Linux chạy 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 một Khách Windows, tải về SDelete từ Sysinternals và chạy điều này:

    sdelete.exe c: -z
    

    (thay thế C: với ký tự ổ đĩa của VDI)

  3. Tắt máy khách

  4. Bây giờ hãy chạy VBoxManage's modifymedium lệnh với --compact Tùy chọn:

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

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

    Với một Máy chủ Windows chạy này:

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

    Với một 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.


452
2018-01-07 05:05



Đối với người tiếp theo, lệnh của tôi đã kết thúc như sau: "C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" sửa đổi "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -gọn nhẹ - Daniel
Theo trang zerofree Linux manpage (manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html), zerofree nên tốt hơn đ vì công việc này. đ sẽ không được khuyến khích 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, vì vậy 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 qua apthoặc bạn có thể tự biên dịch nó. - Dakatine
Thật thú vị là manpage của zerofree nói rằng với đ viết đồng thời khác sẽ thất bại, nhưng zerofree cần hệ thống tập tin được gắn kết chỉ đọc! * duh * - Madarco
Mẹo: Đặt hai lệnh trên một dòng như sau: 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
@Dakatine Sử dụng VirtualBox 4.3.10, tệp hình ảnh đĩa đã làm không phát triển đến mức tối đa của nó. VirtualBox là đủ thông minh để không bận tâm viết tất cả các khối không vào đĩa vật lý. - jlh


Nếu chạy lệnh trong câu trả lời được chấp nhận sẽ tạo ra một thông báo lỗi vô ích như thế này

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

Chỉ cần chạy lệnh bằng UUID thay vì tên tệp:

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

34
2018-06-18 07:20





Tôi đang ở trên một máy chủ Windows 7 với khách Windows, Đây là một tập tin batch tôi đã viết để Compact tất cả các VDI ​​trong một 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ể (loại) cho biết nó hoạt động như thế nào.

chỉnh sửa

Vâng, sau tất cả, tôi đã thử Công cụ CloneVDI và nó đã làm một công việc tốt trong thời gian ít hơn nhiều và trong một cú nhấp chuột.


11
2018-01-09 10:25



Bạn sẽ nghĩ về 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
@CAD_bloke mà 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 xét một dự án HUGE. Chỉ cần suy nghĩ có bao nhiêu phiên bản và phương ngữ của DOS có ví dụ và đó là trước khi bạn thậm chí có được để Linux, vv - Caltor
Rất tốt. Trớ trêu thay Là được đánh dấu trên ứng dụng iOS trao đổi stack. - CAD bloke
Yeah CloneVDI là cách tốt hơn và nhanh hơn để sử dụng cá nhân - VarunAgw


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 đề, không phải là câu hỏi. Thay vì định kỳ nén hình ảnh, 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ủ lưu trữ.

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

FDE và cryptoroot không được đề cập cụ thể, 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 cũng cho phép nén chặt. Arch Linux wiki có thông tin về Thiết bị TRIM và dm-crypt.

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

Cấu hình máy chủ

Với VBox đã thoát và không có máy ảo nào đang chạy, hãy thêm hỗ trợ hủy bỏ vào đĩa của bạn bằng cách đặt cả hai discard và nonrotational cho mỗi đĩa trong tệp cấu hình cho máy ảo. Tại thời điểm này discard 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, hủy hỗ trợ)

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

Khởi động máy ảo 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 hủy trong /etc/lvm/lvm.conf. (ref: Ví dụ về debian wiki, lvm.conf)

devices {
...
    issue_discards = 1
}

Trong fstab, thêm discard tùy chọn cho hệ thống tệp bạn muốn tự động hủy (ref: debian wiki, ví dụ về 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

Hãy nhớ lại các hệ thống tệp để yêu cầu họ chọn các tùy chọn mới của họ.

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

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

fstrim /
fstrim /build

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

Thử nghiệm với:

  • Guest1: Debian 8.7, kernel: linux 4.8 grsec từ backport, hệ thống tập tin: ext4
  • Khách 2: Debian 9 RC2, hạt nhân: linux 4.9, hệ thống tệp: ext4
  • Host1: VBox 5.1.14, Win7, hình ảnh fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, hình ảnh fmt: VDI

5
2018-02-24 16:27





Dành cho Khách MacOS làm cái này:

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

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (thay thế / Âm lượng / Macintosh HD bằng tên ổ đĩa của bạn)

  2. Tắt máy khách

  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
    

2
2017-12-16 17:08





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

Lệnh trong Debian:

root@debian:~# lsblk  # show partitions
NAME MAJ: LOẠI RO SIZE RM TỐI ĐA MOUNTPOINT
sdb 8:16 0 128G 0 đĩa
└─sdb1 8:17 0 128G 0 phần / mnt / web # Đây là một phần của sự quan tâm!
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,3 triệu 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

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
2018-02-05 11:31





Tôi không muốn kích hoạt hỗ trợ TRIM trong hệ điều hành, vì mọi xóa dữ liệu sẽ buộc nén dữ liệu trong tệp VDI, làm cho hệ thống khách không 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) miễn phí trên đĩa lưu trữ.

Tôi đã giải pháp tương tự như được chỉ 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 CD trực tiếp GParted (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 compact
  • Thay đổi đĩa dựa trên VDI để hiển thị dưới dạng SSD với 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

  • bắt đầu máy
  • Trong Linux root shell, mount 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 cần tạo tệp mới: fstrim -v /mnt

1
2017-09-15 07:17





Một mẹo rất gọn gàng để bổ sung câu trả lời được chấp nhận là bạn có thể lấy đi mà không làm bất kỳ nén nào sau khi zeroing dung lượng 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 thuộc tính NTFS trên Máy chủ Windows). Điều này trên thực tế có lợi ích để tiết kiệm nhiều không gian hơn bởi vì hệ điều hành có xu hướng giữ nhiều tệp nhị phân hoặc lặp lại (ví dụ: ổ đĩa 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 việc truy cập ổ đĩa trên phần cứng thực có thể tăng lên và có sự gia tăng nhẹ trong việc sử dụng CPU.


0
2018-01-20 07:13