Làm thế nào để thay đổi kích thước đĩa máy ảo?


23

Có cách nào để thay đổi kích thước đĩa của máy ảo không? Nói tăng kích thước đĩa từ 32 GB lên 64 GB. Tôi đang chạy KVM / Qemu trên máy chủ Ubuntu 11.10 64 bit. Cảm ơn.

Câu trả lời:


27

Trên bản phân phối dựa trên Debian, bạn nên sử dụng virt-resizethay thế. Điều này xử lý khá nhiều tất cả mọi thứ dưới mui xe bây giờ. Giả sử hình ảnh của bạn được gọi là Win7 (tại sao không?). Điều đầu tiên đảm bảo VM của bạn bị tắt:

Cài đặt công cụ:

# apt-get install libguestfs-tools

Lấy vị trí của đĩa VM của bạn:

# 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" />

Bạn có thể cần phải thích nghi với /var/lib/libvirt/images/Win7.imgnhững điều sau đây:

# 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   -

Tạo đĩa 64G của bạn:

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

Bạn sẽ cần mở rộng / dev / sda2 (không phải phân vùng khởi động):

# 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.

Tạo một bản sao lưu chỉ trong trường hợp (hoặc sử dụng mvnếu bạn không muốn sao lưu):

# 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

Bây giờ khởi động!

Để biết thêm thông tin: người đàn ông đức thay đổi kích thước


3
Thay vì tạo bản sao lưu ở bước cuối cùng (nếu hình ảnh lớn và bạn không muốn / không có thêm dung lượng đĩa), bạn có thể thực hiện virsh edit virt_namevà thay đổi đường dẫn đến nguồn của đĩa sang hình mới. Sau đó, nếu nó không hoạt động, chỉ cần thay đổi lại và thử lại. Thật sự không có nhiều điểm khi có 3 hình ảnh khi bạn có thể làm điều đó với 2.
Mike

1
Hoặc bạn có thể chỉ cần sử dụng mv thay vì cp cho lệnh đầu tiên. Bên cạnh việc tiết kiệm dung lượng đĩa, nó cũng sẽ nhanh hơn đáng kể theo cách này.
Kevin Keane

6
Một điều quan trọng cần lưu ý là ngay cả khi hình ảnh gốc có một loại, thì thể hiện đích sẽ là rawloại. nếu bạn muốn duy trì qcow2loại ví dụ , bạn nên áp dụng một chuyển đổi như:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
đăng xuất

1
Và virt-resize thậm chí còn có một spinner tiến bộ dễ thương.
David McNeill

18

Tôi khuyên bạn nên trước khi thực hiện bất kỳ thao tác nào trong số này, bạn hãy sao chép toàn bộ hình ảnh đĩa, sau đó khi tất cả bị hỏng, bạn có thể sao chép lại để bắt đầu lại.

Có 3 điều bạn cần làm:

1) Làm cho hình ảnh đĩa lớn hơn. Trong máy chủ của bạn:

qemu-img resize foo.qcow2 +32G

Bây giờ khách của bạn có thể thấy một đĩa lớn hơn, nhưng vẫn có các phân vùng và hệ thống tệp cũ.

2) Làm cho phân vùng bên trong hình ảnh đĩa lớn hơn. Bạn cần khởi động LiveCD trong máy khách của mình vì điều này vì bạn sẽ không thể gây rối với phân vùng được gắn kết. Điều này khá liên quan và có lẽ là phần nguy hiểm nhất. Nó khá nhiều để sao chép ở đây, vì vậy bây giờ tôi sẽ chỉ liên kết. Bạn muốn làm một cái gì đó như thế này:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

HOẶC 2b) tạo phân vùng mới sẽ đơn giản hơn (và an toàn hơn) nếu bạn chỉ muốn có thêm dung lượng lưu trữ. Sử dụng fdisk hoặc cfdisk hoặc bất cứ điều gì bạn cảm thấy thoải mái - bạn sẽ thấy toàn bộ không gian chưa được phân bổ trên đĩa khách của mình ngay bây giờ.

3) Cuối cùng, nếu bạn thay đổi kích thước phân vùng hiện tại của mình, hãy làm cho hệ thống tệp bên trong phân vùng mới lớn hơn lớn hơn (đây thực sự là trong hướng dẫn được liên kết ở trên). Bên trong khách của bạn:

resize2fs /dev/sda1

Cảm ơn vì sớm phản hồi. Nó trông giống như một giải pháp khả thi. Tôi sẽ rời khỏi thành phố trong vài ngày, nhưng một khi tôi trở lại văn phòng vào tuần tới, tôi sẽ thử và báo cáo lại nếu nó hoạt động.
Tong Wang

1
Một câu hỏi nữa: nếu tôi muốn thu nhỏ đĩa, tôi có thực hiện các bước theo thứ tự đảo ngược không? Giống như: 1. thu nhỏ hệ thống tập tin; 2. thu nhỏ phân vùng; 3. thu nhỏ hình ảnh đĩa. Đúng?
Tong Wang

Có, resize2fs có thể thu nhỏ cũng như phát triển, nhưng rõ ràng nó sẽ cần đủ không gian trống trong hệ thống tệp. Khi thu hẹp phân vùng, tôi đã nhầm khi để lại một chút nhiều hơn mức cần thiết để bạn không vô tình cắt đứt phần cuối của hệ thống tệp :)
Caesium

Bạn hoàn toàn CÓ THỂ lộn xộn với một phân vùng được gắn kết
thanh tao vào

4

Tôi nghĩ rằng câu trả lời của Caesium là tốt, tôi chỉ muốn viết ra một số lệnh khác để đạt được điều tương tự.

Giả sử bạn có một tệp disk.imgcó hình ảnh đĩa, tức là nó có bảng phân vùng và một hoặc nhiều phân vùng và nói rằng bạn muốn làm cho phân vùng cuối cùng lớn hơn. Những gì bạn phải làm là

1) làm cho toàn bộ tập tin lớn hơn, giả sử 4GiB. Một cách nhanh chóng để làm điều đó là sử dụngdd

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

2) làm cho phân vùng lớn hơn bằng cách sử dụng fdisk (tôi ước tôi có thể làm điều này trong một phần hoặc một số công cụ đẹp hơn ... Bất cứ ai?)

fdisk disk.img

Nhập pđể in bảng partiton và tìm khu vực bắt đầu của phân vùng của bạn, ví dụ phân vùng 2 bắt đầu tại sector 106496.

Những gì bạn sẽ làm là xóa phân vùng đó khỏi bảng phân vùng và tạo một phân vùng mới bắt đầu tại cùng một khu vực nhưng kết thúc ở một phân vùng sau. Sau đó, phân vùng sẽ chứa một hệ thống tập tin hợp lệ.

Nhập dvà cho số phân vùng để xóa. (Nuốt chửng!)

Nhập nvà đưa ra số phân vùng mong muốn, và sau đó là khu vực bắt đầu. Bạn PHẢI sử dụng cùng một khu vực bắt đầu như đã được sử dụng trước đó. Cuối cùng cung cấp cho khu vực kết thúc hoặc chỉ để fdisk chọn khu vực cao nhất bạn có thể sử dụng.

Nhập wđể ghi các thay đổi trở lại tệp hình ảnh đĩa và thoát fdisk.

3) Bây giờ bạn cần thay đổi kích thước hệ thống tập tin. Đối với điều này, bạn cần hệ số tập tin offset (= vị trí của) bên trong ảnh đĩa. Bạn có thể tính toán số này từ số ngành nếu bạn biết kích thước của khu vực (thường là 512) hoặc bạn có thể sử dụngparted

parted disk.img u b p

( partedcó thể lấy các lệnh làm đối số dòng lệnh, do đó, điều này có nghĩa là 'byte đơn vị' và 'in', do đó, nó in bảng phân vùng và sử dụng byte làm kích thước uint.)

Điều này in ra phân vùng bắt đầu và kết thúc. Giả sử phân vùng của bạn bắt đầu từ 54525952, sau đó bạn tạo một thiết bị chặn vòng lặp với losetup.

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

losetupcho bạn biết dev mà nó đã chọn, ví dụ /dev/loop0. Bây giờ bạn có thể sử dụng resize2fs:

resize2fs /dev/loop0

và cuối cùng loại bỏ thiết bị lặp

losetup -d /dev/loop0

2

Giải pháp tốt nhất được tìm thấy ở đây:

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

Tôi nghĩ những gì @Caesium nói được đưa ra từ liên kết chính thức ở trên

Hy vọng điều này có thể giúp cho bạn.

3 bước:

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

2.GParted live cd to resize

3.reboot and use os tools to resize

Cảm ơn bạn đã trả lời đơn giản. Làm việc cho tôi trên 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);

}

Chương trình đơn giản này thêm N byte vào cuối ảnh ảo. Tôi đã sử dụng hình ảnh phân vùng Paragon cho Windows XP để hợp nhất các hình ảnh mới được tạo. Hoạt động tốt ở đây.


Hàm tĩnh không được sử dụng 'auxfilesize', 'aux_copyNBytesFromTo'. Tại sao điều đó nên giúp đỡ?
AB

Không sử dụng? Tôi không hiểu câu hỏi. Cả hai đều được sử dụng.
Ilian Zapryanov

Kết quả là một byte chưa được phân bổ và một ổ cứng mới cho HĐH. Bạn phải định dạng nó. Nếu bạn đang hỏi tại sao foo-s là tĩnh. Nó chỉ cứu tôi các nguyên mẫu và tại sao không. Đó là chương trình đơn giản được viết trong 2 phút khi rảnh rỗi :) Không có gì đặc biệt hay tối ưu.
Ilian Zapryanov

3
Bạn có thể đã sử dụng các công cụ hiện có như ddhoặc truncate...
rudimeier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.