TL;DR — Resumo Rápido
Guia completo de LVM no Linux: estenda volumes lógicos, adicione discos, expanda filesystems ext4/XFS, thin provisioning, snapshots e VMs na nuvem.
LVM (Logical Volume Manager) é a camada de abstração de armazenamento padrão no Linux que permite redimensionar, criar snapshots e migrar espaço em disco sem downtime. Este guia cobre todo o fluxo do LVM: arquitetura, adição de discos, extensão de volumes lógicos, crescimento e redução de filesystems, thin provisioning, snapshots, extensão em VMs na nuvem e os erros mais comuns em produção.
Pré-requisitos
- Sistema Linux com o pacote
lvm2instalado (sudo apt install lvm2ousudo dnf install lvm2). - Acesso root ou sudo.
- Pelo menos um grupo de volumes LVM existente, ou um disco para inicializar do zero.
- Familiaridade básica com particionamento de discos no Linux (
fdisk,lsblk,df).
Arquitetura LVM
O LVM introduz três camadas de abstração entre discos físicos e filesystems montados:
| Camada | Prefixo de comando | Descrição |
|---|---|---|
| Volume Físico (PV) | pv* | Disco ou partição inicializada para uso com LVM |
| Grupo de Volumes (VG) | vg* | Pool de armazenamento formado por um ou mais PVs |
| Volume Lógico (LV) | lv* | Dispositivo de bloco virtual extraído do espaço livre do VG |
Os Physical Extents (PE) são a menor unidade de alocação dentro de um VG (padrão 4 MiB). Cada LV é um intervalo de PEs. Essa abstração permite que os LVs abranjam múltiplos discos e sejam redimensionados a qualquer momento.
A pilha de armazenamento se parece com isto:
/dev/sda1 /dev/sdb1 /dev/sdc ← discos físicos / partições
└─── pvcreate ───────────┘
↓
Grupo de Volumes (vg_data) ← pool de PEs
↓
lv_root lv_home lv_db ← volumes lógicos (dispositivos de bloco)
↓
ext4 ext4 xfs ← filesystems sobre os LVs
Visualizando o Layout Atual
lsblk — árvore de dispositivos de bloco
lsblk
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# sda 8:0 0 50G 0 disk
# ├─sda1 8:1 0 1G 0 part /boot
# └─sda2 8:2 0 49G 0 part
# ├─vg_sys-lv_root 253:0 0 20G 0 lvm /
# └─vg_sys-lv_home 253:1 0 29G 0 lvm /home
pvdisplay, vgdisplay, lvdisplay
pvdisplay # volumes físicos: disco, tamanho, PEs usados/livres
vgdisplay # grupos de volumes: PEs totais / usados / livres
lvdisplay # volumes lógicos: caminho, tamanho, tipo de filesystem
Comandos rápidos:
pvs # resumo compacto de PVs
vgs # resumo compacto de VGs (observe VFree para espaço disponível)
lvs # resumo compacto de LVs
df -h # uso de filesystems (o que o SO enxerga)
Adicionando um Novo Disco ao LVM
Esta é a operação mais comum em produção: uma VM recebe um novo disco e você quer adicionar essa capacidade a um VG existente.
Etapa 1 — Particionar o novo disco
fdisk /dev/sdb
# Dentro do fdisk:
# n → nova partição
# p → primária
# 1 → número de partição
# [Enter] duas vezes → usar o disco inteiro
# t → mudar tipo
# 8e → Linux LVM
# w → gravar e sair
Para discos GPT (>2 TB ou sistemas UEFI) use gdisk ou parted. Defina o tipo de partição como Linux LVM.
Etapa 2 — Inicializar o volume físico
pvcreate /dev/sdb1
# Physical volume "/dev/sdb1" successfully created.
Etapa 3 — Estender o grupo de volumes
vgextend vg_sys /dev/sdb1
# Volume group "vg_sys" successfully extended
vgs # confirme que VFree aumentou
Etapa 4 — Estender o volume lógico
# Adicionar exatamente 20 GB
lvextend -L +20G /dev/vg_sys/lv_root
# Ou consumir TODO o espaço livre do VG
lvextend -l +100%FREE /dev/vg_sys/lv_root
Etapa 5 — Redimensionar o filesystem
ext4 (online, sem desmontar):
resize2fs /dev/vg_sys/lv_root
XFS (online, usar ponto de montagem):
xfs_growfs /
Estendendo um LV com Espaço Livre no VG
Se você já tem PEs livres no VG (visíveis em vgs sob VFree), pule as etapas de adicionar disco e vá direto para lvextend:
vgs
# VG #PV #LV #SN Attr VSize VFree
# vg_data 2 3 0 wz--n- 200.00g 45.00g ← 45 GB livres
lvextend -L +30G /dev/vg_data/lv_db
resize2fs /dev/vg_data/lv_db # ext4
# ou
xfs_growfs /var/lib/mysql # XFS
Você pode combinar lvextend e resize2fs em um único comando com a flag -r:
lvextend -L +30G -r /dev/vg_data/lv_db
Redimensionamento Online vs Offline
| Filesystem | Crescer online? | Reduzir online? | Notas |
|---|---|---|---|
| ext4 | Sim | Não — deve desmontar | Mais flexível; suporta crescer e reduzir |
| XFS | Sim | Nunca | XFS não pode ser reduzido — por design |
| Btrfs | Sim | Sim | Crescimento e redução online suportados |
| ext3 | Sim | Não | Legado; prefira ext4 |
| swap | Não | Não | swapoff, redimensionar LV, mkswap, swapon |
Reduzindo um Volume Lógico (Somente ext4 — Perigoso)
Reduzir é irreversível se feito incorretamente. Sempre faça backup. XFS não pode ser reduzido.
# 1. Desmontar o filesystem
umount /dev/vg_data/lv_home
# 2. Verificar e reparar o filesystem ANTES de redimensionar
e2fsck -f /dev/vg_data/lv_home
# 3. Reduzir o filesystem para o tamanho alvo
resize2fs /dev/vg_data/lv_home 50G
# 4. Reduzir o volume lógico para corresponder
lvreduce -L 50G /dev/vg_data/lv_home
# 5. Remontar e verificar
mount /dev/vg_data/lv_home /home
df -h /home
Regra crítica: sempre execute resize2fs para reduzir o filesystem ANTES de lvreduce. Reduzir o LV primeiro trunca dados e corrompe o filesystem.
Thin Provisioning
O thin provisioning permite superalocar armazenamento — alocar mais espaço para os LVs do que existe fisicamente no VG.
# Criar um thin pool (100 GB em um VG que pode ter apenas 50 GB livres em disco)
lvcreate --thin -L 100G vg_data/thin_pool
# Criar thin LVs a partir do pool
lvcreate --thin -V 30G --name lv_web vg_data/thin_pool
lvcreate --thin -V 30G --name lv_db vg_data/thin_pool
# Monitorar o uso real do pool
lvs -a vg_data
# Data% mostra o quanto o pool está cheio — alerte a 80%, aja a 90%
Aviso: se um thin pool ficar completamente cheio, todos os LVs do pool ficam somente leitura. Monitore o uso com lvs.
Snapshots LVM
Snapshots capturam o estado de um LV num ponto no tempo usando copy-on-write. São a maneira mais rápida de fazer backup consistente de um servidor em produção.
# Criar um snapshot de 5 GB de lv_root
lvcreate --snapshot -n lv_root_snap -L 5G /dev/vg_sys/lv_root
# Montar o snapshot somente leitura para backup
mount -o ro /dev/vg_sys/lv_root_snap /mnt/snap
tar -czf /backup/root-$(date +%Y%m%d).tar.gz -C /mnt/snap .
umount /mnt/snap
# Remover o snapshot quando terminar
lvremove /dev/vg_sys/lv_root_snap
Mesclando um snapshot (rollback)
# Reverter lv_root para o estado do snapshot na próxima inicialização
lvconvert --merge /dev/vg_sys/lv_root_snap
reboot
LVM em VMs na Nuvem
Quando você estende um disco no Azure, AWS ou GCP, o SO vê o disco crescer mas o PV ainda reporta o tamanho antigo. Use pvresize para atualizar a visão do LVM:
# Exemplo Azure: disco estendido de 30 GB para 50 GB no portal
lsblk # /dev/sda deve mostrar 50G
# Redimensionar a partição se necessário
sudo growpart /dev/sda 2
# Informar ao LVM que o PV agora é maior
pvresize /dev/sda2
# Confirmar que apareceu espaço livre no VG
vgs
# Estender o LV e crescer o filesystem
lvextend -l +100%FREE -r /dev/vg_sys/lv_root
Erros Comuns
| Mensagem de erro | Causa | Solução |
|---|---|---|
Insufficient free space | PEs insuficientes no VG | Adicione um novo PV com pvcreate + vgextend, ou use -l +100%FREE |
Can't reduce LV below used space | Alvo do resize2fs menor que os dados reais | Execute e2fsck -f primeiro, depois reduza o filesystem antes do lvreduce |
Filesystem not showing new size | resize2fs / xfs_growfs não executados após lvextend | Execute resize2fs /dev/vg/lv ou xfs_growfs /pontomontagem |
Device /dev/sdX not found | Tabela de partições não relida | Execute partprobe /dev/sdX e tente novamente pvcreate |
WARNING: snapshot is full | Espaço COW esgotado | Expanda o snapshot: lvextend -L +2G /dev/vg/snap ou recrie-o |
LVM vs ZFS vs Btrfs vs mdadm vs Partições Simples
| Recurso | LVM | ZFS | Btrfs | mdadm | Partições simples |
|---|---|---|---|---|---|
| Redimensionamento online | Sim | Sim | Sim | Limitado | Não |
| Snapshots | Sim (COW) | Sim (COW) | Sim (COW) | Não | Não |
| RAID | Sim | Sim (nativo) | Sim | Sim | Não |
| Compressão | Não | Sim | Sim | Não | Não |
| Thin provisioning | Sim | Sim | Parcial | Não | Não |
| Curva de aprendizado | Média | Alta | Média | Média | Baixa |
| Ideal para | Servidores Linux gerais | NAS, FreeBSD | Desktop, Fedora | RAID legado | Disco único simples |
Resumo
- LVM adiciona abstração PV → VG → LV: redimensione e mova armazenamento sem reiniciar.
- Use
pvdisplay,vgdisplay,lvdisplayevgspara entender o layout atual. - Adicionar capacidade:
pvcreate→vgextend→lvextend→resize2fsouxfs_growfs. - Crescer ext4 e XFS é sempre online e seguro; use
-rnolvextendpara um único passo. - Reduzir requer desmontar +
e2fsck+resize2fsantes delvreduce. XFS não pode ser reduzido. - O thin provisioning permite superalocação; monitore o uso do pool com
lvs. - Snapshots são backups COW rápidos; dimensione-os generosamente.
- Em VMs na nuvem, use
pvresizeapós estender o disco no portal.