LVM no Linux: volumes físicos, grupos e volumes lógicos na prática
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ível | O que é | Exemplo de nome | Criado com |
|---|---|---|---|
| PV (Physical Volume) | disco ou partição preparado para o LVM | /dev/sdb, /dev/sdc1 | pvcreate |
| VG (Volume Group) | conjunto que reúne um ou mais PVs | data_vg | vgcreate |
| LV (Logical Volume) | volume recortado de um VG; sobre ele se cria o sistema de arquivos | /dev/data_vg/app | lvcreate |
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
| Tarefa | Comando |
|---|---|
| Visão geral de PV, VG, LV | pvs, vgs, lvs |
| Criar um volume físico | pvcreate /dev/sdb |
| Criar um grupo | vgcreate data_vg /dev/sdb |
| Adicionar um disco ao grupo | vgextend data_vg /dev/sdc |
| Criar um volume | lvcreate -n app -L 15G data_vg |
| Expandir o volume e o sistema de arquivos | lvextend -r -L +5G /dev/data_vg/app |
| Estender o PV após aumentar o disco | pvresize /dev/sdb |
| Snapshot | lvcreate -s -n snap -L 2G /dev/data_vg/app |
| Voltar ao snapshot | lvconvert --merge /dev/data_vg/snap |
| Tirar um disco do grupo | pvmove /dev/sdb, depois vgreduce data_vg /dev/sdb |
| Remover um volume | lvremove /dev/data_vg/app |
Erros comuns
- O volume foi expandido, mas o df mostra o tamanho antigo. Faltou o
-r. Executeresize2fsouxfs_growfs. - Insufficient free space. Não há extents livres no grupo: verifique com
vgse adicione um disco comvgextend, 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.
Este tema é abordado em profundidade, com prática, no curso “Linux: с нуля до уверенного администрирования”.
Ir para o curso