Come aumentare lo spazio su disco di un guest KVM?


Risposte:


116
  1. fermare la VM
  2. eseguire qemu-img resize vmdisk.img +10Gper aumentare la dimensione dell'immagine di 10 GB
  3. avviare la VM, ridimensionare normalmente le partizioni e la struttura LVM al suo interno

Ah, mi hai battuto, ho appena notato le opzioni di ridimensionamento su qemu-img nella pagina man. Quindi questo salva un paio di passaggi. Bello!
slm,

1
Ha funzionato per ridimensionare il mio * .qcow2 img su RHEL6.6. Grazie!
Jacob Goulden,

8
start the VM, resize the partitions and LVM structure within it normallyCome farlo? Per favore, spiegalo.
Waki,

1
Non puoi avere tutto ciò che ti viene consegnato su un piatto. Se non hai provato a ridimensionare partizioni o LV, apri una nuova domanda, descrivi cosa hai provato e cosa non ha funzionato
dyasny

4
Per ridimensionare le porzioni e LVM, segui tutti i passaggi come spiegato in questo eccellente articolo: sandilands.info/sgordon/…
skonsoft,

32

Metodo online (usando qemu, libvirt e virtio-block)

Nel bene o nel male, i comandi seguenti verranno eseguiti anche se il disco virtuale di destinazione è montato. Ciò può essere utile in ambienti in cui il disco non può essere smontato (come una partizione di root), la VM deve rimanere accesa e il proprietario del sistema è disposto ad assumersi il rischio di corruzione dei dati . Per rimuovere tale rischio, è necessario accedere alla VM e smontare prima il disco di destinazione, cosa che non è sempre possibile.

Eseguire quanto segue dall'hypervisor KVM.

  1. Aumenta la dimensione del file immagine del disco stesso (specifica la quantità da aumentare):

    qemu-img resize <my_vm>.img +10G
    
  2. Ottieni il nome del dispositivo virtio, tramite la shell libvirt ( drive-virtio-disk0in questo esempio):

    virsh qemu-monitor-command <my_vm> info block --hmp
      drive-virtio-disk0: removable=0 io-status=ok file=/var/lib/libvirt/images/<my_vm>.img ro=0 drv=raw encrypted=0
      drive-ide0-1-0: removable=1 locked=0 tray-open=0 io-status=ok [not inserted]
    
  3. Segnala al driver virtio di rilevare le nuove dimensioni (specifica la nuova capacità totale):

    virsh qemu-monitor-command <my_vm> block_resize drive-virtio-disk0 20G --hmp
    

Quindi accedere alla macchina virtuale. In esecuzione dmesgdovrebbe segnalare che il disco virtio ha rilevato un cambiamento di capacità. A questo punto, vai avanti e ridimensiona le tue partizioni e la struttura LVM secondo necessità.


4
La pagina man di qemu-img (la mia è datata 08/05/2016) dice: " Avvertenza: non usare mai qemu-img per modificare le immagini in uso da una macchina virtuale in esecuzione o da qualsiasi altro processo; ciò potrebbe distruggere l'immagine. Inoltre, tenere presente che l'interrogazione di un'immagine che viene modificata da un altro processo può presentare uno stato incoerente. " Quindi non sono sicuro che (il primo passaggio) sia sicuro quando la macchina virtuale è ancora in esecuzione.
user44400,

Non funziona su centos7 + kvm
e-info128,

1
Ha funzionato perfettamente per me. Utilizzo di dispositivi ceph e virtio block. memorizziamo i dati dell'applicazione / MySQL db su una partizione separata. Impedisci alle applicazioni di accedere a questa partizione. Smontalo. Ridimensionalo. fsck. quindi montarlo di nuovo con le nuove dimensioni. Nessun arresto necessario.
nelaaro,

Stessa risposta, ma usando libvirt invece della console monitor: serverfault.com/a/952868/30946
Mircea Vutcovici

21

Queste domande sul server sono simili ma più specifiche, il ridimensionamento del disco online di KVM? & Centos Xen ridimensiona la partizione DomU e il gruppo di volumi . Il primo pone la domanda su come aumentare un ospite KVM mentre è online, mentre il secondo è specifico per XEN usando LVM. Sto chiedendo come farlo mentre KVM è offline.

NOTA: questo collegamento è stato utile per METHOD # 1 e mostra come ottenere l'aumento dello spazio su disco di una KVM (basato su ext3), HOWTO: ridimensionare un'immagine della macchina virtuale KVM .

Una cosa da tenere presente con i guest KVM è che le partizioni che stanno usando possono influenzare il metodo che puoi usare per aumentare il loro spazio su disco.

METODO # 1: le partizioni sono basate su ext2 / ext3 / ext4

I dadi di questo metodo sono i seguenti:

# 1. stop the VM
# 2. move the current image
mv mykvm.img mykvm.img.bak

# 3. create a new image
qemu-img create -f raw addon.raw 30G

# 4. concatenate the 2 images
cat mykvm.img.bak addon.raw >> mykvm.img

Ora con il file mykvm.img più grande in mano, avvia gparted ed estende la partizione esistente nello spazio su disco appena aggiunto. Quest'ultimo passaggio sostanzialmente estende la partizione del sistema operativo in modo che possa sfruttare lo spazio aggiuntivo.

METODO # 2: le partizioni sono basate su LVM

Ecco i passaggi che ho seguito approssimativamente per ridimensionare un guest KVM che utilizzava LVM internamente.

  1. Arrestare la VM
  2. aggiungi più spazio al "file immagine" dell'ospite (qualcosa come: cat old.img 10G_addon.raw >> new.img
  3. avviare la VM (utilizzando il new.img appena creato)
  4. eseguire fdisk nella VM ed eliminare e ricreare la partizione LVM

    % fdisk /dev/vda
    ...
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        3263    26105625   8e  Linux LVM
    
    Command (m for help): d
    Partition number (1-4): 2
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    
    Command (m for help): n 
    Command action
      e   extended
      p   primary partition (1-4)
    p
    Partition number (1-4): 2
    First cylinder (14-5874, default 14): 14
    Last cylinder or +size or +sizeM or +sizeK (14-5874, default 5874): 
    Using default value 5874
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        5874    47078482+  83  Linux
    
    Command (m for help): t
    Partition number (1-4): 2
    Hex code (type L to list codes): 8e
    Changed system type of partition 2 to 8e (Linux LVM)
    
    Command (m for help): p
    
    Disk /dev/vda: 48.3 GB, 48318382080 bytes
    255 heads, 63 sectors/track, 5874 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *           1          13      104391   83  Linux
    /dev/vda2              14        5874    47078482+  8e  Linux LVM
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: Device or 
    resource busy.
    The kernel still uses the old table.
    The new table will be used at the next reboot.
    Syncing disks.
    %
    
  5. Riavvia la VM

  6. Ridimensiona il volume fisico LVM

    % pvdisplay 
      --- Physical volume ---
      PV Name               /dev/vda2
      VG Name               VolGroup00
      PV Size               24.90 GB / not usable 21.59 MB
      Allocatable           yes (but full)
      PE Size (KByte)       32768
      Total PE              796
      Free PE               0
      ...
    
    % pvresize /dev/vda2
    
    % pvdisplay
      --- Physical volume ---
      PV Name               /dev/vda2
      VG Name               VolGroup00
      PV Size               44.90 GB / not usable 22.89 MB
      Allocatable           yes 
      PE Size (KByte)       32768
      Total PE              1436
      Free PE               640
      ...
    
  7. Ridimensiona il volume logico LVM

      % lvresize /dev/VolGroup00/LogVol00 -l +640
      Extending logical volume LogVol00 to 43.88 GB
      Logical volume LogVol00 successfully resized
    
  8. Crescere il file system

      % resize2fs /dev/VolGroup00/LogVol00 
      resize2fs 1.39 (29-May-2006)
      Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
      Performing an on-line resize of /dev/VolGroup00/LogVol00 to 11501568 (4k) blocks.
      The filesystem on /dev/VolGroup00/LogVol00 is now 11501568 blocks long.
    

Quanto sopra è il mio esempio, ma ho seguito i passaggi di questo sito Web


il metodo n. 1 in questo post non sembra funzionare così bene - il gestore della macchina virtuale in red hat non riporta successivamente le nuove dimensioni. Il metodo suggerito da @dyasny sembra funzionare meglio almeno in questo senso.
Iwan Aucamp,

@IwanAucamp - interessante, io uso virt-managere ho ampiamente utilizzato il metodo n. 1 e n. 2 prima di migrare i nostri server KVM su una versione più recente di KVM (CentOS 5 -> CentOS 6). Ora uso anche il qemu-img resizemetodo.
slm,

Per il metodo n. 2, potresti trovare lvextend handier come passaggio 7: lvextend /dev/Volgroup/lvname /dev/vda2(tutto su una riga, dove / dev / vda2 sarebbe il tuo volume fisico). Senza altre opzioni, utilizzerà la dimensione massima in quel gruppo di volumi.
Mike S,

Metodo n. 2, passaggio 4 non funzionerà se sono presenti volumi logici in una tabella delle partizioni. Dopo aver ricreato il tipo esteso di una partizione, il primo settore disponibile non corrisponderà più a quello che si aveva prima delle modifiche. Ad esempio, se il primo settore della partizione logica era 1001472, dopo le modifiche sarà 1003518 (presupponendo un disco da 10 G prima e 50 G dopo il ridimensionamento). Qualcuno sa come ricreare, se possibile, volumi logici nello stesso primo settore?
ILIV,

1
Ciò è dovuto a fdisk per impostazione predefinita che applica i vincoli di allineamento (passo 1 MB) alle partizioni. Per aggirare, accettare il valore predefinito di 1003518, accedere alla modalità esperto (x) quindi selezionare b e impostare il primo settore su 1001472. Per ulteriori dettagli, consultare unix.stackexchange.com/a/320447 .
ILIV,

11

Ridimensiona ed espandi le partizioni interne in un solo passaggio

Avevo un host Ubuntu con un'immagine del file guest qcow2 e volevo ridimensionare il disco ed espandere le partizioni appropriate in un solo passaggio. Richiede di impostare le utilità del filesystem guest libvirt, ma quelle sono comunque utili da avere in giro.

Ispirazione da qui: http://libguestfs.org/virt-resize.1.html

Il comando chiave qui è: virt-resize

  • questa è un'utilità libvirt
  • può espandere un disco guest ed espandere le partizioni all'interno in un solo passaggio
  • copia il disco, non lo espande sul posto
    • questo è buono perché hai l'originale intatto come backup

Preparazione:

* Install libvirt file system utilities package 
    * sudo apt-get install libguestfs-tools

* Test to see if it works (it won't) -- you need to see "===== TEST FINISHED OK =====" at the bottom:
    * sudo libguestfs-test-tool

* If you don't see "===== TEST FINISHED OK =====" at the bottom then repair it:
    * sudo update-guestfs-appliance

* Run the test again and verify it works
    * sudo libguestfs-test-tool

Ora procedi come segue:

1) spegnere l'ospite:

2) Controlla il dimensionamento corrente e visualizza il nome della partizione che vuoi espandere usando l'utilità libvirt:

sudo virt-filesystems --long --parts --blkdevs -h -a name-of-guest-disk-file

3) Crea il nuovo disco di output (40G):

qcow: sudo qemu-img create -f qcow2 -o preallocation=metadata outdisk 40G
img:  sudo truncate -s 40G outdisk

4) Copia il vecchio nel nuovo mentre espandi la partizione appropriata (supponendo che la partizione del disco dal passaggio 2 fosse / dev / sda1):

sudo virt-resize --expand /dev/sda1 indisk outdisk

5) Rinomina il file indisk come backup, rinomina l'outdisk come indisk (o modifica l'XML guest)

6) Riavviare il guest e testare attentamente il nuovo file su disco prima di eliminare il file originale

7) Profitto!


Questo fa quasi il lavoro nel mio caso. Purtroppo, quasi. Quando il guest (un server CentOS 7) viene riavviato, trova il disco espanso non avviabile.
Urhixidur,

1
Ha funzionato benissimo per me. L'omissione -o preallocation=metadatacrea un file sparso. Con questa opzione pre-alloca l'intera dimensione.
Dennis Williamson,

Eccellente, questa risposta l'ha inchiodata per me. Grazie mille! La documentazione "ufficiale" per libguestfs ( libguestfs.org/virt-resize.1.html ), sfortunatamente non è ben scritta e finisce per essere piuttosto confusa.
mbello,

1
Ha funzionato bene per me, ricorda che in realtà non hai bisogno di usare -o preallocation=metadatae se non lo fai dovresti anche saltare il truncatepassaggio. virt-resizecrescerà comunque il file appropriato.
Amoe

5

Se si utilizza LVM all'interno della VM, il modo più semplice per farlo sarebbe quello di aggiungere un nuovo disco virtuale alla VM ed espandere il gruppo di volumi e i volumi logici su quello.

Per verificare se stai usando l'esecuzione LVM sudo pvs; sudo vgs; sudo lvs, otterrai qualcosa del genere:

PV         VG     Fmt  Attr PSize  PFree
/dev/vda1  vgWWW  lvm2 a-   30.00g    0

VG     #PV #LV #SN Attr   VSize  VFree
vgWWW    1   2   0 wz--n- 30.00g    0

LV   VG    Attr   LSize 
root vgWWW -wi-ao 28.80g
swap vgWWW -wi-ao  1.19g

se il sistema operativo della VM utilizza LVM. Nell'esempio sopra la VM ha un disco virtuale da 30 Gbyte, configurato usando LVM con un gruppo di volumi chiamato vgWWW contenente due volumi logici, uno per lo scambio e uno per tutto il resto.

Se LV è in uso nella VM:

  1. Spegni la VM
  2. Sull'host creare un nuovo file del disco virtuale e aggiungerlo alla macchina virtuale
  3. Riavvia la VM e accedi
  4. Contrassegnare la nuova unità come volume fisico per LVM con sudo pvcreate /dev/vdb
  5. Estendi il gruppo di volumi per includere questo nuovo blocco di disco con sudo vgextend vgWWW /dev/vdb
  6. Estendi il volume logico con cui occupare il nuovo spazio sudo lvextend --extents +100%FREE /dev/vgWWW/root(o qualcosa del genere sudo lvextend --size +8G /dev/vgWWW/rootse non vuoi farlo crescere fino in fondo, questo esempio aggiungerebbe 8Gb al volume)
  7. Ridimensiona il filesystem con resize2fs /dev/vgWWW/root

Nota: quanto sopra presuppone che i nomi vg / lv siano gli stessi del mio esempio, il che è improbabile, cambia come appropriato, anche se la VM aveva già un'unità virtuale chiamata vdbnuova sarà un'altra ( vdce così via)

Nota: resize2fs funziona solo su filesystem ext2, ext3 ed ext4. Se stai usando qualcos'altro, si verificherà un errore e non farà nulla.

Nota: poiché stai ridimensionando un filesystem live resize2fsnon ti chiederà di eseguire fsckprima come farebbe per un filesystem non montato, andrà avanti. Potresti voler eseguire un controllo del filesystem di sola lettura non ci sono problemi prima di procedere.


Questo può essere fatto anche con la GUI che è abbastanza carina centos.org/docs/5/html/Deployment_Guide-en-US/…
Nux

5

È possibile effettuare il ridimensionamento online. libvirtd lo supporta nativamente:

Trova il nome del dispositivo a blocchi. Dovrebbe essere qualcosa come "vda"

$ virsh domblklist <libvirtd_vm_name>

Ridimensiona il dispositivo virtuale:

$ virsh blockresize --domain <libvirtd_vm_name> --path <block_device_name> --size <new_size>

Ecco un esempio in cui espanderò il vdadisco da 50GBa 51GBper undercloudVM.

[root@gss-rhos-4 ~]# virsh domblklist undercloud
Target     Source
------------------------------------------------
vda        /home/images/undercloud.qcow2

Ora dai un'occhiata ai dettagli del file immagine .qcow2:

[root@gss-rhos-4 ~]# qemu-img info /home/images/undercloud.qcow2
image: /home/images/undercloud.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 38G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

Ora ridimensioniamo il dispositivo del blocco vda:

[root@gss-rhos-4 ~]# virsh blockresize undercloud vda 51G
Block device 'vda' is resized

E confermare:

[root@gss-rhos-4 ~]# qemu-img info /home/images/undercloud.qcow2
image: /home/images/undercloud.qcow2
file format: qcow2
virtual size: 51G (54760833024 bytes)
disk size: 38G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
[root@gss-rhos-4 ~]#

Quindi è possibile utilizzare questo script all'interno della VM per mostrare i comandi per ridimensionare i dispositivi a blocchi e fs: https://github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh .


3

Esiste la possibilità di aumentare le dimensioni del disco della VM senza riavviare la VM se si utilizzano virtio drive e LVM.

  1. Utilizzare virt-manager o virsh per definire un nuovo disco vuoto
  2. Il kernel dovrebbe vedere un nuovo / dev / vdb
  3. (Facoltativo) Crea una partizione primaria con fdisk per ottenere / dev / vdb1, quindi usa kpartx -a / dev / vdb per rileggere la tabella delle partizioni

  4. Usa vgextend vg_name / dev / vdb1 (o / dev / vdb se non hai creato una partizione)

  5. Usa lvextend -l + 100% FREE / dev / vg_name / lv_name
  6. Usa resize2fs / dev / vg_name / lv_name per estendere il tuo filesystem

Hai finito.


2
Aggiungerò che anche libguestfs.org/virt-resize.1.html dovrebbe aiutare.
FearlessFuture del

3

In questo modo puoi espandere la partizione desiderata:

    # see what partitions you have? 
    virt-filesystems --long -h --all -a olddisk

    truncate -r olddisk newdisk
    truncate -s +5G newdisk

    # Note "/dev/sda2" is a partition inside the "olddisk" file.
    virt-resize --expand /dev/sda2 olddisk newdisk

Vedi altri esempi qui .


2

Un altro modo per farlo

truncate -s +2G vm1.img 

vai a fare un rescan del disco e dopo che puoi fare il tuo ridimensionamento lvm.


1

Se hai LVM nella tua VM, questo è pazzo facile e veloce.

  1. Disattiva VM (macchina guest).
  2. Nel tuo computer host aggiungi un nuovo dispositivo di archiviazione.
  3. Attiva ospite.
  4. Apri Sistema -> Amministrazione -> Gestione del volume logico (o digita il sudo system-config-lvmterminale) *.

Ho trovato la GUI abbastanza intuitiva, ma segui i prossimi passi se hai problemi.

  1. Apri "Entità non inizializzate" e trova la tua nuova unità.
  2. Dopo aver selezionato una nuova unità, sotto l'immagine dovresti trovare un pulsante di inizializzazione. Premilo.
  3. Ti chiederà del partizionamento: non ne hai bisogno.
  4. Al termine, aggiungi l'unità al gruppo di volumi esistente.
  5. Infine, è necessario aumentare il volume (i) logico (i) - questo viene fatto nella vista logica del gruppo modificando le proprietà del volume.
  6. Salva e hai fatto. Non è necessario riavviare la VM.

Nota! Almeno sulla GUI LVM di CentOS 6 non è installato per impostazione predefinita, ma è possibile installarlo con yum install system-config-lvm.


1
  1. Arrestare la VM
  2. Ridimensiona immagine:

    qemu-img resize vmdisk.img +16G
    

    aumenta le dimensioni dell'immagine di 16 GB.

  3. Se l'immagine ha GPT (tabella delle partizioni GUID), le dimensioni dell'unità utilizzate in GPT differiranno dalle nuove dimensioni, è necessario correggerlo con gdisk:

    MY_DRIVE=/dev/vda
    gdisk $MY_DRIVE <<EOF
    w
    Y
    Y
    EOF
    

    o con parted:

    parted $MY_DRIVE print Fix
    

    Per qualche motivo la partedcorrezione non funziona quando non viene presentato nessun tty (ad esempio quando si effettua il provisioning con Vagrant), quindi uso gdisk.

  4. Aumenta le dimensioni della partizione per riempire tutto lo spazio disponibile:

    MY_PARTITION_GUID=$(
    gdisk $MY_DRIVE <<EOF | sed -n -e 's/^Partition unique GUID: //p'
    i
    EOF
    )
    
    MY_PARTITION_FIRST_SECTOR=$(
    gdisk $MY_DRIVE <<EOF | sed -n -e 's/^First sector: \([0-9]\+\).*/\1/p'
    i
    EOF
    )
    
    gdisk $MY_DRIVE <<EOF
    d
    n
    
    $MY_PARTITION_FIRST_SECTOR
    
    
    x
    a
    2
    
    c
    $MY_PARTITION_GUID
    w
    Y
    EOF
    

    La x a 2 <Enter>parte è facoltativa e necessaria se si utilizza un BIOS legacy. MY_PARTITION_GUID=...e le c $MY_PARTITION_GUIDparti sono anche opzionali e necessarie solo se si utilizza l'UUID della partizione in /etc/fstabo altrove.

  5. Riavvia o rileggi le partizioni con partx -u $MY_DRIVEo partprobe.

  6. Estendere partizione, ad esempio per ext2, ext3o ext4:

    MY_PARTITION="${MY_DRIVE}1"
    resize2fs $MY_PARTITION
    

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.