วิธีการปรับขนาดดิสก์เครื่องเสมือน


23

อย่างไรก็ตามมีการปรับขนาดดิสก์ของเครื่องเสมือนหรือไม่ พูดการเพิ่มขนาดดิสก์จาก 32GB เป็น 64GB ฉันใช้งาน KVM / Qemu บนเซิร์ฟเวอร์ Ubuntu 11.10 64 บิต ขอบคุณ

คำตอบ:


27

สำหรับ Distro based ของ Debian คุณควรใช้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

ตอนนี้บูต!

สำหรับข้อมูลเพิ่มเติม: man virt-resize


3
แทนที่จะทำการสำรองข้อมูลในขั้นตอนสุดท้าย (หากภาพมีขนาดใหญ่และคุณไม่ต้องการ / ไม่มีพื้นที่ว่างในดิสก์เพิ่มเติม) คุณสามารถทำได้virsh edit virt_nameและเปลี่ยนเส้นทางไปยังแหล่งที่มาของดิสก์เป็นรูปแบบใหม่ ถ้าไม่ได้ผลให้เปลี่ยนกลับมาลองใหม่อีกครั้ง มีจุดไม่มากจริง ๆ ในการมี 3 ภาพเมื่อคุณสามารถทำได้ด้วย 2
ไมค์

1
หรือคุณสามารถใช้ mv แทน cp สำหรับคำสั่งแรก นอกเหนือจากการประหยัดพื้นที่ดิสก์มันจะเร็วขึ้นอย่างมากเช่นนี้
Kevin Keane

6
สิ่งสำคัญสิ่งหนึ่งที่ควรสังเกตคือแม้ว่ารูปภาพต้นทางจะมีประเภทก็ตามอินสแตนซ์ปลายทางจะเป็นrawประเภท หากคุณต้องการรักษาqcow2ประเภทอินสแตนซ์คุณควรใช้การแปลงเช่น:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
ออกจากระบบ

1
และการปรับขนาดให้ดียิ่งขึ้นก็มีความก้าวหน้าที่น่ารัก
David McNeill

18

ฉันขอแนะนำก่อนที่จะทำสิ่งนี้คุณทำสำเนาอิมเมจของดิสก์อย่างสมบูรณ์เหมือนเดิมจากนั้นเมื่อทุกอย่างหมดลงคุณสามารถคัดลอกมันกลับมาเริ่มใหม่ได้

มี 3 สิ่งที่คุณต้องทำ:

1) ทำให้ดิสก์อิมเมจใหญ่ขึ้น ในโฮสต์ของคุณ:

qemu-img resize foo.qcow2 +32G

ตอนนี้แขกของคุณสามารถเห็นดิสก์ที่ใหญ่กว่า แต่ยังมีพาร์ทิชันและระบบไฟล์เก่า

2) ทำให้พาร์ทิชันภายในภาพดิสก์ขนาดใหญ่ คุณต้องบูต LiveCD ในแขกของคุณเนื่องจากคุณจะไม่สามารถยุ่งกับพาร์ติชันที่ติดตั้ง เรื่องนี้มีส่วนเกี่ยวข้องและอาจเป็นส่วนที่อันตรายที่สุด มันค่อนข้างมากที่จะคัดลอกที่นี่ดังนั้นฉันจะเชื่อมโยงแทนตอนนี้ คุณต้องการทำสิ่งนี้:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

หรือ 2b) การสร้างพาร์ติชันใหม่นั้นจะง่ายกว่า (และปลอดภัยกว่า) หากคุณต้องการพื้นที่เก็บข้อมูลเพิ่มขึ้น ใช้ fdisk หรือ cfdisk หรืออะไรก็ตามที่คุณรู้สึกสบายใจ - คุณควรเห็นพื้นที่ทั้งหมดที่ไม่ได้ถูกจัดสรรบนดิสก์แขกของคุณตอนนี้

3) ท้ายที่สุดถ้าคุณปรับขนาดพาร์ติชั่นที่มีอยู่ให้สร้างระบบไฟล์ในพาร์ติชั่นที่ใหญ่กว่าใหม่ให้ใหญ่ขึ้น ภายในแขกของคุณ:

resize2fs /dev/sda1

ขอบคุณสำหรับคำตอบด่วน ดูเหมือนว่าทางออกที่ทำงานได้ ฉันจะออกจากเมืองสักสองสามวัน แต่เมื่อฉันกลับไปที่สำนักงานในสัปดาห์หน้าฉันจะลองและรายงานกลับถ้ามันใช้งานได้
งวัง

1
อีกหนึ่งคำถาม: หากฉันต้องการลดขนาดดิสก์ฉันจะทำตามขั้นตอนในลำดับที่กลับรายการไหม ไลค์: 1. ลดขนาดระบบไฟล์; 2. ลดขนาดพาร์ติชัน 3. ลดขนาดอิมเมจของดิสก์ ขวา?
งวัง

ใช่ resize2fs สามารถหดตัวและขยายตัวได้ แต่แน่นอนว่าจะต้องมีพื้นที่ว่างเพียงพอในระบบไฟล์ เมื่อหดตัวพาร์ทิชันฉันทำผิดพลาดในออกเล็กน้อยเกินกว่าที่จำเป็นเพื่อให้คุณไม่ได้ตั้งใจสับปลายปิดระบบแฟ้ม :)
ซีเซียม

คุณสามารถยุ่งกับพาร์ติชันที่เมาท์ได้อย่างแน่นอน
etherous

4

ฉันคิดว่าคำตอบของ Caesium นั้นดีฉันแค่เขียนคำสั่งอื่นเพื่อให้ได้สิ่งเดียวกัน

สมมติว่าคุณมีไฟล์ที่disk.imgมีดิสก์อิมเมจนั่นคือมีตารางพาร์ติชันและพาร์ติชันอย่างน้อยหนึ่งพาร์ติชันและบอกว่าคุณต้องการทำให้พาร์ติชันล่าสุดมีขนาดใหญ่ขึ้น สิ่งที่คุณต้องทำคือการ

1) ทำให้ไฟล์ทั้งหมดใหญ่ขึ้นพูด 4GiB วิธีที่รวดเร็วในการทำคือการใช้dd

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

2) ทำให้พาร์ทิชันที่ใหญ่ขึ้นโดยใช้ fdisk (ฉันหวังว่าฉันสามารถทำได้ในการแยกหรือเครื่องมือที่ดีกว่า ... ใคร?)

fdisk disk.img

พิมพ์pเพื่อพิมพ์ตาราง partiton และค้นหาเซกเตอร์เริ่มต้นของพาร์ติชันของคุณตัวอย่างเช่นพาร์ติชัน 2 เริ่มต้นที่เซกเตอร์ 106496

สิ่งที่คุณจะทำคือการลบพาร์ติชันนั้นออกจากตารางพาร์ติชันและสร้างพาร์ติชันใหม่ที่เริ่มต้นที่เซกเตอร์เดียวกัน แต่จบที่พาร์ติชั่นใหม่ จากนั้นพาร์ติชันจะมีระบบไฟล์ที่ถูกต้อง

พิมพ์dและให้หมายเลขพาร์ติชันเพื่อลบ (อึก!)

พิมพ์nและกำหนดหมายเลขพาร์ติชันที่ต้องการจากนั้นเริ่มเซกเตอร์ คุณต้องใช้เซกเตอร์เริ่มต้นเหมือนกับที่เคยใช้มาก่อน ในที่สุดก็ให้ภาคปลายหรือเพียงให้ fdisk เลือกภาคที่สูงที่สุดที่คุณสามารถใช้ได้

พิมพ์wเพื่อเขียนการเปลี่ยนแปลงกลับไปยังไฟล์อิมเมจของดิสก์และออกจาก fdisk

3) ตอนนี้คุณต้องปรับขนาดระบบไฟล์ สำหรับสิ่งนี้คุณต้องการออฟเซ็ตถึง (= ตำแหน่งของ) ระบบไฟล์ภายในอิมเมจของดิสก์ คุณสามารถคำนวณจากหมายเลขเซกเตอร์ถ้าคุณรู้ขนาดเซกเตอร์ (ซึ่งปกติคือ 512) หรือคุณสามารถใช้parted

parted disk.img u b p

( partedสามารถใช้คำสั่งเป็นอาร์กิวเมนต์บรรทัดคำสั่งดังนั้นนี่หมายถึง 'หน่วยไบต์' และ 'พิมพ์' ดังนั้นจึงพิมพ์ตารางพาร์ติชันและใช้ไบต์เป็นขนาด uint)

สิ่งนี้จะพิมพ์พาร์ติชั่นเริ่มต้นและสิ้นสุด บอกว่าพาร์ทิชันของคุณเริ่มต้นที่ 54525952 losetupแล้วคุณทำให้อุปกรณ์ย้อนกลับบล็อก

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

losetupบอกคุณที่ dev /dev/loop0มันเลือกตัวอย่างเช่น ตอนนี้คุณสามารถใช้resize2fs:

resize2fs /dev/loop0

และในที่สุดก็นำอุปกรณ์ลูปออก

losetup -d /dev/loop0

2

ทางออกที่ดีที่สุดอยู่ที่นี่:

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

ฉันคิดว่าสิ่งที่ @Caesium กล่าวไว้นั้นมาจากลิงค์ทางด้านบน

ฉันหวังว่านี่จะช่วยได้

3 ขั้นตอน:

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

2.GParted live cd to resize

3.reboot and use os tools to resize

ขอบคุณสำหรับคำตอบง่ายๆ ทำงานกับฉันใน Ubuntu 16.04
phil

-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);

}

โปรแกรมอย่างง่ายนี้เพิ่ม N ไบต์ไปยังจุดสิ้นสุดของอิมเมจเสมือน ฉันใช้อิมเมจพาร์ติชัน Paragon สำหรับ Windows XP เพื่อรวมรูปภาพที่สร้างขึ้นใหม่ ทำงานได้ที่นี่


ฟังก์ชั่นคงที่ไม่ได้ใช้ 'auxfilesize', 'aux_copyNBytesFromTo' ทำไมจึงควรช่วย
AB

ที่ไม่ได้ใช้? ฉันไม่เข้าใจคำถาม พวกเขาทั้งสองใช้
Ilian Zapryanov

ผลลัพธ์คือไบต์ที่ไม่ได้ถูกจัดสรรและฮาร์ดไดรฟ์ใหม่ไปยังระบบปฏิบัติการ คุณต้องจัดรูปแบบมัน หากคุณถามว่าเพราะเหตุใด foo-s จึงไม่เปลี่ยนแปลง มันเพิ่งช่วยฉันต้นแบบและทำไมไม่ มันเป็นโปรแกรมง่ายๆที่เขียนใน 2 นาทีในเวลาว่างของฉัน :) ไม่มีอะไรพิเศษหรือดีที่สุด
Ilian Zapryanov

3
คุณสามารถใช้เครื่องมือที่มีอยู่เช่นddหรือtruncate...
rudimeier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.