Como você aumenta o espaço em disco de um convidado KVM?

100

Eu configurei um convidado do Ubuntu em um host CentOS KVM com inicialmente 6 GB de espaço em disco. Como aumentar o espaço em disco do convidado Ubuntu na linha de comando?

EDIT # 1: Estou usando um arquivo de imagem de disco (qemu).

slm
fonte
1
Redimensionamento

Respostas:

116
  1. pare a VM
  2. execute qemu-img resize vmdisk.img +10Gpara aumentar o tamanho da imagem em 10 GB
  3. inicie a VM, redimensione as partições e a estrutura LVM dentro dela normalmente
dyasny
fonte
Ah, você me venceu, apenas notei as opções de redimensionamento no qemu-img na página de manual. Portanto, isso economiza alguns passos. Agradável!
SLM
1
Trabalhei para redimensionar meu * .qcow2 img no RHEL6.6. Obrigado!
Jacob Goulden
8
start the VM, resize the partitions and LVM structure within it normallyComo fazer isso? Por favor, explique.
Waki
1
Você não pode ter tudo entregue a você em uma bandeja. Se você já tentou e não conseguiu redimensionar partições ou LVs, abra uma nova pergunta, descrever o que você tentou e o que não funcionou
dyasny
4
Para redimensionar partions e LVM, siga todos os passos como explicado neste excelente artigo: sandilands.info/sgordon/...
skonsoft
32

Método Online (usando qemu, libvirt e virtio-block)

Para melhor ou pior, os comandos abaixo serão executados mesmo se o disco virtual de destino estiver montado. Isso pode ser útil em ambientes em que o disco não pode ser desmontado (como uma partição raiz), a VM deve permanecer ligada e o proprietário do sistema está disposto a assumir o risco de corrupção de dados . Para remover esse risco, você precisaria fazer login na VM e desmontar o disco de destino primeiro, algo que nem sempre é possível.

Execute o seguinte no hypervisor KVM.

  1. Aumente o tamanho do arquivo de imagem do disco (especifique a quantidade a aumentar):

    qemu-img resize <my_vm>.img +10G
    
  2. Obtenha o nome do dispositivo virtio, através do shell libvirt ( drive-virtio-disk0neste exemplo):

    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. Sinalize o driver virtio para detectar o novo tamanho (especifique a nova capacidade total):

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

Em seguida, faça login na VM. A execução dmesgdeve relatar que o disco virtio detectou uma alteração de capacidade. Neste ponto, vá em frente e redimensione suas partições e estrutura LVM conforme necessário.

billyw
fonte
4
A página de manual do qemu-img (a minha está datada de 05/05/2016) diz: " Aviso: nunca use o qemu-img para modificar imagens em uso por uma máquina virtual em execução ou por qualquer outro processo; isso pode destruir a imagem. Além disso, esteja ciente de que a consulta de uma imagem que está sendo modificada por outro processo pode encontrar um estado inconsistente ". Portanto, não tenho certeza se (a primeira etapa) é segura quando a máquina virtual ainda está em execução.
User44400
Não funciona em centos7 + KVM
e-info128
1
Isso funcionou perfeitamente para mim. Usando dispositivos de bloco ceph e virtio. nós armazenamos dados do aplicativo / MySQL db em uma partição separada. Pare os aplicativos que acessam esta partição. Desmonte. Redimensione. fsck. depois monte-o novamente com o novo tamanho. Não é necessário desligar.
Nelaaro 30/04
O mesmo que esta resposta, mas usando libvirt em vez do console do monitor: serverfault.com/a/952868/30946
Mircea Vutcovici
21

Essas questões de falha do servidor são semelhantes, mas mais específicas, redimensionar o disco online do KVM? & Centos Xen redimensionando a partição DomU e o grupo de volumes . O primeiro faz a pergunta de como aumentar um convidado KVM enquanto está online, enquanto o segundo é específico do XEN usando o LVM. Estou perguntando como fazer isso enquanto o KVM está offline.

NOTA: Este link foi útil para o MÉTODO # 1 e mostra como conseguir aumentar o espaço em disco de um KVM (baseado em ext3), COMO FAZER: Redimensionar uma imagem de máquina virtual KVM .

Uma coisa a ter em atenção com os convidados do KVM é que as partições que eles estão usando podem afetar qual método você pode usar para aumentar o espaço em disco.

MÉTODO # 1: Partições são baseadas em ext2 / ext3 / ext4

As porcas deste método são as seguintes:

# 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

Agora, com o arquivo mykvm.img maior em mãos, inicialize o gparted e estenda a partição existente para o espaço em disco recém-adicionado. Este último passo basicamente estende a partição do SO para que ele possa fazer uso do espaço extra.

MÉTODO # 2: Partições são baseadas em LVM

Aqui estão as etapas que eu segui aproximadamente para redimensionar um convidado do KVM que usava o LVM internamente.

  1. Encerre a VM
  2. adicione mais espaço ao "arquivo de imagem" do convidado (algo como: cat old.img 10G_addon.raw >> new.img
  3. inicie a VM (usando o new.img recém-criado)
  4. execute o fdisk dentro da VM e exclua e recrie a partição 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. Reinicie a VM

  6. Redimensionar o volume físico do 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. Redimensionar o volume lógico do LVM

      % lvresize /dev/VolGroup00/LogVol00 -l +640
      Extending logical volume LogVol00 to 43.88 GB
      Logical volume LogVol00 successfully resized
    
  8. Aumente o sistema de arquivos

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

O exemplo acima é meu exemplo, mas segui as etapas deste site

slm
fonte
O método nº 1 deste post parece não funcionar tão bem - o gerenciador de máquinas virtuais no red hat não informa o novo tamanho posteriormente. O método sugerido por @dyasny parece funcionar melhor, pelo menos nesse aspecto.
Iwan Aucamp
@IwanAucamp - interessante, eu uso virt-managere utilizei o método nº 1 e nº 2 extensivamente antes de migrar nossos servidores KVM para uma versão mais recente do KVM (CentOS 5 -> CentOS 6). Agora também uso o qemu-img resizemétodo.
slm 30/05
Para o método nº 2, você pode encontrar o lvextend handier na etapa 7: lvextend /dev/Volgroup/lvname /dev/vda2(todos em uma linha, onde / dev / vda2 seria o seu volume físico). Sem outras opções, ele usará o tamanho máximo nesse grupo de volumes.
Mike S
O método nº 2, etapa 4, não funcionará se houver volumes lógicos em uma tabela de partição. Após a recriação do tipo estendido de uma partição, o primeiro setor disponível não corresponderá mais ao que havia antes das alterações. Por exemplo, se o primeiro setor da sua partição lógica foi 1001472, após as alterações, será 1003518 (assumindo 10G de disco antes e 50G após o redimensionamento). Alguém sabe como recriar, se possível, volumes lógicos no mesmo primeiro setor?
ILIV 17/11/16
1
Isso ocorre devido ao fdisk, por padrão, aplicar restrições de alinhamento (etapa de 1 MB) às partições. Para contornar o problema, aceite o valor padrão 1003518, entre no modo especialista (x), escolha be defina o primeiro setor como 1001472. Consulte unix.stackexchange.com/a/320447 para obter detalhes.
ILIV 17/11/16
11

Redimensionar e expandir partições internas em uma etapa

Eu tinha um host Ubuntu com uma imagem de arquivo de convidado qcow2 e queria redimensionar o disco e expandir as partições apropriadas, tudo em uma única etapa. Requer que você configure os utilitários do sistema de arquivos libvirt guest, mas esses são úteis para você ter de qualquer maneira.

Inspiração a partir daqui: http://libguestfs.org/virt-resize.1.html

O comando chave aqui é: virt-resize

  • este é um utilitário libvirt
  • ele pode expandir um disco convidado E expandir as partições dentro de uma única etapa
  • copia o disco, não o expande no local
    • isso é bom porque você tem o original intocado como backup

Preparação:

* 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

Agora faça o seguinte:

1) encerrar o convidado:

2) Confira o tamanho atual e visualize o nome da partição que você deseja expandir usando o utilitário libvirt:

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

3) Crie o novo disco de saída (40G):

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

4) Copie o antigo para o novo e expanda a partição apropriada (assumindo que a partição do disco da etapa 2 foi / dev / sda1):

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

5) Renomeie o arquivo indisk como backup, renomeie o outdisk como indisk (ou modifique o XML convidado)

6) Reinicialize o convidado e teste o novo arquivo de disco cuidadosamente antes de excluir o arquivo original

7) Lucro!

hdave
fonte
Isso quase faz o trabalho no meu caso. Infelizmente, quase. Quando o convidado (um servidor CentOS 7) é reiniciado, ele encontra o disco expandido não inicializável.
Urhixidur 14/10
1
Funcionou muito bem para mim. A omissão -o preallocation=metadatacria um arquivo esparso. Com essa opção, ele pré-aloca todo o tamanho.
Dennis Williamson
Excelente, esta resposta acertou em mim. Muito obrigado! A documentação "oficial" do libguestfs ( libguestfs.org/virt-resize.1.html ) infelizmente não está bem escrita e acaba sendo bastante confusa.
Mbello
1
Funcionou bem para mim, lembre-se de que você realmente não precisa usar -o preallocation=metadatae, se não, também deve pular a truncateetapa. virt-resizede qualquer maneira, o arquivo aumentará conforme apropriado.
11137
5

Se você estiver usando o LVM na VM, a maneira mais simples de fazer isso será adicionar um novo disco virtual à VM e expandir o grupo de volumes e os volumes lógicos para ele.

Para verificar se você está usando a execução do LVM sudo pvs; sudo vgs; sudo lvs, você terá algo assim:

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 o sistema operacional da VM estiver usando LVM. No exemplo acima, a VM possui um vdisk de 30Gbyte, configurado usando LVM com um grupo de volumes chamado vgWWW, contendo dois volumes lógicos, um para troca e outro para todo o resto.

Se o LV estiver em uso na VM:

  1. Desligue a VM
  2. No host, crie um novo arquivo de disco virtual e adicione-o à VM
  3. Reinicie a VM e faça login
  4. Marque a nova unidade como sendo um volume físico para LVM com sudo pvcreate /dev/vdb
  5. Estenda o grupo de volumes para incluir esse novo bloco de disco com sudo vgextend vgWWW /dev/vdb
  6. Estenda o volume lógico para ocupar o novo espaço sudo lvextend --extents +100%FREE /dev/vgWWW/root(ou algo como sudo lvextend --size +8G /dev/vgWWW/rootse você não quiser aumentar todo o caminho, este exemplo adicionaria 8 GB ao volume)
  7. Redimensione o sistema de arquivos com resize2fs /dev/vgWWW/root

Nota: o acima pressupõe que os nomes vg / lv são iguais ao meu exemplo, o que é improvável, mude conforme apropriado, também se a VM já tiver uma unidade virtual chamada vdbnova, será outra coisa ( vdce assim por diante)

Nota: resize2fs funcionará apenas no sistema de arquivos ext2, ext3 e ext4. Se você estiver usando outra coisa, ela irá errar e não fará nada.

Nota: como você está redimensionando um sistema de arquivos ativo resize2fs, não será solicitado que você execute fsckprimeiro, como faria em um sistema de arquivos desmontado, apenas seguirá em frente. Você pode querer executar uma verificação do sistema de arquivos somente leitura, pois não há problemas antes de continuar.

David Spillett
fonte
Isso também pode ser feito com GUI que é bastante agradável centos.org/docs/5/html/Deployment_Guide-en-US/...
Nux
5

É possível redimensionar online. O libvirtd suporta isso nativamente:

Encontre o nome do dispositivo do bloco. Deve ser algo como "vda"

$ virsh domblklist <libvirtd_vm_name>

Redimensione o dispositivo virtual:

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

Aqui está um exemplo onde eu expanda o vdadisco de 50GBpara 51GBpara undercloudVM.

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

Agora, veja os detalhes do arquivo de imagem .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

Agora vamos redimensionar o dispositivo de bloco vda:

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

E confirme:

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

Em seguida, você pode usar esse script dentro da VM para mostrar os comandos para redimensionar os dispositivos de bloco e o fs: https://github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh .

Mircea Vutcovici
fonte
3

Existe a possibilidade de aumentar o tamanho do disco da sua VM sem reiniciar a VM se você estiver usando o virtio drive e o LVM.

  1. Use virt-manager ou virsh para definir um novo disco vazio
  2. O kernel deve ver um novo / dev / vdb
  3. (Opcional) Crie uma partição primária com o fdisk para obter / dev / vdb1 e use o kpartx -a / dev / vdb para reler a tabela de partição

  4. Use vgextend vg_name / dev / vdb1 (ou / dev / vdb se você não criou uma partição)

  5. Use lvextend -l + 100% GRÁTIS / dev / vg_name / lv_name
  6. Use resize2fs / dev / vg_name / lv_name para estender seu sistema de arquivos

Você Terminou.

Bruno Mairlot
fonte
2
Vou acrescentar que libguestfs.org/virt-resize.1.html também deve ajudar.
FearlessFuture
3

Dessa forma, você pode expandir a partição que deseja:

    # 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

Veja mais exemplos aqui .

Hojat Modaresi
fonte
2

Outra maneira de fazer isso

truncate -s +2G vm1.img 

vá no make a disk rescan e depois você pode fazer o seu lvm redimensionar.

mandela900
fonte
1

Se você tem LVM na sua VM, isso é muito fácil e rápido.

  1. Desative a VM (máquina convidada).
  2. Na sua máquina host, adicione um novo dispositivo de armazenamento.
  3. Ligue o convidado.
  4. Abra Sistema -> Administração -> Gerenciamento de Volume Lógico (ou digite o sudo system-config-lvmterminal) *.

Achei a GUI bastante intuitiva, mas siga as próximas etapas se você tiver problemas.

  1. Abra "Entidades não inicializadas" e encontre sua nova unidade.
  2. Após selecionar a nova unidade, abaixo da imagem, você encontrará um botão de inicialização. Pressione.
  3. Ele perguntará sobre o particionamento - você não precisa dele.
  4. Quando terminar, adicione sua unidade ao grupo de volumes existente.
  5. Finalmente, você precisa aumentar seu (s) volume (s) lógico (s) - isso é feito na Visão Lógica do grupo, editando as propriedades do seu volume.
  6. Salve e pronto. Não há necessidade de reiniciar a VM.

Nota! Pelo menos no CentOS 6 LVM GUI não está instalado por padrão, mas você pode instalá-lo com yum install system-config-lvm.

Nux
fonte
1
  1. Encerre a VM
  2. Redimensionar imagem:

    qemu-img resize vmdisk.img +16G
    

    aumenta o tamanho da imagem em 16 GB.

  3. Se sua imagem tiver GPT (tabela de partição GUID), o tamanho da unidade usada na GPT será diferente do novo tamanho, você precisará corrigi-lo com gdisk:

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

    ou com parted:

    parted $MY_DRIVE print Fix
    

    Por algum motivo, a partedcorreção não está funcionando quando nenhum tty é apresentado (por exemplo, ao provisionar com o Vagrant), então eu uso gdisk.

  4. Aumente o tamanho da partição para preencher todo o espaço disponível:

    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
    

    A x a 2 <Enter>peça é opcional e necessária se você estiver usando o BIOS herdado. MY_PARTITION_GUID=...e as c $MY_PARTITION_GUIDpeças também são opcionais e necessárias apenas se você usar a partição UUID em /etc/fstabou em outro local.

  5. Reinicialize ou releia partições com partx -u $MY_DRIVEou partprobe.

  6. Estenda a partição, por exemplo ext2, ext3ou ext4:

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