Bagaimana mengubah ukuran disk mesin virtual?

23

Apakah ada cara untuk mengubah ukuran disk mesin virtual? Katakanlah meningkatkan ukuran disk dari 32GB menjadi 64GB. Saya menjalankan KVM / Qemu di server Ubuntu 11.10 64bit. Terima kasih.

Tong Wang
sumber

Jawaban:

27

Pada distro berbasis Debian Anda harus menggunakannya virt-resize. Ini menangani hampir semua segalanya di bawah tenda sekarang. Anggap saja gambar Anda disebut Win7 (mengapa tidak?). Hal pertama yang memastikan VM Anda dimatikan:

Instal alat:

# apt-get install libguestfs-tools

Dapatkan lokasi disk VM Anda:

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

Anda mungkin perlu beradaptasi /var/lib/libvirt/images/Win7.imgdalam hal berikut:

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

Buat disk 64G Anda:

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

Anda harus memperluas / dev / sda2 (bukan partisi boot):

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

Buat cadangan untuk berjaga-jaga (atau gunakan mvjika Anda tidak ingin cadangan):

# 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

Sekarang boot!

Untuk info lebih lanjut: man virt-resize

malat
sumber
3
Alih-alih membuat cadangan di langkah terakhir (jika gambar besar dan Anda tidak ingin / tidak memiliki ruang disk tambahan) Anda bisa melakukan virsh edit virt_namedan mengubah jalur ke sumber disk ke yang baru. Lalu jika itu tidak berhasil, ubah saja kembali dan coba lagi. Tidak banyak gunanya memiliki 3 gambar ketika Anda bisa melakukannya dengan 2.
Mike
1
Atau Anda bisa menggunakan mv daripada cp untuk perintah pertama. Selain menghemat ruang disk, cara ini juga akan lebih cepat secara dramatis.
Kevin Keane
6
satu hal penting yang perlu diperhatikan adalah bahwa bahkan jika gambar asal memiliki tipe, instance tujuan akan menjadi rawtipe. jika Anda ingin mempertahankan qcow2jenis contoh , Anda harus menerapkan konversi seperti:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
logoff
1
Dan virt-resize bahkan memiliki pemintal kemajuan ncurses lucu.
David McNeill
18

Saya sarankan sebelum melakukan semua ini Anda mengambil salinan lengkap dari disk image seperti apa adanya, maka ketika semuanya rusak Anda dapat menyalinnya kembali untuk memulai dari awal.

Ada 3 hal yang perlu Anda lakukan:

1) Buat disk image lebih besar. Di inang Anda:

qemu-img resize foo.qcow2 +32G

Sekarang tamu Anda dapat melihat disk yang lebih besar, tetapi masih memiliki partisi lama dan sistem file.

2) Buat partisi di dalam disk image lebih besar. Anda perlu mem-boot LiveCD di tamu Anda untuk ini, karena Anda tidak akan dapat mengacaukan dengan partisi yang dipasang. Ini cukup terlibat dan mungkin bagian paling berbahaya. Cukup banyak untuk menyalin di sini, jadi saya hanya akan menautkan untuk sekarang. Anda ingin melakukan sesuatu seperti ini:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

ATAU 2b) membuat partisi baru akan lebih mudah (dan lebih aman) jika Anda hanya ingin lebih banyak ruang penyimpanan. Gunakan fdisk atau cfdisk, atau apa pun yang Anda rasa nyaman - Anda akan melihat sejumlah besar ruang yang tidak terisi pada disk tamu Anda sekarang.

3) Akhirnya, jika Anda mengubah ukuran partisi yang ada, buat filesystem di dalam partisi baru yang lebih besar lebih besar (ini sebenarnya ada dalam panduan yang terhubung di atas). Di dalam tamu Anda:

resize2fs /dev/sda1
Cesium
sumber
Terima kasih atas jawaban cepatnya. Sepertinya solusi yang layak. Saya akan keluar kota selama beberapa hari, tetapi begitu saya kembali ke kantor minggu depan, saya akan mencobanya dan melaporkan kembali jika itu berhasil.
Tong Wang
1
Satu pertanyaan lagi: jika saya ingin mengecilkan disk, apakah saya melakukan langkah-langkah dalam urutan terbalik? Seperti: 1. menyusutkan sistem file; 2. menyusutkan partisi; 3. perkecil gambar disk. Kanan?
Tong Wang
Ya, resize2fs dapat menyusut dan tumbuh, tetapi itu jelas akan membutuhkan ruang kosong yang cukup di sistem file. Ketika menyusutkan partisi, saya keliru meninggalkan sedikit lebih dari yang diperlukan sehingga Anda tidak sengaja memotong ujung sistem file :)
Cesium
Anda benar-benar BISA main-main dengan partisi yang dipasang
eter
4

Saya pikir jawaban Caesium baik-baik saja, saya hanya ingin menuliskan beberapa perintah lain untuk mencapai hal yang sama.

Asumsikan Anda memiliki file disk.imgdengan gambar disk, yaitu memiliki tabel partisi dan satu atau lebih partisi, dan katakan Anda ingin membuat partisi terakhir lebih besar. Yang harus Anda lakukan adalah

1) membuat seluruh file lebih besar, katakanlah 4GiB. Cara cepat untuk melakukannya adalah menggunakandd

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

2) membuat partisi lebih besar menggunakan fdisk (saya berharap saya bisa melakukan ini di bagian atau beberapa alat yang lebih baik ... Ada orang?)

fdisk disk.img

Ketik puntuk mencetak tabel partisi dan mencari sektor awal partisi Anda, misalnya partisi 2 dimulai pada sektor 106496.

Apa yang akan Anda lakukan adalah menghapus partisi itu dari tabel partisi dan membuat partisi baru yang dimulai pada sektor yang sama persis tetapi berakhir di yang kemudian. Kemudian partisi tersebut akan berisi sistem file yang valid.

Ketik ddan berikan nomor partisi untuk dihapus. (Teguk!)

Ketik ndan berikan nomor partisi yang diinginkan, lalu sektor awal. Anda HARUS menggunakan sektor awal yang sama seperti yang digunakan sebelumnya. Terakhir berikan sektor akhir atau biarkan fdisk memilih sektor tertinggi yang dapat Anda gunakan.

Ketik wuntuk menulis perubahan kembali ke file gambar disk, dan keluar dari fdisk.

3) Sekarang Anda perlu mengubah ukuran sistem file. Untuk ini, Anda perlu offset ke (= posisi) sistem file di dalam gambar disk. Anda dapat menghitung ini dari nomor sektor jika Anda mengetahui ukuran sektor (yang biasanya 512), atau Anda dapat menggunakannyaparted

parted disk.img u b p

( parteddapat mengambil perintah sebagai argumen baris perintah, jadi ini berarti 'satuan byte' dan 'cetak', sehingga ia mencetak tabel partisi dan menggunakan byte sebagai ukuran uint.)

Ini mencetak partisi dimulai dan berakhir. Katakanlah bahwa partisi Anda dimulai pada 54525952, maka Anda membuat loopback block devices losetup.

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

losetupmemberitahu Anda dev mana yang dipilihnya, misalnya /dev/loop0. Sekarang Anda dapat menggunakan resize2fs:

resize2fs /dev/loop0

dan akhirnya lepaskan perangkat loop

losetup -d /dev/loop0
larsr
sumber
2

Solusi terbaik ditemukan di sini:

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

Saya pikir apa yang dikatakan @Caesium diberikan dari tautan resmi di atas

Saya harap ini akan membantu.

3 Langkah:

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

2.GParted live cd to resize

3.reboot and use os tools to resize
kamil
sumber
Terima kasih atas jawaban yang sederhana. Bekerja untuk saya di 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);

}

Program sederhana ini menambahkan N byte ke akhir gambar virtual. Saya menggunakan gambar partisi Paragon untuk Windows XP untuk menggabungkan gambar yang baru dibuat. Bekerja dengan baik di sini.

Ilian Zapryanov
sumber
Fungsi statis yang tidak digunakan 'auxfilesize', 'aux_copyNBytesFromTo'. Mengapa itu membantu?
AB
Tidak digunakan? Saya tidak mengerti pertanyaannya. Keduanya digunakan.
Ilian Zapryanov
Hasilnya adalah byte yang tidak terisi dan hard drive baru ke OS. Anda harus memformatnya. Jika Anda bertanya mengapa foo-s statis. Itu hanya menyelamatkan saya prototipe dan mengapa tidak. Ini adalah program sederhana yang ditulis dalam 2 menit di waktu luang saya :) Tidak ada yang istimewa atau optimal.
Ilian Zapryanov
3
Anda bisa menggunakan alat yang ada seperti ddatau truncate...
rudimeier