LVM: volumes lógicos, snapshots e redimensionamento em produção
1. Introdução ao LVM e Conceitos Fundamentais
O Logical Volume Manager (LVM) é uma camada de abstração entre o armazenamento físico e o sistema de arquivos, amplamente utilizado em ambientes de produção por sua flexibilidade e recursos avançados. Diferente das partições tradicionais, que exigem reparticionamento e reinicialização para alterações de tamanho, o LVM permite redimensionar volumes, criar snapshots e gerenciar espaço sem interromper serviços.
Os componentes principais do LVM são:
- Physical Volumes (PVs): Discos físicos ou partições marcadas para uso pelo LVM.
- Volume Groups (VGs): Conjunto de PVs que formam um pool de armazenamento.
- Logical Volumes (LVs): Volumes lógicos criados a partir do espaço disponível no VG, equivalentes a partições tradicionais.
Vantagens em produção incluem: redimensionamento online, snapshots point-in-time, migração de dados entre discos sem parada e gerenciamento centralizado de múltiplos discos.
2. Preparação e Criação de Volumes Lógicos
Para iniciar, identifique os discos disponíveis e prepare-os como PVs:
# Identificar discos
lsblk
# Criar PVs nos discos /dev/sdb e /dev/sdc
pvcreate /dev/sdb /dev/sdc
# Verificar criação
pvdisplay
Crie um Volume Group e aloque extents:
# Criar VG chamado "vg_dados"
vgcreate vg_dados /dev/sdb /dev/sdc
# Verificar VG
vgdisplay vg_dados
Crie Logical Volumes com tamanhos específicos:
# Criar LV de 50G chamado "lv_web"
lvcreate -L 50G -n lv_web vg_dados
# Criar LV usando 100% do espaço restante
lvcreate -l 100%FREE -n lv_backup vg_dados
# Verificar LVs
lvdisplay
Formate e monte os volumes:
# Formatar como ext4
mkfs.ext4 /dev/vg_dados/lv_web
# Montar em /mnt/web
mount /dev/vg_dados/lv_web /mnt/web
# Adicionar ao /etc/fstab para montagem automática
echo "/dev/vg_dados/lv_web /mnt/web ext4 defaults 0 2" >> /etc/fstab
3. Gerenciamento de Volume Groups e Extents
Adicione ou remova discos de um VG existente:
# Adicionar novo disco /dev/sdd ao VG
pvcreate /dev/sdd
vgextend vg_dados /dev/sdd
# Remover PV /dev/sdb (mover dados primeiro)
pvmove /dev/sdb
vgreduce vg_dados /dev/sdb
Movimente extents entre PVs sem interrupção:
# Mover todos extents de /dev/sdb para outros PVs
pvmove /dev/sdb
# Mover extents específicos
pvmove /dev/sdb:1000-2000 /dev/sdd
Redimensione VGs com segurança:
# Expandir VG com novo disco
vgextend vg_dados /dev/sde
# Verificar espaço livre
vgdisplay vg_dados | grep "Free"
4. Redimensionamento de Volumes Lógicos em Produção
Expansão online de um LV sem desmontagem:
# Expandir lv_web em 20G
lvextend -L +20G /dev/vg_dados/lv_web
# Redimensionar sistema de arquivos ext4
resize2fs /dev/vg_dados/lv_web
# Para XFS (requer montagem)
xfs_growfs /mnt/web
Redução segura de um LV (requer desmontagem):
# Desmontar volume
umount /mnt/web
# Verificar sistema de arquivos
e2fsck -f /dev/vg_dados/lv_web
# Reduzir sistema de arquivos para 30G
resize2fs /dev/vg_dados/lv_web 30G
# Reduzir LV para 30G
lvreduce -L 30G /dev/vg_dados/lv_web
# Montar novamente
mount /dev/vg_dados/lv_web /mnt/web
Caso prático: ajustar volume de banco de dados MySQL durante pico de carga:
# Expandir LV do MySQL sem parar serviço
lvextend -L +50G /dev/vg_dados/lv_mysql
resize2fs /dev/vg_dados/lv_mysql
# O MySQL continua operando normalmente
5. Snapshots no LVM: Criação e Gerenciamento
Snapshots são cópias point-in-time que utilizam a técnica copy-on-write (CoW). Crie um snapshot:
# Criar snapshot de 5G para lv_web
lvcreate -L 5G -s -n lv_web_snap /dev/vg_dados/lv_web
# Verificar snapshot
lvdisplay /dev/vg_dados/lv_web_snap
Use snapshots para backups consistentes:
# Montar snapshot (apenas leitura)
mkdir /mnt/snap
mount -o ro /dev/vg_dados/lv_web_snap /mnt/snap
# Realizar backup
tar czf /backup/web_$(date +%Y%m%d).tar.gz /mnt/snap
# Desmontar e remover snapshot
umount /mnt/snap
lvremove /dev/vg_dados/lv_web_snap
Remova ou mescle snapshots em produção:
# Mesclar snapshot com volume original (merge)
lvconvert --merge /dev/vg_dados/lv_web_snap
# O merge ocorre na próxima ativação ou montagem
6. Recuperação de Desastres e Manutenção com Snapshots
Restauração de dados a partir de snapshot:
# Parar serviço que usa o volume
systemctl stop nginx
# Mesclar snapshot para restaurar estado anterior
lvconvert --merge /dev/vg_dados/lv_web_snap
mount /dev/vg_dados/lv_web /mnt/web
# Reiniciar serviço
systemctl start nginx
Migração de dados entre volumes usando snapshots:
# Criar snapshot do volume origem
lvcreate -L 10G -s -n lv_origem_snap /dev/vg_dados/lv_origem
# Montar snapshot e volume destino
mount /dev/vg_dados/lv_origem_snap /mnt/origem
mount /dev/vg_dados/lv_destino /mnt/destino
# Copiar dados
rsync -av /mnt/origem/ /mnt/destino/
# Desmontar e limpar
umount /mnt/origem /mnt/destino
lvremove /dev/vg_dados/lv_origem_snap
Monitore o consumo de espaço dos snapshots:
# Verificar uso do snapshot
lvs -a -o +snap_percent,origin
# Se o snapshot atingir 100%, ele se torna inválido
# Aumentar espaço do snapshot
lvextend -L +2G /dev/vg_dados/lv_web_snap
7. Performance e Boas Práticas em Produção
Alinhamento de partições e striping:
# Criar LV com striping em 2 discos
lvcreate -i 2 -I 64 -L 100G -n lv_stripe vg_dados
# Verificar alinhamento
lvdisplay -m /dev/vg_dados/lv_stripe
Configuração de cache com LVM cache:
# Criar LV para cache (SSD)
lvcreate -L 10G -n lv_cache vg_dados
# Associar cache ao volume lento
lvconvert --type cache --cachepool vg_dados/lv_cache /dev/vg_dados/lv_web
Monitoramento de I/O:
# Monitorar I/O por processo
dstat -d 5
# Monitorar I/O por disco
iostat -x 5
# Logs do LVM
journalctl -u lvm2-lvmetad
Boas práticas:
- Planeje capacidade com folga de 20% para snapshots e crescimento.
- Documente todos os LVs, VGs e PVs em um inventário.
- Realize backups regulares independentes dos snapshots.
- Teste snapshots em ambiente de homologação antes da produção.
8. Troubleshooting e Cenários Comuns
Problema: snapshot com espaço insuficiente (100% utilizado)
# Verificar snapshots problemáticos
lvs -a -o +snap_percent
# Solução: aumentar snapshot
lvextend -L +5G /dev/vg_dados/lv_web_snap
# Se já estiver invalidado, recriar
lvremove /dev/vg_dados/lv_web_snap
lvcreate -L 10G -s -n lv_web_snap /dev/vg_dados/lv_web
Recuperação de VG corrompido:
# Ativar VG manualmente
vgchange -ay vg_dados
# Verificar PVs perdidos
pvscan
# Restaurar metadados de backup
vgcfgrestore -f /etc/lvm/archive/vg_dados_*.vg vg_dados
Erros comuns de redimensionamento:
- Reduzir LV antes do sistema de arquivos → corrupção de dados.
- Esquecer de desmontar antes de reduzir → erro do kernel.
- Não verificar sistema de arquivos antes de reduzir → perda de dados.
Ferramentas de diagnóstico:
# Exibir informações detalhadas
lvdisplay -m /dev/vg_dados/lv_web
vgdisplay -v vg_dados
pvdisplay -m /dev/sdb
# Logs do sistema
dmesg | grep -i lvm
tail -f /var/log/syslog | grep -i lvm
Referências
- Documentação Oficial do LVM (Red Hat) — Guia completo de configuração e gerenciamento de volumes lógicos no RHEL 8.
- LVM HOWTO (Linux Documentation Project) — Tutorial clássico abordando desde conceitos básicos até cenários avançados de snapshots e redimensionamento.
- Gerenciamento de Snapshots LVM (Ubuntu Server Guide) — Guia prático da Canonical com exemplos de criação e merge de snapshots.
- Redimensionamento de Volumes Lógicos (DigitalOcean Tutorial) — Tutorial passo a passo com comandos reais para expansão e redução de LVs.
- LVM Cache e Performance (IBM Documentation) — Documentação técnica sobre configuração de cache LVM para melhorar desempenho de I/O.