가상 머신 디스크 크기를 조정하는 방법은 무엇입니까?


23

어쨌든 가상 머신의 디스크 크기를 조정해야합니까? 디스크 크기를 32GB에서 64GB로 늘리십시오. Ubuntu 서버 11.10 64 비트에서 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

이제 부팅하십시오!

더 많은 정보를 원하시면 : man virt-resize


3
마지막 단계에서 백업을하는 대신 (이미지가 크고 추가 디스크 공간이 필요없는 경우) virsh edit virt_name디스크 소스의 경로를 새 것으로 변경하면됩니다. 그런 다음 작동하지 않으면 다시 변경 한 후 다시 시도하십시오. 2로 할 수있을 때 3 개의 이미지를 갖는 데는 별다른 의미가 없습니다.
Mike

1
또는 첫 번째 명령에 cp 대신 mv를 사용할 수 있습니다. 디스크 공간을 절약 할뿐만 아니라이 방법으로도 훨씬 빠릅니다.
Kevin Keane

6
주목해야 할 중요한 점은 원점 이미지에 유형이 있더라도 대상 인스턴스가 raw유형 이된다는 것 입니다. 인스턴스 qcow2유형 을 유지 하려면 다음과 같은 변환을 적용해야합니다.qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
logoff

1
그리고 virt-resize에는 귀여운 ncurses 진행률 스피너도 있습니다.
David McNeill

18

이 작업을 수행하기 전에 디스크 이미지의 전체 사본을 그대로 복사 한 다음 모두 중단되면 다시 복사하여 다시 시작할 수있는 것이 좋습니다.

당신이해야 할 세 가지가 있습니다 :

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

빠른 답변 주셔서 감사합니다. 실용적인 솔루션처럼 보입니다. 며칠 동안 외출 할 예정이지만 다음 주에 다시 사무실로 돌아 오면 시도해보고 작동하는지 다시 알려 드리겠습니다.
Tong Wang

1
질문 하나 더 : 디스크를 축소하려면 단계를 역순으로 수행합니까? 1. 파일 시스템을 줄입니다. 2. 파티션을 줄입니다. 3. 디스크 이미지를 축소하십시오. 권리?
Tong Wang

예, resize2fs는 줄어들뿐만 아니라 줄어들 수 있지만 파일 시스템에 충분한 여유 공간이 필요합니다. 파티션을 축소 할 때 파일 시스템에서 실수로 끝을 잘라 내지 않도록 필요한 것보다 조금 더 많은 오류가 발생했습니다.)
Cesium

당신은 절대적으로 마운트 된 파티션을
망칠 수 있습니다

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부문 106,496에서 예를 파티션, 파티션의 시작 부문 2 시작을 partiton 테이블과 모양을 인쇄 할 수 있습니다.

당신이 할 일은 파티션 테이블에서 해당 파티션을 삭제하고 정확히 같은 섹터에서 시작하지만 나중에 끝나는 새 파티션을 만드는 것입니다. 그런 다음 파티션에 유효한 파일 시스템이 포함됩니다.

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

간단한 답변 감사합니다. 우분투 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 바이트를 추가합니다. Windows XP 용 Paragon 파티션 이미지를 사용하여 새로 만든 이미지를 병합했습니다. 여기서 작동합니다.


사용되지 않는 정적 함수 'auxfilesize', 'aux_copyNBytesFromTo'. 왜 도움이 되나요?
AB

미사용? 나는 그 질문을 이해하지 못한다. 둘 다 사용됩니다.
Ilian Zapryanov

결과는 할당되지 않은 바이트와 OS에 대한 새 하드 드라이브입니다. 포맷해야합니다. foo-s가 왜 정적인지 묻는다면. 방금 프로토 타입을 저장했는데 왜 안되나요? 여가 시간에 2 분 안에 작성된 간단한 프로그램입니다 :) 특별하거나 최적의 것은 없습니다.
Ilian Zapryanov

3
당신은 dd또는 truncate... 같은 기존의 도구를 사용했을 수 있습니다
rudimeier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.