Dia 12: LVM em Profundidade no Linux — PV, VG, LV e Snapshots
NESTE ARTIGO
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
lsblkantes depvcreate— o comando errado destrói dados. - ✓ Usar
/dev/mapper/no/etc/fstabem vez de/dev/dados/— é estável no arranque. - ✓ Usar
lvextend -rpara 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_percentem thin pools — alerta a partir de 80%. - ✓ Para reduzir um LV: desmonta →
e2fsck -f→resize2fscom tamanho menor →lvreduce. Nunca invertas a ordem. - ✓ Backup do
/etc/fstabe 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.