VirtualBox के VDI फ़ाइल आकार को कैसे कॉम्पैक्ट करें?


301

मेरे पास एक वर्चुअलबॉक्स वीएम है जो बहुत बड़ी हार्ड डिस्क आकार (होस्ट से बड़ा) को कॉन्फ़िगर करता है। मेरी गलती से, वीएम पर एक प्रोग्राम ने बहुत सारी लॉग फाइलें पैदा कीं और VDI फाइल का आकार तब तक बढ़ता रहा जब तक कि मेजबान पर कोई जगह नहीं है।

अब मैंने लॉग फ़ाइलों को हटा दिया है, लेकिन VDI फ़ाइल का आकार उपयोग करने के बाद छोटा नहीं हो रहा है VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

वहाँ वास्तव में VDI फ़ाइल आकार कॉम्पैक्ट करने के लिए एक रास्ता है? धन्यवाद!

जवाबों:


507

आपको निम्न चरण करने होंगे:

  1. अतिथि में डीफ़्रैग चलाएं (केवल 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 अतिथि के साथ , Sysinternals से SDelete डाउनलोड करें और इसे चलाएं:

    sdelete.exe c: -z
    

    (सी की जगह: वीडीआई के ड्राइव अक्षर के साथ)

  3. अतिथि VM को बंद करें

  4. अब विकल्प के modifymediumसाथ VBoxManage की कमांड चलाएँ --compact:

    लिनक्स होस्ट के साथ इसे चलाएं:

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

    Windows होस्ट के साथ इसे चलाएं:

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

    मैक होस्ट के साथ इसे चलाएं:

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

यह वीडी के आकार को कम करता है।


14
अगले व्यक्ति के लिए, मेरी कमान इस तरह दिख रही है: "C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" Revhd "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -कंपैक्ट
डैनियल

36
ज़ीरोफ्री लिनक्स यूटिलिटी मैनपेज ( manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html ) के अनुसार, zerofree इस नौकरी के लिए dd से बेहतर होना चाहिए । dd की अनुशंसा नहीं की जाएगी क्योंकि "यह धीमा है", "यह डिस्क छवि बनाता है (अस्थायी रूप से) इसकी अधिकतम सीमा तक बढ़ता है", "यह (अस्थायी रूप से) डिस्क पर सभी खाली स्थान का उपयोग करता है, इसलिए अन्य समवर्ती लेखन क्रियाएं विफल हो सकती हैं"। Zerofree उबंटू लिनक्स पर apt के माध्यम से उपलब्ध है , या आप इसे स्वयं संकलित कर सकते हैं।
डेकाटाइन

27
यह मज़ेदार है कि ज़ीरोफ्री का मैनपेज बताता है कि dd के साथ अन्य समवर्ती लेखन विफल हो जाएंगे, लेकिन ज़ेरोफ्री को केवल पढ़ने के लिए फाइलसिस्टम की आवश्यकता है! * डुह *
मदारको

7
युक्ति: दो आदेशों को एक पंक्ति में रखें जैसे: dd ...; rm /bigfileयह, पूर्ण डिस्क के साथ समय कम कर देगा यदि आप ddपूरा होने की प्रतीक्षा नहीं कर रहे हैं ।
jlh

21
@Datatine वर्चुअलबॉक्स 4.3.10 का उपयोग करते हुए, डिस्क छवि फ़ाइल इसकी अधिकतम सीमा तक नहीं बढ़ी । वर्चुअलबॉक्स सभी शून्य ब्लॉकों को भौतिक डिस्क पर लिखने के लिए परेशान नहीं करने के लिए पर्याप्त चतुर है।
jlh

12

मैं विंडोज 7 मेहमानों के साथ विंडोज 7 होस्ट पर हूं, यहां एक बैच फाइल है जिसे मैंने एक फ़ोल्डर ट्री में सभी वीडीआई को कॉम्पैक्ट करने के लिए लिखा है

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
आपको लगता है कि इस तरह की साइट पर डॉस के लिए किसी तरह का सिंटैक्स हाइलाइट होगा लेकिन नहीं। यह नोटपैड ++ में बहुत प्रीतिकर लगता है
सीएडी

1
@CAD_bloke जिसे एक पार्सिंग इंजन की आवश्यकता होती है और जब आप एसई पर तैनात विभिन्न भाषाओं की संख्या पर विचार करते हैं तो आप एक बड़ी परियोजना को देख रहे हैं। जरा सोचो कि DOS के कितने संस्करण और बोलियाँ हैं, उदाहरण के लिए और इससे पहले कि आप लिनक्स आदि पर भी पहुँच जाएँ
Caltor

बहुत अच्छी बात है। विडंबना यह है कि स्टैक एक्सचेंज आईओएस ऐप पर प्रकाश डाला गया है।
सीएडी

2
हाँ CloneVDI व्यक्तिगत उपयोग के लिए बहुत बेहतर और तेज़ तरीका है
वरुणअगव

6

त्याग / TRIM का उपयोग करते हुए विंडोज होस्ट पर डेबियन अतिथि।

यह प्रत्यक्ष उत्तर प्रति नहीं है, क्योंकि मैं समस्या को संबोधित कर रहा हूं, सवाल नहीं। समय-समय पर छवि को संकुचित करने के बजाय, यह समाधान मेजबान की वीएम डिस्क छवि में अप्रयुक्त ब्लॉकों को स्वचालित रूप से हटाने के लिए त्याग का उपयोग करता है।

इस समाधान के लिए एक अतिथि फाइल सिस्टम की आवश्यकता होती है जो निरंतर TRIM का समर्थन करता है। आर्क लिनक्स विकी में TRIM संचालन का समर्थन करने वाले फाइल सिस्टम की एक सूची है

FDE और क्रिप्टोरूट को विशेष रूप से कवर नहीं किया गया है, क्योंकि सुरक्षा चिंताएं हैं और इस प्रश्न का कोई अन्य समाधान कॉम्पैक्ट करने की अनुमति नहीं देगा। आर्क लिनक्स विकी में TRIM और dm-crypt डिवाइस के बारे में जानकारी है

सिद्धांत रूप में, यह VDI स्टोरेज का उपयोग करके VBox होस्ट पर सभी लिनक्स मेहमानों के लिए काम करेगा।

होस्ट कॉन्फ़िगरेशन

VBox के साथ बाहर निकलने और कोई VMs नहीं चल रहा है, VM के लिए कॉन्फ़िगरेशन फ़ाइल में दोनों discardऔर nonrotationalप्रत्येक डिस्क के लिए सेटिंग करके अपने डिस्क पर समर्थन छोड़ दें । इस समय 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। (रेफ: डेबियन विकी, lvm.conf उदाहरण )

devices {
...
    issue_discards = 1
}

Fstab में, उन फाइलों discardके सिस्टम में विकल्प जोड़ें जिन्हें आप स्वतः-त्यागना चाहते हैं (Ref: 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

अब के साथ मैन्युअल रूप से मुक्त ब्लॉक ट्रिम fstrimfstrimमाउंटेड फाइल सिस्टम का उपयोग करता है, न कि इसे ब्लॉक करने वाले डिवाइस का। इसमें लगातार हार को सेट करने के बजाय fstab, यह साप्ताहिक क्रोन पर किया जा सकता है। (शारीरिक क्रैड के लिए साप्ताहिक क्रोन की सिफारिश की जाती है जिसमें टीआरआईएम के लिए संदिग्ध समर्थन हो सकता है, लेकिन यह प्रासंगिक नहीं है क्योंकि अंतर्निहित एसएसडी को होस्ट ओएस द्वारा नियंत्रित किया जाता है। देखें: एसएसडी ट्रिम चेतावनी )।

fstrim /
fstrim /build

इस बिंदु पर, VM के अंदर फ़ाइल सिस्टम का आकार और VM छवियों का आकार मूल्य में बहुत करीब होना चाहिए।

के साथ परीक्षण किया गया:

  • Guest1: डेबियन 8.7, कर्नेल: बैकपॉक्स से लिनक्स 4.8 ग्रामसे, फाइलसिस्टम: ext4
  • Guest2: डेबियन 9 RC2, कर्नेल: लिनक्स 4.9, फाइलसिस्टम: ext4
  • Host1: VBox 5.1.14, Win7, छवि fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, छवि fmt: VDI

2

के लिए MacOS अतिथि ऐसा करते हैं:

  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
    

1

मैं अपनी VDI छवि को Windows VirtualBox में वर्चुअल डेबियन के लिए मुहैया कराता हूं। यह एक सामान्य समाधान नहीं है, लेकिन यह आपको कम से कम मुझे क्या करना है, इसका संकेत देना चाहिए।

डेबियन में कमांड:

root@debian:~# lsblk  # show partitions
NAME MAJ: MIN RM SIZE RO TYPE MOUNTPOINT 
एसडीबी 8:16 0 128 जी 0 डिस्क 
└─sdb1 8:17 0 128G 0 part / mnt / web # इस रुचि का हिस्सा है!
sda 8: 0 0 64G 0 डिस्क 
0sda1 8: 1 0 61,4G 0 भाग / 
Partsda2 8: 2 0 1K 0 भाग 
0sda5 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

विंडोज में कमांड:

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

आशा है ये मदद करेगा :)


1

मैं OS में TRIM समर्थन को सक्षम नहीं करना चाहता, क्योंकि हर डेटा विलोपन VDI फ़ाइल में डेटा कॉम्पैक्टिंग को मजबूर कर देगा, जब VDI फ़ाइल क्लासिक घूर्णी डिस्क पर है, जो अतिथि सिस्टम को अनुपयोगी बनाती है। मेरे लिए बेहतर है कि आप हर महीने एक बार हाथ से कॉम्पैक्टिंग करें।

सामान्य कॉम्पैक्टिंग के दौरान, VDI फ़ाइल सामग्री को नई फ़ाइल में कॉपी किया जाता है। इसके लिए होस्ट डिस्क पर कुछ (कभी-कभी बड़े) खाली स्थान की आवश्यकता होती है।

मेरे पास एंड्रयू डॉमासेक द्वारा बताए गए समाधान के समान है। यह NTFS (Windows10) के साथ भी बहुत अच्छा काम करता है।

यह करने के लिए:

  • GParted Live CD के साथ बूट करने वाली नई वर्चुअल मशीन बनाएं (आप अपने पसंदीदा लिनक्स डिस्ट्रो का उपयोग कर सकते हैं)।
  • मशीन सेटिंग्स संपादित करें और SATA डिस्क नियंत्रक सेट करें
  • मौजूदा VDI फाइलें जोड़ें जिन्हें आप कॉम्पैक्ट करना चाहते हैं
  • TRD समर्थन के साथ SSD के रूप में दृश्यमान VDI आधारित डिस्क बदलें:

    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

0

स्वीकार किए गए उत्तर को पूरक करने के लिए एक बहुत ही साफ-सुथरी चाल है कि आप मेजबान स्थान पर एक संपीड़ित फ़ाइल सिस्टम का उपयोग करके (जैसे कि NTFS गुणों पर वर्चुअल ड्राइव के फ़ोल्डर को संपीड़ित करने के लिए चयन करके, अतिथि स्थान को शून्य करने के बाद किसी भी कॉम्पैक्टिंग के बिना कर सकते हैं) विंडोज होस्ट)। यह वास्तव में एक बहुत अधिक स्थान बचाने के लिए लाभ है क्योंकि ऑपरेटिंग सिस्टम बहुत दोहराव वाले पाठ या बाइनरी फ़ाइलों को पकड़ते हैं (उदाहरण के लिए एक 30GB अतिथि ड्राइव जिसमें 15GB स्थान शून्य था मेजबान ड्राइव पर 4GB में बदल सकता है)।

कैविट्स में शामिल है कि वास्तविक हार्डवेयर पर ड्राइव का उपयोग बढ़ सकता है और सीपीयू के उपयोग में मामूली वृद्धि होती है।


0

विरासत के लिए महत्वपूर्ण नोट (~ 1997-2007) ऑपरेटिंग सिस्टम

सामान्य तौर पर, पहले दिए गए उत्तरों में तकनीक मान्य हैं; फिर भी, एक बहुत महत्वपूर्ण मामला है।

कुछ वर्षों की अवधि के लिए - शायद 1997-2007 या तो - 32-बिट ऑपरेटिंग सिस्टम अभी भी आदर्श थे, लेकिन 2 जीबी से बड़े हार्ड डिस्क पहले से ही उपयोग में थे। नतीजतन, जब शून्य की एक फ़ाइल लिखकर सभी खाली स्थान का उपभोग करने का प्रयास किया जाता है (जो हमेशा रूट के रूप में किया जाना चाहिए, रूट के विशेषाधिकार प्राप्त मुक्त स्थान को शामिल करने के लिए, जिसे कोई और नहीं छू सकता है), आप देख सकते हैं:

बहुत बड़ी फाइल

इसके बजाय आप क्या उम्मीद करते हैं:

डिवाइस पर जगह समाप्त।

यदि ऐसा होता है, तो आप सबसे अधिक संभावना है कि 2GB फ़ाइल का आकार सीमित हो। यह उस समय सामान्य था क्योंकि कई फ़ाइल संचालन ने हस्ताक्षर किए गए 32-बिट पूर्णांक में परिणाम लौटाए, ताकि नकारात्मक मान त्रुटि कोड की रिपोर्ट कर सकें। इसका प्रभावी रूप से मतलब था कि ऑफसेट परिणाम विशेष उपायों के बिना 2 ^ 31 बाइट्स तक सीमित थे।

वर्कअराउंड सीधा है: जब तक डिस्क वास्तव में अंतरिक्ष से बाहर नहीं जाती है तब तक अलग-अलग, अलग-अलग नामकरण वाली फ़ाइलों को बनाते रहें।

यदि आप कक्षा के लिए इस स्थिति को प्रदर्शित करने के लिए एक प्रशिक्षक हैं, तो Red Hat Linux 7.0 की एक पुरानी प्रति के साथ 4GB डिस्क छवि पर्याप्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.