سؤال كيفية ضغط حجم ملف VDI الخاص بـ VirtualBox؟


لدي VirtualBox VM الذي قام بتكوين حجم قرص ثابت كبير جدًا (أكبر من المضيف). عن طريق الخطأ ، برنامج على VM ولدت الكثير من ملفات السجل وحجم ملف VDI يحافظ على النمو حتى لا توجد مساحة على المضيف.

الآن لقد قمت بحذف ملفات السجل ولكن حجم ملف VDI لا تصبح أصغر بعد استخدام VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

هل هناك طريقة لضغط حجم ملف VDI حقا؟ شكر!


279
2018-01-07 03:41


الأصل




الأجوبة:


يجب عليك القيام بالخطوات التالية:

  1. تشغيل defrag في الضيف (Windows فقط)
  2. إبطال المساحة الخالية:

    مع ضيف لينكس تشغيل هذا:

    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
    

    مع ضيف ويندوز، تحميل من SDelete من Sysinternals وتشغيل هذا:

    sdelete.exe c: -z
    

    (استبدل C: بحرف محرك أقراص VDI)

  3. اغلاق الضيف VM

  4. الآن قم بتشغيل VBoxManage modifymedium الأمر مع --compact اختيار:

    مع مضيف لينوكس تشغيل هذا:

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

    مع ويندوز المضيف تشغيل هذا:

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

    مع ماك المضيف تشغيل هذا:

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

هذا يقلل من حجم vdi.


469
2018-01-07 05:05



بالنسبة إلى الشخص التالي ، انتهى الأمر بأعلى يبدو كالتالي: "C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" modify "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -المدمج - Daniel
وفقا لصفحة zerofree Linux فائدة (manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html) ، يجب أن يكون zerofree أفضل من دد من أجل هذه الوظيفة. دد لا يوصى به لأنه "بطيء" ، "يجعل صورة القرص (مؤقتًا) تنمو إلى أقصى حد لها" ، "يستخدم (مؤقتًا) كل المساحة الحرة على القرص ، لذا قد تفشل إجراءات الكتابة المتزامنة الأخرى". Zerofree متاح على Ubuntu Linux عبر ملائمأو يمكنك تجميعها بنفسك. - Dakatine
انها متعة أن manpage من zerofree تنص على ذلك مع دد ستفشل عمليات الكتابة المتزامنة الأخرى ، لكن zerofree يحتاج إلى نظام الملفات ليتم تثبيته للقراءة فقط! * دوه * - Madarco
نصيحة: ضع الأمرين في سطر واحد كما يلي: dd ...; rm /bigfileهذا يقلل من الوقت مع قرص كامل في حالة انت لا تنتظر dd لإكمال. - jlh
Dakatine باستخدام فيرتثلبوإكس 4.3.10 ، فعلت ملف صورة القرص لا تنمو إلى أقصى حد. فيرتثلبوإكس ذكي بما فيه الكفاية لعدم إزعاج كتابة جميع كتل الصفر إلى القرص الفعلي. - jlh


إذا كان تشغيل الأمر في الإجابة المقبولة ينتج رسالة خطأ غير مفيدة مثل هذا

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

ببساطة قم بتشغيل الأمر بواسطة UUID بدلاً من اسم الملف:

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

35
2018-06-18 07:20





أنا على مضيف Windows 7 مع ضيوف Windows ، وهنا ملف دفعي كتبت إلى ضغط كافة 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 وقام بعمل جيد في وقت أقل بكثير وبنقرة واحدة.


11
2018-01-09 10:25



قد تفكر في هذا النوع من الموقع سيكون هناك نوع من تسليط الضوء على بناء الجملة لدوس ولكن لا. يبدو أجمل بكثير في Notepad ++ - CAD bloke
CAD_bloke التي تتطلب محرك إعراب وعندما تفكر في عدد اللغات المختلفة المنشورة على SE ، فأنت تنظر إلى مشروع ضخم. فقط فكر في عدد الإصدارات واللهجات الخاصة بـ DOS على سبيل المثال ، وقبل أن تصل إلى Linux إلخ. - Caltor
نقطة جيدة جدا. من المفارقات ذلك هو أبرزها في تطبيق iOS لتبادل المكدس. - CAD bloke
نعم CloneVDI هي طريقة أفضل وأسرع بكثير للاستخدام الشخصي - VarunAgw


ضيف دبيان على مضيف ويندوز باستخدام تجاهل / TRIM.

هذه ليست إجابة مباشرة في حد ذاتها ، لأنني أعالج المشكلة وليس السؤال. بدلاً من ضغط الصورة بشكل دوري ، يستخدم هذا الحل إلغاء تلقائيًا لإزالة الكتل غير المستخدمة في صورة قرص VM الخاص بالمضيف.

يتطلب هذا الحل نظام ملفات ضيف يدعم TRIM المستمر. الوسيطة Arch Linux لديها قائمة أنظمة الملفات التي تدعم عمليات TRIM.

لا تتم تغطية FDE و cryptoroot على وجه التحديد ، حيث توجد مخاوف أمنية ولا يسمح أي من الحلول الأخرى لهذه المسألة بالضغط أيضًا. يحتوي الوسيطة Arch Linux على معلومات حول أجهزة TRIM و dm-crypt.

نظريًا ، سيعمل هذا مع جميع ضيوف Linux على مضيفي VBox الذين يستخدمون تخزين VDI.

تكوين المضيف

مع خروج VBox وعدم تشغيل VMs ، قم بإضافة دعم تجاهل الأقراص الخاصة بك عن طريق تعيين كليهما discard و nonrotational لكل قرص في ملف التكوين لل VM. في هذا الوقت discard ليس في واجهة المستخدم الرسومية ، ولكن nonrotational في مربع اختيار "الحالة الصلبة". (المرجع: منتديات vbox ، تجاهل الدعم)

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

قم بتمهيد VM ، وتحقق من تمكين دعم TRIM:

sudo hdparm -I /dev/sda | grep TRIM

تكوين الضيف

إذا كانت LVM قيد الاستخدام ، فغيّر إعداد الإلغاء في /etc/lvm/lvm.conf. (المرجع: debian wiki، lvm.conf example)

devices {
...
    issue_discards = 1
}

في fstab ، أضف discard خيار لنظام الملفات الذي ترغب في استبعاده تلقائيًا (المرجع: ديبيان ويكي ، 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، يمكن القيام بذلك على كرون الأسبوعية. (يُنصح باستخدام كرونة الأسبوعية لمحركات أقراص الحالة الصلبة الفعلية التي قد يكون لها دعم مشكوك فيه لنظام TRIM ، ولكن هذا ليس مناسبًا هنا نظرًا لأنه يتم التعامل مع محركات الأقراص الثابتة الأساسية بواسطة نظام التشغيل المضيف. تحذير SSD تقليم).

fstrim /
fstrim /build

في هذه المرحلة ، يجب أن يكون حجم أنظمة الملفات داخل VM وحجم صور VM قريبًا جدًا من حيث القيمة.

تم اختباره مع:

  • Guest1: Debian 8.7، kernel: linux 4.8 grsec from backports، filesystem: ext4
  • Guest2: Debian 9 RC2، kernel: linux 4.9، filesystem: ext4
  • Host1: VBox 5.1.14 ، Win7 ، صورة fmt: VDI
  • Host2: VBox 5.1.14 ، Win8.1 ، صورة fmt: VDI

5
2018-02-24 16:27





إلى عن على ماكوس ضيف افعل هذا:

  1. إخلاء مساحة خالية في نظام الضيف:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (استبدال / وحدات التخزين / ماكنتوش عالية الوضوح مع اسم محرك الأقراص)

  2. اغلاق الضيف VM

  3. قم بتشغيل هذا الأمر لتقليل حجم صورة قرص VDI

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

    أو

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

2
2017-12-16 17:08





يمكنني استخدام هذا لصورة VDI الخاصة بي التي تم تحميلها إلى Debian الظاهري في Windows VirtualBox. هذا ليس حلاً عامًا ، ولكن يجب أن يمنحك على الأقل ما أفعله.

الأوامر في دبيان:

root@debian:~# lsblk  # show partitions
NAME MAJ: MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 128G 0 قرص
└─sdb1 8:17 0 128G 0 جزء / mnt / web # THIS IS THE PARTITION OF INTEREST!
إسدا 8: 0 0 64G 0 القرص
├─sda1 8: 1 0 61،4G 0 part /
├─sda2 8: 2 0 1K 0 part
└─sda5 8: 5 0 2،7G 0 الجزء
[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

الأوامر في Windows:

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

آمل أن يساعد :)


1
2018-02-05 11:31





لا أريد تمكين دعم TRIM في نظام التشغيل ، نظرًا لأن كل حذف للبيانات سيؤدي إلى ضغط البيانات في ملف VDI ، مما يجعل نظام الضيف غير قابل للاستخدام عندما يكون ملف VDI موجودًا على قرص تناوب كلاسيكي. من الأفضل بالنسبة لي أن أقوم بالضغط باليد مثل: مرة في الشهر.

أثناء الضغط العادي ، يتم نسخ محتوى ملف VDI إلى ملف جديد. يتطلب هذا بعض المساحة الحرة (أحيانًا كبيرة) على القرص المضيف.

لدي حل مشابه للإشارة إلى أندرو دوماسك. يعمل بشكل جيد للغاية حتى مع NTFS (Windows10).

لفعل هذا:

  • إنشاء جهاز ظاهري جديد يقوم بالتمهيد مع قرص GParted Live CD (يمكنك استخدام توزيعة Linux المفضلة لديك).
  • تحرير إعدادات الجهاز وتعيين وحدة تحكم القرص 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

  • بدء الجهاز
  • في قذيفة الجذر لينكس ، جبل قسم NTFS mount /dev/sda2 /mnt
  • صفر مساحة حرة dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • فرض ضغط VDI دون إنشاء ملف جديد: fstrim -v /mnt

1
2017-09-15 07:17





هناك خدعة متقنة جدًا لتكملة الإجابة المقبولة وهي أنه يمكنك الهروب دون القيام بأي ضغط على الإطلاق بعد تخصيص مساحة الضيف ، باستخدام نظام ملفات مضغوط على المضيف (على سبيل المثال ، تحديد ضغط مجلد محركات الأقراص الظاهرية على خصائص NTFS على مضيف ويندوز). هذا في الواقع لديه ميزة لتوفير مساحة أكبر لأن أنظمة التشغيل تميل إلى الاحتفاظ بالكثير من الملفات النصية أو الثنائية المتكررة (على سبيل المثال ، محرك أقراص ضيف سعة 30 غيغابايت يحتوي على 15 غيغابايت من المساحة صفر يمكن أن يتحول إلى 4 غيغابايت على محرك الأقراص المضيف).

تتضمن التحذيرات أن الوصول إلى محرك الأقراص على الأجهزة الحقيقية قد يزيد ، وهناك زيادة طفيفة في استخدام وحدة المعالجة المركزية.


0
2018-01-20 07:13