¿Cómo se aumenta el espacio en disco de un invitado KVM?

100

Configuré un invitado Ubuntu en un host CentOS KVM con inicialmente 6 GB de espacio en disco. ¿Cómo hago para aumentar el espacio en disco del invitado Ubuntu desde la línea de comandos?

EDITAR # 1: estoy usando un archivo de imagen de disco (qemu).

slm
fuente
1
Cambio de
Mircea Vutcovici

Respuestas:

116
  1. detener la VM
  2. ejecutar qemu-img resize vmdisk.img +10Gpara aumentar el tamaño de la imagen en 10 Gb
  3. iniciar la VM, cambiar el tamaño de las particiones y la estructura LVM dentro de ella normalmente
dyasny
fuente
Ah, me ganaste, acabo de notar las opciones de cambio de tamaño en qemu-img en la página del manual. Así que esto ahorra un par de pasos. ¡Agradable!
slm
1
Trabajó para cambiar el tamaño de mi * .qcow2 img en RHEL6.6. ¡Gracias!
Jacob Goulden
8
start the VM, resize the partitions and LVM structure within it normally¿Cómo hacerlo? Por favor explícalo.
Waki
1
No puedes tener todo entregado en bandeja. Si ha intentado y no ha podido cambiar el tamaño de particiones o LV, abra una nueva pregunta, describa lo que intentó y lo que no funcionó
dyasny
44
Para cambiar el tamaño de las particiones y LVM, siga todos los pasos que se explican en este excelente artículo: sandilands.info/sgordon/…
skonsoft
32

Método en línea (usando qemu, libvirt y virtio-block)

Para bien o para mal, los siguientes comandos se ejecutarán incluso si el disco virtual de destino está montado. Esto puede ser útil en entornos donde el disco no se puede desmontar (como una partición raíz), la VM debe permanecer encendida y el propietario del sistema está dispuesto a asumir el riesgo de corrupción de datos . Para eliminar ese riesgo, deberá iniciar sesión en la máquina virtual y desmontar primero el disco de destino, algo que no siempre es posible.

Realice lo siguiente desde el hipervisor KVM.

  1. Aumente el tamaño del archivo de imagen de disco en sí (especifique la cantidad a aumentar):

    qemu-img resize <my_vm>.img +10G
    
  2. Obtenga el nombre del dispositivo virtio, a través del shell libvirt ( drive-virtio-disk0en este ejemplo):

    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. Indique al controlador virtio que detecte el nuevo tamaño (especifique la nueva capacidad total):

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

Luego inicie sesión en la VM. La ejecución dmesgdebe informar que el disco virtio detectó un cambio de capacidad. En este punto, continúe y cambie el tamaño de sus particiones y estructura LVM según sea necesario.

billyw
fuente
44
La página de manual de qemu-img (la mía tiene fecha de 2016-05-08) dice: " Advertencia: nunca use qemu-img para modificar imágenes en uso por una máquina virtual en ejecución o cualquier otro proceso; esto puede destruir la imagen. Además, tenga en cuenta que consultar una imagen que está siendo modificada por otro proceso puede encontrar un estado inconsistente ". Por lo tanto, no estoy seguro de si (el primer paso) es seguro cuando la máquina virtual todavía se está ejecutando.
user44400
No funciona en centos7 + kvm
e-info128
1
Esto funcionó perfectamente para mí. Uso de dispositivos ceph y virtio block. almacenamos datos de aplicaciones / MySQL db en una partición separada. Detenga las aplicaciones que acceden a esta partición. Desmontarlo. Cambiar el tamaño fsck luego vuelva a montarlo con el nuevo tamaño. No se necesita apagado.
nelaaro
Igual que esta respuesta, pero usando libvirt en lugar de la consola del monitor: serverfault.com/a/952868/30946
Mircea Vutcovici
21

Estas preguntas por defecto del servidor son similares pero más específicas, ¿cambiar el tamaño del disco en línea KVM? & Centos Xen redimensionando la partición DomU y el grupo de volúmenes . El primero hace la pregunta de cómo aumentar un invitado KVM mientras está en línea, mientras que el segundo es específico de XEN usando LVM. Estoy preguntando cómo lograr esto mientras el KVM está desconectado.

NOTA: Este enlace fue útil para el MÉTODO N. ° 1 y muestra cómo lograr aumentar el espacio en disco de un KVM (basado en ext3). CÓMO: Cambiar el tamaño de una imagen de máquina virtual KVM .

Una cosa a tener en cuenta con los invitados KVM es que las particiones que están usando en su interior pueden afectar el método que puede usar para aumentar su espacio en disco.

MÉTODO # 1: Las particiones están basadas en ext2 / ext3 / ext4

Los frutos de este método son los siguientes:

# 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

Ahora con el archivo mykvm.img más grande en la mano, inicie gparted y extienda la partición existente en el espacio de disco recién agregado. Este último paso básicamente extiende la partición del sistema operativo para que pueda hacer uso del espacio extra.

MÉTODO # 2: Las particiones están basadas en LVM

Estos son los pasos que seguí aproximadamente para cambiar el tamaño de un invitado KVM que usaba LVM internamente.

  1. Apagar la VM
  2. agregue más espacio al "archivo de imagen" del invitado (algo así como: cat old.img 10G_addon.raw >> new.img
  3. iniciar la VM (usando el nuevo new.img creado)
  4. ejecute fdisk dentro de VM y elimine y vuelva a crear la partición 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. Reiniciar la VM

  6. Cambiar el tamaño del volumen físico 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. Cambiar el tamaño del volumen lógico LVM

      % lvresize /dev/VolGroup00/LogVol00 -l +640
      Extending logical volume LogVol00 to 43.88 GB
      Logical volume LogVol00 successfully resized
    
  8. Crecer el sistema de archivos

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

Lo anterior es mi ejemplo, pero seguí los pasos en este sitio web

slm
fuente
el método # 1 en esta publicación no parece funcionar tan bien: el administrador de máquina virtual en red hat no informa el nuevo tamaño después. El método sugerido por @dyasny parece funcionar mejor al menos a este respecto.
Iwan Aucamp
@IwanAucamp: interesante, utilizo virt-managery he utilizado los métodos 1 y 2 ampliamente antes de migrar nuestros servidores KVM a una versión más nueva de KVM (CentOS 5 -> CentOS 6). Ahora uso el qemu-img resizemétodo también.
slm
Para el método # 2, puede encontrar lvextend más útil como el paso 7: lvextend /dev/Volgroup/lvname /dev/vda2(todo en una línea, donde / dev / vda2 sería su volumen físico). Sin ninguna otra opción, usará el tamaño máximo en ese grupo de volúmenes.
Mike S
Método # 2, paso 4 no funcionará si hay volúmenes lógicos en una tabla de particiones. Después de la recreación del tipo extendido de una partición, el primer sector disponible ya no coincidirá con el que tenía antes de los cambios. Por ejemplo, si el primer sector de su partición lógica fue 1001472, después de los cambios será 1003518 (suponiendo que el disco 10G antes y 50G después de cambiar el tamaño). ¿Alguien sabe cómo recrear, si es posible, volúmenes lógicos en el mismo primer sector?
ILIV
1
Esto se debe a que fdisk aplica de forma predeterminada restricciones de alineación (paso de 1 MB) a las particiones. Para evitarlo, acepte el valor predeterminado de 1003518, ingrese al modo experto (x), luego elija b y establezca el primer sector en 1001472. Consulte unix.stackexchange.com/a/320447 para obtener más detalles.
ILIV
11

Cambiar el tamaño y expandir las particiones internas en un solo paso

Tenía un host Ubuntu con una imagen de archivo de invitado qcow2 y quería cambiar el tamaño del disco y expandir las particiones apropiadas, todo en un solo paso. Requiere que configure las utilidades del sistema de archivos invitado libvirt, pero de todos modos es útil tenerlas disponibles.

Inspiración de aquí: http://libguestfs.org/virt-resize.1.html

El comando de teclado aquí es: virt-resize

  • esta es una utilidad libvirt
  • puede expandir un disco invitado Y expandir las particiones dentro en un solo paso
  • copia el disco, no lo expande en su lugar
    • esto es bueno porque tiene el original intacto como respaldo

Preparación:

* 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

Ahora haga lo siguiente:

1) cerrar el invitado:

2) Verifique el tamaño actual y vea el nombre de la partición que desea expandir usando la utilidad libvirt:

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

3) Cree el nuevo disco de salida (40G):

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

4) Copie lo antiguo a lo nuevo mientras expande la partición apropiada (suponiendo que su partición de disco del paso 2 fuera / dev / sda1):

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

5) Cambie el nombre del archivo indisk como copia de seguridad, cambie el nombre del disco externo como indisk (o modifique el XML invitado)

6) Reinicie el invitado y pruebe el nuevo archivo de disco cuidadosamente antes de eliminar el archivo original

7) Beneficio!

hdave
fuente
Esto casi hace el trabajo en mi caso. Tristemente, casi. Cuando se reinicia el invitado (un servidor CentOS 7), encuentra que el disco expandido no se puede iniciar.
Urhixidur
1
Funciono muy bien para mi. Omitir -o preallocation=metadatacrea un archivo disperso. Con esa opción, asigna previamente el tamaño completo.
Dennis Williamson
Excelente, esta respuesta me lo dio. ¡Muchas gracias! La documentación "oficial" para libguestfs ( libguestfs.org/virt-resize.1.html ), lamentablemente no está bien escrita y termina siendo bastante confusa.
mbello
1
Funcionó bien para mí, recuerde que en realidad no necesita usar -o preallocation=metadatay, si no lo hace, también debe omitir el truncatepaso. virt-resizecrecerá el archivo según corresponda de todos modos.
amoe
5

Si está utilizando LVM dentro de la VM, la forma más sencilla de hacerlo sería agregar un nuevo disco virtual a la VM y expandir el grupo de volúmenes y los volúmenes lógicos.

Para verificar si está utilizando LVM run sudo pvs; sudo vgs; sudo lvs, obtendrá algo como esto:

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

si el sistema operativo de la VM está usando LVM. En el ejemplo anterior, la VM tiene un disco virtual de 30 Gbytes, configurado usando LVM con un grupo de volúmenes llamado vgWWW que contiene dos volúmenes lógicos, uno para intercambio y otro para todo lo demás.

Si LV está en uso en la VM:

  1. Apaga la VM
  2. En el host, cree un nuevo archivo de disco virtual y agréguelo a la VM
  3. Reinicie la VM e inicie sesión
  4. Marque la nueva unidad como un volumen físico para LVM con sudo pvcreate /dev/vdb
  5. Extienda el grupo de volúmenes para incluir este nuevo bloque de disco con sudo vgextend vgWWW /dev/vdb
  6. Extienda el volumen lógico para ocupar el nuevo espacio con sudo lvextend --extents +100%FREE /dev/vgWWW/root(o algo así como sudo lvextend --size +8G /dev/vgWWW/rootsi no desea aumentarlo por completo, este ejemplo agregaría 8 Gb al volumen)
  7. Cambiar el tamaño del sistema de archivos con resize2fs /dev/vgWWW/root

Nota: lo anterior supone que los nombres vg / lv son los mismos que en mi ejemplo, lo cual es poco probable, cambie según corresponda, también si la VM ya tenía una unidad virtual llamada vdbla nueva será otra cosa ( vdcy así sucesivamente)

Nota: resize2fs solo funcionará en el sistema de archivos ext2, ext3 y ext4. Si está utilizando algo más, se producirá un error y no hará nada.

Nota: como está cambiando el tamaño de un sistema de archivos en vivo resize2fs, no se le solicitará que ejecute fsckprimero como lo haría para un sistema de archivos desmontado, simplemente continuará. Es posible que desee ejecutar una comprobación del sistema de archivos de solo lectura, no hay problemas antes de continuar.

David Spillett
fuente
Esto también se puede hacer con GUI que es bastante agradable centos.org/docs/5/html/Deployment_Guide-en-US/…
Nux
5

Es posible hacer cambios de tamaño en línea. libvirtd admite esto de forma nativa:

Encuentra el nombre del dispositivo de bloque. Debería ser algo como "vda"

$ virsh domblklist <libvirtd_vm_name>

Cambiar el tamaño del dispositivo virtual:

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

He aquí un ejemplo se amplío el vdadisco desde 50GBque 51GBpor undercloudVM.

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

Ahora eche un vistazo a los detalles del archivo de imagen .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

Ahora cambiemos el tamaño del dispositivo de bloqueo vda:

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

Y confirma:

[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 ~]#

Luego puede usar este script dentro de la VM para mostrar los comandos para cambiar el tamaño de los dispositivos de bloque y fs: https://github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh .

Mircea Vutcovici
fuente
3

Existe la posibilidad de aumentar el tamaño del disco de su VM sin reiniciar la VM si está utilizando la unidad virtio y LVM.

  1. Use virt-manager o virsh para definir un nuevo disco vacío
  2. El núcleo debería ver un nuevo / dev / vdb
  3. (Opcional) Cree una partición primaria con fdisk para obtener / dev / vdb1, luego use kpartx -a / dev / vdb para releer la tabla de particiones

  4. Use vgextend vg_name / dev / vdb1 (o / dev / vdb si no creó una partición)

  5. Use lvextend -l + 100% GRATIS / dev / vg_name / lv_name
  6. Use resize2fs / dev / vg_name / lv_name para extender su sistema de archivos

Ya terminaste

Bruno Mairlot
fuente
2
Agregaré que libguestfs.org/virt-resize.1.html también debería ayudar.
FearlessFuture
3

De esta manera puede expandir la partición que desee:

    # 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

Ver más ejemplos aquí .

Hojat Modaresi
fuente
2

Otra forma de hacerlo

truncate -s +2G vm1.img 

vaya a hacer un nuevo escaneo de disco y después de que pueda hacer el cambio de tamaño de su lvm.

mandela900
fuente
1

Si tiene LVM en su VM, esto es una locura fácil y rápida.

  1. Apague la VM (máquina invitada).
  2. En su máquina host, agregue un nuevo dispositivo de almacenamiento.
  3. Activar invitado.
  4. Sistema abierto -> Administración -> Administración de volumen lógico (o escriba sudo system-config-lvmen la terminal) *.

La GUI me pareció bastante intuitiva, pero siga los siguientes pasos si tiene problemas.

  1. Abra "Entidades sin inicializar" y encuentre su nuevo disco.
  2. Después de seleccionar una nueva unidad, debajo de la imagen debería encontrar un botón de inicialización. Presionalo.
  3. Le preguntará sobre la partición, no la necesita.
  4. Cuando termine, agregue su unidad al grupo de volumen existente.
  5. Finalmente, necesita aumentar sus volúmenes lógicos; esto se hace en la Vista lógica del grupo editando las propiedades de su volumen.
  6. Guardar y listo. No es necesario reiniciar VM.

¡Nota! Al menos en CentOS 6 LVM GUI no está instalado de manera predeterminada, pero puede instalarlo con yum install system-config-lvm.

Nux
fuente
1
  1. Apagar la VM
  2. Cambiar el tamaño de la imagen:

    qemu-img resize vmdisk.img +16G
    

    aumenta el tamaño de la imagen en 16 GB.

  3. Si su imagen tiene GPT (tabla de particiones GUID), el tamaño de la unidad utilizada en GPT diferirá del nuevo tamaño, debe solucionarlo con gdisk:

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

    o con parted:

    parted $MY_DRIVE print Fix
    

    Por alguna razón, el partedarreglo no funciona cuando no se presenta tty (por ejemplo, al aprovisionar con Vagrant), así que lo uso gdisk.

  4. Aumente el tamaño de la partición para llenar todo el espacio disponible:

    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 es opcional y necesaria si está utilizando BIOS heredado. MY_PARTITION_GUID=...y las c $MY_PARTITION_GUIDpartes también son opcionales y necesarias solo si usa el UUID de partición en /etc/fstabo en otro lugar.

  5. Reiniciar o releer particiones con partx -u $MY_DRIVEo partprobe.

  6. Extender partición, ejemplo para ext2, ext3o ext4:

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