Fundamentos

LVM no Linux: volumes físicos, grupos e volumes lógicos na prática

Atualizado: · Skillaria.Top

LVM (Logical Volume Manager) no Linux é uma camada entre os discos e os sistemas de arquivos: os discos viram volumes físicos (PV), são agrupados em um grupo de volumes (VG), do qual se criam volumes lógicos (LV) de qualquer tamanho. A principal vantagem é expandir um volume em tempo real com lvextend -r, adicionar um disco ao grupo sem parar o serviço e criar um snapshot antes de uma operação arriscada.

LVM (Logical Volume Manager) é o gerenciador de volumes lógicos do Linux, que separa os sistemas de arquivos dos discos físicos. Em vez de prender /var à partição /dev/sdb1, você reúne os discos em um conjunto comum e recorta volumes do tamanho necessário. Quando o espaço falta, o volume cresce com um único comando, sem reinicialização e sem parar o serviço. A seguir veja como o LVM funciona no Linux, como criar volumes do zero, expandi-los, fazer um snapshot e não perder dados nos erros mais comuns.

Para que serve o LVM, se já existem partições comuns

Uma partição comum é um pedaço contínuo de um único disco. O tamanho é definido na hora da partição, e só pode ser aumentado se houver espaço livre logo depois dela. Quando o disco acaba, é preciso comprar outro, migrar os dados, reescrever o /etc/fstab, e o serviço precisa ficar parado durante todo esse tempo.

O LVM resolve três problemas:

  • Tamanho flexível. Um volume lógico pode ser aumentado (e, no ext4, também reduzido) a qualquer momento.
  • Junção de discos. Vários discos físicos formam um único conjunto; um volume pode ocupar dois discos ao mesmo tempo.
  • Snapshots. Uma cópia instantânea do volume antes de uma atualização, uma migração de banco ou outra operação arriscada.

Por isso, os instaladores do Ubuntu Server, RHEL, Rocky e AlmaLinux oferecem o LVM por padrão, e em servidores de dados ele quase sempre é usado.

Os três níveis do LVM: PV, VG e LV

Toda a lógica do LVM cabe em três conceitos. Uma analogia útil: os discos são sacos de farinha, o grupo é o armazém comum, e os volumes lógicos são as porções que você retira do armazém.

NívelO que éExemplo de nomeCriado com
PV (Physical Volume)disco ou partição preparado para o LVM/dev/sdb, /dev/sdc1pvcreate
VG (Volume Group)conjunto que reúne um ou mais PVsdata_vgvgcreate
LV (Logical Volume)volume recortado de um VG; sobre ele se cria o sistema de arquivos/dev/data_vg/applvcreate

Dentro do VG, o espaço é dividido em extents (PE, physical extents) — blocos de tamanho fixo, por padrão 4 MiB. Um volume lógico é apenas um conjunto de extents, que não precisam ser contíguos e podem estar em discos diferentes. É por isso que o volume é tão fácil de expandir: o LVM acrescenta extents livres de onde houver.

O dispositivo de um volume lógico pode ser acessado por dois caminhos equivalentes: /dev/data_vg/app e /dev/mapper/data_vg-app. Por baixo, trata-se de um dispositivo do device-mapper do kernel.

Como ver o que já existe

Primeiro, confirme que o pacote está instalado: em Debian e Ubuntu, é o lvm2 (sudo apt install lvm2); na família RHEL ele já vem instalado. Para uma visão geral, há comandos curtos e detalhados:

$ sudo pvs
  PV         VG      Fmt  Attr PSize   PFree
  /dev/sdb   data_vg lvm2 a--  <20.00g      0
  /dev/sdc   data_vg lvm2 a--  <20.00g  <10.00g

$ sudo vgs
  VG      #PV #LV #SN Attr   VSize  VFree
  data_vg   2   1   0 wz--n- 39.99g <10.00g

$ sudo lvs
  LV   VG      Attr       LSize  Pool Origin Data%  Meta%
  app  data_vg -wi-ao---- 30.00g

Os detalhes são mostrados por pvdisplay, vgdisplay e lvdisplay. A visão geral, junto com as partições comuns, vem do lsblk: os volumes lógicos aparecem com o tipo lvm.

$ lsblk /dev/sdb /dev/sdc
NAME             MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb                8:16   0  20G  0 disk
└─data_vg-app    253:0    0  30G  0 lvm  /srv/app
sdc                8:32   0  20G  0 disk
└─data_vg-app    253:0    0  30G  0 lvm  /srv/app

Observe que o volume app, de 30 GB, está sobre dois discos de 20 GB cada; isso não é possível com uma partição comum.

LVM do zero: do disco bruto ao volume montado

Suponha que um disco vazio /dev/sdb foi adicionado ao servidor e você precisa de um volume de 15 GB para os dados da aplicação. Confira o nome do disco com lsblk duas vezes: todos os comandos abaixo apagam os dados do dispositivo indicado.

Passo 1. Criar o volume físico

$ sudo pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

Você pode entregar ao LVM o disco inteiro ou criar antes uma partição com fdisk ou parted, do tipo "Linux LVM", e informar essa partição (/dev/sdb1). A partição é mais clara para outros administradores e protege contra o particionamento acidental do disco por cima do LVM; um disco inteiro, por outro lado, é mais fácil de expandir na nuvem.

Passo 2. Criar o grupo de volumes

$ sudo vgcreate data_vg /dev/sdb
  Volume group "data_vg" successfully created

Passo 3. Recortar o volume lógico

$ sudo lvcreate -n app -L 15G data_vg
  Logical volume "app" created.

A opção -L define um tamanho absoluto; -l define o tamanho em extents ou porcentagem: -l 100%FREE ocupa todo o espaço livre do grupo, e -l 50%VG ocupa metade do grupo. É uma boa prática deixar uma reserva livre no VG: ela pode ser acrescentada a qualquer volume depois, ou usada em um snapshot.

Passo 4. Sistema de arquivos e montagem

$ sudo mkfs.ext4 /dev/data_vg/app
$ sudo mkdir -p /srv/app
$ sudo mount /dev/data_vg/app /srv/app
$ df -h /srv/app
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/data_vg-app   15G   24K   14G   1% /srv/app

Para que o volume seja montado após a reinicialização, acrescente uma linha no /etc/fstab. Para volumes lógicos, o caminho /dev/mapper/... é estável, então ele pode ser usado, assim como o UUID do blkid:

/dev/mapper/data_vg-app  /srv/app  ext4  defaults  0 2

Teste a entrada com sudo mount -a antes de reiniciar: um erro no fstab pode deixar o servidor no modo de emergência.

Como expandir um volume LVM sem parar o serviço

Este é o principal motivo para gostar do LVM. O volume cresce com o sistema de arquivos montado, e a aplicação continua gravando. O procedimento depende de haver espaço livre no grupo.

Se o VG tem espaço livre

$ sudo vgs data_vg
  VG      #PV #LV #SN Attr   VSize   VFree
  data_vg   1   1   0 wz--n- <20.00g <5.00g

$ sudo lvextend -r -L +4G /dev/data_vg/app
  Size of logical volume data_vg/app changed from 15.00 GiB to 19.00 GiB.
  Logical volume data_vg/app successfully resized.
resize2fs 1.47.0
Filesystem at /dev/mapper/data_vg-app is mounted on /srv/app; on-line resizing required

A chave aqui é a opção -r (--resizefs): logo após aumentar o volume, ela expande também o sistema de arquivos. Sem ela, o volume fica maior, mas o df -h continua mostrando o tamanho antigo, porque o sistema de arquivos não sabe do novo espaço. Esse é o erro mais frequente: nesse caso, basta executar manualmente o resize2fs para ext4 ou o xfs_growfs para XFS.

$ sudo resize2fs /dev/data_vg/app      # ext4, informa-se o dispositivo
$ sudo xfs_growfs /srv/app             # XFS, informa-se o ponto de montagem

Atenção à diferença: -L +4G acrescenta 4 GB, enquanto -L 4G define o tamanho final em 4 GB. Para entregar ao volume todo o espaço restante, use -l +100%FREE.

Se o espaço do VG acabou: adicionar um disco

Conecte o disco novo (na nuvem, anexe o volume), encontre-o com lsblk e adicione-o ao grupo:

$ sudo pvcreate /dev/sdc
$ sudo vgextend data_vg /dev/sdc
  Volume group "data_vg" successfully extended
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app

Três comandos, nenhuma parada. O sistema de arquivos agora está sobre dois discos, e a aplicação não percebe nada.

Se o disco foi aumentado na nuvem

Na nuvem, muitas vezes é mais simples não adicionar um disco, e sim aumentar o existente. Assim, o kernel enxerga o novo tamanho do dispositivo, e o volume físico precisa ser estendido com pvresize:

$ sudo pvresize /dev/sdb
  Physical volume "/dev/sdb" changed
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app

Se o PV foi criado sobre uma partição (/dev/sdb1), primeiro expanda a partição, por exemplo com growpart /dev/sdb 1, do pacote cloud-guest-utils, e só depois execute pvresize /dev/sdb1.

Dá para reduzir um volume LVM

Dá, mas não para todos os sistemas de arquivos e não com o volume em uso. O XFS não sabe ser reduzido — só é possível recriá-lo com a transferência dos dados. O ext4 pode ser reduzido, mas apenas desmontado:

$ sudo umount /srv/app
$ sudo lvreduce -r -L 10G /dev/data_vg/app

Com a opção -r, o LVM verifica o sistema de arquivos (e2fsck) e o encolhe antes de reduzir o volume. Sem o -r, é fácil cortar o volume abaixo do tamanho do sistema de arquivos e danificar os dados. Antes de reduzir, faça sempre uma cópia de segurança.

Snapshots do LVM: uma cópia do volume antes de uma operação arriscada

O snapshot é uma imagem instantânea de um volume lógico. Ele é criado em frações de segundo e não copia os dados: o LVM trabalha pelo princípio de copy-on-write e grava no snapshot apenas os blocos que mudam no volume original depois da criação. Por isso, o snapshot precisa de espaço no VG somente para as alterações, e não para o volume inteiro.

$ sudo lvcreate -s -n app_before_upgrade -L 2G /dev/data_vg/app
  Logical volume "app_before_upgrade" created.

$ sudo lvs data_vg
  LV                 VG      Attr       LSize  Origin Data%
  app                data_vg owi-aos--- 19.00g
  app_before_upgrade data_vg swi-a-s---  2.00g app    0.01

A coluna Data% mostra o quanto o armazenamento de alterações está preenchido. Se ele chegar a 100%, o snapshot clássico fica inválido e só resta removê-lo. Escolha o tamanho com folga para o volume de alterações esperado, e acompanhe os snapshots de longa duração com lvs, ou amplie-os com lvextend.

Como voltar ao snapshot

Se a atualização deu errado, restaure o volume para o estado do momento do snapshot:

$ sudo umount /srv/app
$ sudo lvconvert --merge /dev/data_vg/app_before_upgrade
  Merging of volume data_vg/app_before_upgrade started.
$ sudo mount /srv/app

Depois da fusão, o snapshot desaparece. Se o volume não puder ser desmontado (por exemplo, é a raiz do sistema), a fusão fica pendente até a próxima ativação do volume, ou seja, até a reinicialização.

Se tudo correu bem

O snapshot é simplesmente removido, para não desacelerar as gravações nem ocupar espaço:

$ sudo lvremove /dev/data_vg/app_before_upgrade

Um snapshot também pode ser montado somente leitura para fazer uma cópia de segurança consistente de um sistema em funcionamento: mount -o ro e a cópia com rsync ou tar. Para XFS, acrescente a opção nouuid, senão a montagem é recusada por causa do UUID igual ao do original.

LVM e RAID: não confunda as tarefas

O LVM sozinho não protege contra a falha de um disco. Se um volume se estende por dois discos e um deles morre, o volume inteiro é perdido, e não só a metade. Para tolerância a falhas, coloque um RAID (mdadm) embaixo do LVM, ou use o espelhamento do próprio LVM (lvcreate --type raid1 -m 1).

Nem RAID nem snapshots substituem uma cópia de segurança. O snapshot fica nos mesmos discos do original, e o RAID espelha fielmente até um rm -rf acidental. É necessária uma cópia separada, em outro meio.

Cola de comandos do LVM

TarefaComando
Visão geral de PV, VG, LVpvs, vgs, lvs
Criar um volume físicopvcreate /dev/sdb
Criar um grupovgcreate data_vg /dev/sdb
Adicionar um disco ao grupovgextend data_vg /dev/sdc
Criar um volumelvcreate -n app -L 15G data_vg
Expandir o volume e o sistema de arquivoslvextend -r -L +5G /dev/data_vg/app
Estender o PV após aumentar o discopvresize /dev/sdb
Snapshotlvcreate -s -n snap -L 2G /dev/data_vg/app
Voltar ao snapshotlvconvert --merge /dev/data_vg/snap
Tirar um disco do grupopvmove /dev/sdb, depois vgreduce data_vg /dev/sdb
Remover um volumelvremove /dev/data_vg/app

Erros comuns

  • O volume foi expandido, mas o df mostra o tamanho antigo. Faltou o -r. Execute resize2fs ou xfs_growfs.
  • Insufficient free space. Não há extents livres no grupo: verifique com vgs e adicione um disco com vgextend, ou estenda o PV.
  • Device /dev/sdc excluded by a filter. Restou no disco uma tabela de partições ou uma assinatura de sistema de arquivos antigos. Se os dados não são necessários, limpe-os com wipefs -a /dev/sdc.
  • O snapshot ficou Invalid. O armazenamento de alterações encheu até 100%. Não é possível recuperá-lo: é preciso removê-lo e, da próxima vez, reservar mais espaço.

Resumo

LVM no Linux são três camadas: volumes físicos (PV) são reunidos em um grupo (VG), do qual se recortam volumes lógicos (LV). Isso oferece o que as partições comuns não oferecem: expansão em tempo real com lvextend -r, adição de discos sem parada e snapshots antes de mudanças arriscadas. Lembre-se de que o LVM não substitui RAID nem cópias de segurança. Particionamento, LVM, RAID e cotas são explicados na prática em uma aula do curso de Linux.

Perguntas frequentes

É possível converter para LVM uma partição com dados que já está em uso?

Não diretamente: o pvcreate apaga o início do dispositivo. É preciso criar o LVM em outro disco, copiar os dados com rsync, ajustar o fstab e só depois liberar a partição antiga.

O LVM deixa o disco mais lento?

Sem snapshots, a sobrecarga do device-mapper é praticamente imperceptível. Snapshots clássicos ativos deixam as gravações no volume original mais lentas por causa do copy-on-write, por isso não convém mantê-los por semanas.

O LVM é necessário em um computador doméstico ou notebook?

Não é obrigatório, mas é útil com criptografia de disco (LUKS com LVM por cima) e quando você quer mudar o tamanho das partições sem reparticionar. Em servidores de dados, o LVM é praticamente padrão.

O que é thin provisioning no LVM?

São os volumes finos: cria-se um pool (lvcreate --type thin-pool), e os volumes dentro dele só ocupam espaço real conforme recebem dados. Assim é possível oferecer mais espaço do que existe fisicamente, mas o preenchimento do pool precisa ser monitorado.

Como tirar um disco de um grupo sem perder dados?

Mova os extents dele para os outros discos do grupo com pvmove /dev/sdb (é preciso espaço livre suficiente) e depois execute vgreduce data_vg /dev/sdb e pvremove /dev/sdb.

Aprenda este tema em vídeo

Este tema é abordado em profundidade, com prática, no curso “Linux: с нуля до уверенного администрирования”.

Ir para o curso