Dia 12: LVM em Profundidade no Linux — PV, VG, LV e Snapshots

No Dia 11 aprendemos a particionar discos com fdisk e parted. Hoje subimos um nível: o LVM (Logical Volume Manager) é a camada de gestão de discos mais flexível do Linux. Permite criar volumes lógicos redimensionáveis em tempo real, fazer snapshots para backups consistentes e usar thin provisioning para alocar espaço apenas quando é mesmo necessário.

1. Introdução

O LVM é um sistema de gestão de volumes que abstrai o armazenamento físico. Em vez de partir discos em partições fixas, o LVM agrupa vários discos ou partições num pool de espaço e depois divide esse pool em volumes lógicos que se podem redimensionar a qualquer momento — sem reiniciar, sem desmontar o sistema de ficheiros (na maioria dos casos).

Esta flexibilidade resolve problemas reais: o disco raiz encheu mas tens outro disco livre? Adicionas o disco ao volume group e estendes o volume lógico em segundos. Precisas de um backup consistente de uma base de dados que está a ser escrita? Crias um snapshot instantâneo e fazes backup da cópia, não do original.

Neste artigo vamos cobrir todo o fluxo LVM — desde a criação de physical volumes até thin provisioning, com comandos práticos e exemplos reais.

ℹ Nota: O LVM está disponível em praticamente todas as distribuições Linux (Debian, Ubuntu, RHEL, CentOS, Arch). Os exemplos deste artigo foram testados em sistemas com LVM2, a versão actual e recomendada.

2. Conceitos LVM (PV, VG, LV)

O LVM organiza o armazenamento em três camadas hierárquicas. Compreender esta hierarquia é essencial — todos os comandos LVM operam sobre estas três camadas.

Camada Nome Descrição Comando base
1 (base) PV — Physical Volume Disco ou partição inicializada para LVM pvcreate
2 (agrupamento) VG — Volume Group Conjunto de PVs que forma um pool de espaço vgcreate
3 (volume lógico) LV — Logical Volume Porção do VG usada como se fosse uma partição lvcreate

O fluxo é sempre o mesmo: PV → VG → LV. Inicializas um ou mais discos como Physical Volumes, agrupas-os num Volume Group e depois divides esse grupo em Logical Volumes. Cada LV é formatado com um sistema de ficheiros (ext4, xfs, btrfs) e montado como qualquer partição normal.

A analogia clássica: o PV é um tijolo, o VG é a parede formada pelos tijolos e o LV é uma divisória que podes colocar onde quiseres na parede — e mover, alargar ou reduzir sem demolir tudo.

Unidades: PE e LE

O LVM divide o espaço em blocos. Os blocos do PV chamam-se Physical Extents (PE) e os do LV chamam-se Logical Extents (LE). Por defeito cada extent tem 4 MB. Quando estendes um LV em 1 GB, estás a pedir 256 LEs (256 × 4 MB = 1 GB). Estas unidades são a base de todo o redimensionamento.

3. Criar PV, VG e LV

Vamos percorrer o fluxo completo, passo a passo, com dois discos: /dev/sdb (20 GB) e /dev/sdc (10 GB).

Passo 1 — Inicializar Physical Volumes

# Inicializar os dois discos como Physical Volumes
sudo pvcreate /dev/sdb /dev/sdc

# Verificar
sudo pvdisplay
sudo pvs

O pvcreate escreve um cabeçalho LVM no início do disco. Não apaga dados existentes no momento da criação, mas se o disco tiver um sistema de ficheiros montado, este torna-se inacessível — confirma sempre o disco com lsblk antes de executar.

Passo 2 — Criar o Volume Group

# Criar VG chamado "dados" com os dois PVs
sudo vgcreate dados /dev/sdb /dev/sdc

# Verificar
sudo vgdisplay
sudo vgs

O VG dados agora tem 30 GB de espaço total (20 + 10). Podes adicionar mais PVs mais tarde com vgextend.

Passo 3 — Criar Logical Volume

# Criar LV de 15 GB chamado "projetos" no VG "dados"
sudo lvcreate -L 15G -n projetos dados

# Verificar
sudo lvdisplay
sudo lvs

# Formatar e montar
sudo mkfs.ext4 /dev/dados/projetos
sudo mkdir -p /mnt/projetos
sudo mount /dev/dados/projetos /mnt/projetos

# Tornar permanente em /etc/fstab
echo "/dev/dados/projetos /mnt/projetos ext4 defaults 0 2" | sudo tee -a /etc/fstab

O LV é acessível via /dev/dados/projetos (também /dev/mapper/dados-projetos). Para entrada no /etc/fstab, prefere /dev/mapper/dados-projetos — é estável mesmo que a ordem dos discos mude no arranque.

ℹ Dica: Podes criar um LV que use 100% do espaço livre restante com sudo lvcreate -l 100%FREE -n projetos dados. A flag -l usa extents em vez de gigabytes.

4. Extender LV Online (lvextend)

A grande vantagem do LVM é o redimensionamento em tempo real. O LV projetos tem 15 GB e está quase cheio. Vamos estendê-lo para 25 GB — sem desmontar.

Adicionar espaço ao VG primeiro

Se o VG não tem espaço suficiente, adiciona um novo disco:

# Adicionar um novo disco ao VG
sudo pvcreate /dev/sdd
sudo vgextend dados /dev/sdd

# Confirmar espaço livre no VG
sudo vgs dados

Extender o LV e o sistema de ficheiros

# Extender o LV para 25 GB (tamanho absoluto)
sudo lvextend -L 25G /dev/dados/projetos

# OU adicionar 10 GB ao tamanho actual
sudo lvextend -L +10G /dev/dados/projetos

# OU usar todo o espaço livre do VG
sudo lvextend -l +100%FREE /dev/dados/projetos

O lvextend aumenta o volume lógico, mas o sistema de ficheiros dentro dele ainda tem o tamanho antigo. Precisas de o expandir separadamente:

# Para ext4 — redimensionar online (sem desmontar)
sudo resize2fs /dev/dados/projetos

# Para xfs — redimensionar online (sem desmontar)
sudo xfs_growfs /mnt/projetos

A partir do LVM2 versão 2.03+, podes fazer tudo num só comando com a flag -r (ou --resizefs), que extende o LV e o sistema de ficheiros automaticamente:

# Extender LV + redimensionar FS num só passo
sudo lvextend -L +10G -r /dev/dados/projetos

⚠ Atenção: Para reduzir um LV (lvreduce), tens de desmontar, fazer resize2fs com tamanho menor antes, e só depois lvreduce. Reduzir o LV sem redimensionar o FS primeiro destroi dados. O XFS não suporta redução — só crescimento.

5. Snapshots LVM

Um snapshot é uma cópia point-in-time de um LV. Não copia todos os dados — é uma imagem que partilha os blocos originais. Quando o LV original é modificado, o bloco antigo é copiado para o snapshot antes da escrita (copy-on-write). Isto torna a criação instantânea, independentemente do tamanho do volume.

Criar um Snapshot

# Criar snapshot de 5 GB do LV "projetos"
sudo lvcreate -L 5G -s -n projetos_snap /dev/dados/projetos

# Verificar
sudo lvs

# Montar o snapshot para backup
sudo mkdir -p /mnt/snapshot
sudo mount /dev/dados/projetos_snap /mnt/snapshot

# Fazer backup consistente a partir do snapshot
sudo tar -czf /backup/projetos-$(date +%F).tar.gz -C /mnt/snapshot .

# Desmontar e remover o snapshot
sudo umount /mnt/snapshot
sudo lvremove /dev/dados/projetos_snap

O tamanho do snapshot (5 GB no exemplo) é o espaço de copy-on-write — a quantidade de dados que podem mudar no LV original enquanto o snapshot existe. Se o LV original for modificado mais do que 5 GB enquanto o snapshot está activo, o snapshot fica inválido e é descartado automaticamente. Dimensiona o snapshot conforme a taxa de escrita esperada.

Funcionalidade Snapshot tradicional Thin snapshot
Espaço pré-alocado Sim (fixo no momento da criação) Não (aloca do thin pool)
Custo de criação Instantâneo Instantâneo
Pode ficar inválido Sim (se exceder tamanho) Não (cresce com o pool)

Restaurar a partir de um Snapshot

# Restaurar o LV original para o estado do snapshot
sudo lvconvert --merge /dev/dados/projetos_snap

# O merge acontece no próximo arranque se o LV estiver montado,
# ou imediatamente se estiver desmontado

O --merge reverte o LV original para o estado em que estava quando o snapshot foi criado. Para volumes de raiz montados, o merge é aplicado no arranque seguinte.

6. Thin Provisioning

O thin provisioning é uma abordagem onde os LVs são criados com um tamanho virtual maior do que o espaço físico realmente disponível. O espaço só é consumido quando dados são efectivamente escritos. Isto permite over-commitment — alocar mais espaço lógico do que o físico — e é ideal para máquinas virtuais, contentores e ambientes onde o crescimento é imprevisível.

Criar um Thin Pool

# Criar um thin pool de 30 GB no VG "dados"
sudo lvcreate -L 30G -T dados/thinpool

# Criar um thin LV de 100 GB (virtual) que consome do thin pool
sudo lvcreate -V 100G -T dados/thinpool -n vm_disk1

# Formatar e montar
sudo mkfs.ext4 /dev/dados/vm_disk1
sudo mount /dev/dados/vm_disk1 /mnt/vm1

O thin pool de 30 GB pode alojar múltiplos thin LVs cuja soma virtual excede 30 GB. Cada thin LV só consome espaço real à medida que escreve dados. O sistema reporta 100 GB disponíveis em df, mas o thin pool só tem 30 GB físicos.

Monitorizar o Thin Pool

# Ver utilização real do thin pool
sudo lvs -o name,data_percent,pool_lv

# Extender o thin pool quando enche
sudo lvextend -L +20G dados/thinpool

⚠ Perigo: Se o thin pool ficar 100% cheio, todos os thin LVs que dependem dele ficam suspensos em I/O — o sistema congela as escritas. Monitoriza data_percent e extende o pool antes de chegar a 80%. Nada disto se recupera automaticamente.

Snapshots de Thin Volumes

Os thin volumes suportam snapshots sem necessidade de pré-alocação — o snapshot consome espaço do mesmo thin pool e cresce conforme necessário. Nunca fica inválido por excesso de escrita (apenas pelo esgotamento do pool).

# Criar snapshot de um thin LV (sem tamanho fixo)
sudo lvcreate -s dados/vm_disk1 -n vm_disk1_snap

# Montar e fazer backup
sudo mount /dev/dados/vm_disk1_snap /mnt/snap
sudo rsync -a /mnt/snap/ /backup/vm1/
sudo umount /mnt/snap
sudo lvremove /dev/dados/vm_disk1_snap

7. Erros Comuns e Checklist

Problema Causa Solução
Snapshot inválido (invalid) LV original alterado mais do que o tamanho do snapshot Criar snapshot maior ou usar thin snapshots
resize2fs falha FS montado em modo só-leitura ou com erros Correr e2fsck -f antes
Thin pool suspenso (I/O freeze) Pool chegou a 100% de utilização Extender o thin pool imediatamente
VG não activa no arranque VG definido como autoactivation=0 vgchange -ay ou ajustar lvm.conf
LV não encontrado Nome errado ou VG não activo Verificar com lvs e vgchange -ay

Checklist LVM

  • ✓ Confirmar o disco correcto com lsblk antes de pvcreate — o comando errado destrói dados.
  • ✓ Usar /dev/mapper/ no /etc/fstab em vez de /dev/dados/ — é estável no arranque.
  • ✓ Usar lvextend -r para extender LV e sistema de ficheiros num só passo.
  • ✓ Remover snapshots depois do backup — não os deixes acumular, consomem espaço e I/O.
  • ✓ Monitorizar data_percent em thin pools — alerta a partir de 80%.
  • ✓ Para reduzir um LV: desmonta → e2fsck -fresize2fs com tamanho menor → lvreduce. Nunca invertas a ordem.
  • ✓ Backup do /etc/fstab e do cabeçalho LVM (vgcfgbackup) antes de operações grandes.

O LVM é uma das ferramentas mais poderosas do Linux para gestão de armazenamento. Dominar PV, VG, LV, snapshots e thin provisioning dá-te flexibilidade que o particionamento tradicional nunca oferece — redimensionamento online, backups consistentes e over-commitment eficiente. No Dia 13 vamos explorar sistemas de ficheiros: ext4, xfs e btrfs, e quando usar cada um.