वर्चुअल मशीन डिस्क का आकार कैसे बदलें?


23

वैसे भी वर्चुअल मशीन की डिस्क का आकार बदलने के लिए क्या है? कहते हैं कि डिस्क का आकार 32GB से बढ़ाकर 64GB करें। मैं Ubuntu सर्वर 11.10 64bit पर KVM / Qemu चला रहा हूं। धन्यवाद।

जवाबों:


27

डेबियन आधारित डिस्ट्रो पर आपको virt-resizeइसके बजाय उपयोग करना चाहिए । यह हुड के तहत अब सब कुछ बहुत संभालती है। मान लें कि आपकी छवि को Win7 कहा जाता है (क्यों नहीं?)। पहली बात यह सुनिश्चित करें कि आपका VM बंद है:

उपकरण स्थापित करें:

# apt-get install libguestfs-tools

अपने VM डिस्क का स्थान प्राप्त करें:

# virsh dumpxml Win7 | xpath -e /domain/devices/disk/source
Found 2 nodes in stdin:
-- NODE --
<source file="/var/lib/libvirt/images/Win7.img" />
-- NODE --
<source file="/var/lib/libvirt/images/Win7.iso" />

आपको /var/lib/libvirt/images/Win7.imgनिम्नलिखित में अनुकूलन करने की आवश्यकता हो सकती है :

# virt-filesystems --long --parts --blkdevs -h -a /var/lib/libvirt/images/Win7.img
Name       Type       MBR  Size  Parent
/dev/sda1  partition  07   100M  /dev/sda
/dev/sda2  partition  07   32G   /dev/sda
/dev/sda   device     -    32G   -

अपनी 64G डिस्क बनाएं:

# truncate -s 64G /var/lib/libvirt/images/outdisk

आपको विस्तार करना होगा / dev / sda2 (बूट विभाजन नहीं):

# virt-resize --expand /dev/sda2 /var/lib/libvirt/images/Win7.img /var/lib/libvirt/images/outdisk
Examining /var/lib/libvirt/images/Win7.img ...
 100% [progress bar] --:--
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be resized from 32G to 64G.  The 
    filesystem ntfs on /dev/sda2 will be expanded using the 
    'ntfsresize' method.

**********
Setting up initial partition table on outdisk ...
Copying /dev/sda1 ...
Copying /dev/sda2 ...
 100% [progress bar] 00:00
 100% [progress bar] 00:00
Expanding /dev/sda2 using the 'ntfsresize' method ...

Resize operation completed with no errors.  Before deleting the old 
disk, carefully check that the resized disk boots and works correctly.

केवल मामले में एक बैकअप बनाएं (या mvयदि आप बैकअप नहीं चाहते हैं तो उपयोग करें ):

# cp /var/lib/libvirt/images/Win7.img /var/lib/libvirt/images/Win7.img.old
# mv /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/Win7.img

अब बूट!

अधिक जानकारी के लिए: मनुष्य पुण्य-आकार बदलें


3
अंतिम चरण में बैकअप बनाने के बजाय (यदि छवि बड़ी है और आप अतिरिक्त डिस्क स्थान नहीं चाहते हैं / नहीं चाहते हैं) तो आप virsh edit virt_nameडिस्क के स्रोत को नया करने के लिए पथ बदल सकते हैं और बदल सकते हैं । अगर यह काम नहीं करता है, तो बस इसे वापस बदलें और फिर से प्रयास करें। जब आप इसे 2 के साथ कर सकते हैं तो वास्तव में 3 छवियां होने का कोई मतलब नहीं है
माइक

1
या आप पहले कमांड के लिए cp के बजाय बस mv का उपयोग कर सकते हैं। डिस्क स्थान को बचाने के अलावा, यह नाटकीय रूप से इस तरह से तेज होगा।
केविन कीन

6
नोटिस करने के लिए एक महत्वपूर्ण बात यह है कि भले ही मूल छवि एक प्रकार की हो, गंतव्य उदाहरण rawटाइप होगा । यदि आप उदाहरण के qcow2प्रकार के लिए बनाए रखना चाहते हैं , तो आपको एक रूपांतरण लागू करना चाहिए जैसे:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
logoff

1
और पुण्य-आकार भी एक प्यारा ncurses प्रगति स्पिनर है।
डेविड मैकनील

18

मैं यह करने से पहले सलाह देता हूं कि आप डिस्क छवि की पूरी प्रतिलिपि लें जैसा कि यह है, फिर जब यह सब टूट जाता है तो आप इसे शुरू करने के लिए वापस कॉपी कर सकते हैं।

वहाँ 3 चीजें आप की जरूरत है:

1) डिस्क की छवि को बड़ा करें। आपके मेजबान में:

qemu-img resize foo.qcow2 +32G

अब आपका अतिथि एक बड़ी डिस्क देख सकता है, लेकिन अभी भी पुराने विभाजन और फाइल सिस्टम हैं।

2) डिस्क छवि के अंदर विभाजन को बड़ा करें। आपको इसके लिए अपने अतिथि में LiveCD से बूट करने की आवश्यकता है, क्योंकि आप एक माउंटेड विभाजन के साथ गड़बड़ नहीं कर पाएंगे। यह काफी शामिल है और शायद सबसे खतरनाक हिस्सा है। यहाँ नकल करना काफी है, इसलिए मैं अभी के बदले लिंक करूँगा। आप ऐसा कुछ करना चाहते हैं:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

या 2 बी) यदि आप अधिक भंडारण स्थान चाहते हैं तो एक नया विभाजन बनाना सरल (और सुरक्षित) होगा। Fdisk या cfdisk का उपयोग करें, या जो कुछ भी आप सहज महसूस करते हैं - आपको अब अपने अतिथि डिस्क पर अनलॉक्ड स्थान का एक पूरा गुच्छा देखना चाहिए।

3) अंत में, यदि आपने अपने मौजूदा विभाजन का आकार बदल लिया है, तो नए बड़े विभाजन के अंदर फाइलसिस्टम को बड़ा बनाएं (यह वास्तव में वैसे भी जुड़े हुए गाइड में है)। अपने मेहमान के अंदर:

resize2fs /dev/sda1

त्वरित उत्तर के लिए धन्यवाद। यह एक व्यवहार्य समाधान जैसा दिखता है। मैं कुछ दिनों के लिए शहर से बाहर हो जाऊंगा, लेकिन एक बार जब मैं अगले सप्ताह वापस आऊंगा, तो मैं इसे आजमाऊंगा और काम करूंगा।
टोंग वांग

1
एक और सवाल: अगर मैं डिस्क को सिकोड़ना चाहता हूं, तो क्या मैं उलटे क्रम में कदम उठाता हूं? जैसे: 1. फ़ाइल सिस्टम को सिकोड़ें; 2. विभाजन को सिकोड़ें; 3. डिस्क छवि को सिकोड़ें। सही?
टोंग वांग

हां, resize2fs बढ़ने के साथ-साथ सिकुड़ भी सकते हैं, लेकिन यह स्पष्ट रूप से फाइल सिस्टम में पर्याप्त खाली स्थान की आवश्यकता होगी। विभाजन को सिकोड़ते समय मैं आवश्यकता से अधिक छोड़ने पर गलत हो जाता हूं ताकि आप गलती से फाइल सिस्टम को समाप्त न कर दें :)
सीज़ियम

एक साथ आप बिल्कुल CAN गड़बड़ भाग माउंट
etherous

4

मुझे लगता है कि सीज़ियम का जवाब ठीक है, मैं यही बात हासिल करने के लिए कुछ अन्य कमांड लिखना चाहूंगा।

मान लें कि आपके पास एक disk.imgडिस्क छवि वाली फ़ाइल है , अर्थात इसमें एक विभाजन तालिका और एक या अधिक विभाजन हैं, और कहते हैं कि आप अंतिम विभाजन को बड़ा बनाना चाहते हैं। आपको क्या करना है

1) पूरी फाइल को बड़ा बनाओ, 4GiB कहो। इसका उपयोग करने का एक त्वरित तरीका हैdd

dd if=/dev/zero of=disk.img bs=1c seek=4G count=0

2) fdisk का उपयोग करके विभाजन को बड़ा करें (काश कि मैं यह जुदाई या कुछ अच्छे उपकरण में कर सकता ... किसी को भी)?

fdisk disk.img

pविभाजन तालिका को प्रिंट करने और अपने विभाजन के प्रारंभ क्षेत्र को देखने के लिए टाइप करें, उदाहरण के लिए विभाजन 2 सेक्टर 106496 पर शुरू होता है।

आप क्या करेंगे कि विभाजन तालिका से उस विभाजन को हटा दें और एक नया विभाजन बनाएं जो ठीक उसी क्षेत्र में शुरू होता है लेकिन बाद में समाप्त होता है। तब विभाजन में एक मान्य फ़ाइल सिस्टम होगा।

dहटाने के लिए विभाजन नंबर टाइप करें और दें। (Gulp!)

टाइप करें nऔर वांछित विभाजन संख्या दें, और फिर प्रारंभ क्षेत्र। आप उसी स्टार्ट सेक्टर का उपयोग करना चाहते हैं जैसा पहले इस्तेमाल किया गया था। अंत में अंतिम क्षेत्र दें या बस fdisk को उस उच्चतम क्षेत्र को चुनें जो आप उपयोग कर सकते हैं।

wडिस्क छवि फ़ाइल में वापस परिवर्तन लिखने के लिए टाइप करें, और fdisk से बाहर निकलें।

3) अब आपको फाइल सिस्टम का आकार बदलने की आवश्यकता है। इसके लिए आपको डिस्क छवि के अंदर (=) स्थिति फ़ाइल सिस्टम की ऑफसेट की आवश्यकता है। यदि आप सेक्टर आकार (जो आमतौर पर 512 है) को जानते हैं, या आप उपयोग कर सकते हैं, तो आप सेक्टर संख्या से इसकी गणना कर सकते हैंparted

parted disk.img u b p

( partedकमांड लाइन आर्ग्युमेंट के रूप में कमांड ले सकते हैं, इसलिए इसका मतलब है 'यूनिट बाइट्स' और 'प्रिंट', इसलिए यह पार्टीशन टेबल को प्रिंट करता है और बाइट्स को साइज यूइंट के रूप में इस्तेमाल करता है।)

यह विभाजन शुरू करता है और समाप्त होता है। यह कहें कि आपका विभाजन 54525952 से शुरू होता है, तब आप एक लूपबैक ब्लॉक डिवाइस बनाते हैं losetup

losetup -f --show -o 54525952 disk.img 

losetupउदाहरण के लिए, आपको बताया गया है कि यह किस देवता को चुना गया /dev/loop0। अब आप उपयोग कर सकते हैं resize2fs:

resize2fs /dev/loop0

और अंत में लूप डिवाइस को हटा दें

losetup -d /dev/loop0

2

सबसे अच्छा समाधान यहाँ पाया गया है:

http://www.linux-kvm.com/content/how-resize-your-kvm-virtual-disk

मुझे लगता है कि @Caassium ने जो कहा है वह उपरोक्त आधिकारिक लिंक से दिया गया है

मुझे उम्मीद है कि इससे सहायता मिलेगी।

3 चरण:

1.qemu-img resize windows.qcow2 +5GB

2.GParted live cd to resize

3.reboot and use os tools to resize

सरल उत्तर के लिए धन्यवाद। मेरे लिए उबंटू में 16.04 पर काम किया
फिल जू

-1
#include <stdio.h>

static unsigned long auxfilesize(FILE* fp) {

    unsigned long len=0;
    int c=0;


    while ( (c = fgetc(fp)) != -1 ) {
        len++;
    }

    return len;
}


static unsigned long aux_copyNBytesFromTo(FILE* from, FILE* to,
                                    unsigned long fromSize, 
                                    unsigned long bytes) {

    unsigned long iter = 0;
    while ( iter++ < fromSize ) {
        int c = fgetc(from);
        fputc(c, to);

    }
    iter-=1; 
    if ( fromSize < bytes ) {
        while ( iter++ < bytes ) {
            fputc(0, to);
        }
    }
    return iter;
}


int main(int argc, char **argv) {
    FILE *from = fopen(argv[1], "rb");
    FILE *to = fopen(argv[2], "wb" );
    unsigned long l = auxfilesize(from);

    rewind(from); 

    aux_copyNBytesFromTo(from, to, l, (l + l/2)) ;

    fclose(from);
    fclose(to);

}

यह सरल प्रोग्राम वर्चुअल छवि के अंत में एन बाइट्स जोड़ता है। मैंने नई बनाई गई छवियों को मर्ज करने के लिए विंडोज एक्सपी के लिए पैरागॉन विभाजन छवि का उपयोग किया। यहाँ ठीक काम करता है।


अप्रयुक्त स्थैतिक कार्य 'ऑक्सफाइलिज़', 'ऑक्स_कोपीएनबाइट्सफ्रॉम'। वह मदद क्यों करे?
एबी

अप्रयुक्त? मैं सवाल नहीं समझता। इन दोनों का उपयोग किया जाता है।
इलियान जैपिरानोव

परिणाम ओएस के लिए एक अनलॉक्ड बाइट्स और एक नया हार्ड ड्राइव है। आपको इसे फॉर्मेट करना होगा। यदि आप पूछ रहे हैं कि फू-एस स्थिर क्यों हैं। यह सिर्फ मुझे प्रोटोटाइप और क्यों नहीं बचाया। यह मेरे खाली समय में 2 मिनट में लिखा गया एक सरल कार्यक्रम है :) विशेष या इष्टतम कुछ भी नहीं है।
इलियान जैपिरानोव

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