Ubuntu LVM
LVM (Logical Volume Manager, "gerenciador de volumes lógicos") é uma camada entre os discos e os sistemas de arquivos. Com ele, você junta vários discos num "bolo" de espaço e corta pedaços do tamanho que quiser. A maior vantagem: dá para aumentar uma partição com o servidor ligado, sem formatar nada.
- O que são PV, VG e LV, com uma analogia simples.
- Como montar um laboratório de LVM com arquivos, sem discos extras.
- Criar, aumentar e remover volumes com
pvcreate,vgcreate,lvcreateelvextend. - Aproveitar o espaço que o instalador do Ubuntu Server deixa sobrando.
- Tirar um snapshot antes de uma mudança arriscada e voltar atrás.
Você já deve conhecer Particionar e Formatar e mount e fstab. Os exemplos acontecem na máquina fictícia servidor, com dois discos novos: /dev/sdb e /dev/sdc, de 50 GB cada.
Conceito: caixas d'água e torneiras
Sem LVM, cada partição é um pedaço fixo de um disco. Se ela encher, você precisa mover dados ou reformatar. O LVM troca essa rigidez por três camadas:
| Camada | Sigla | Analogia | Exemplo |
|---|---|---|---|
| Volume físico | PV (physical volume) | Cada caixa d'água | /dev/sdb, /dev/sdc |
| Grupo de volumes | VG (volume group) | As caixas ligadas por canos, formando um reservatório só | dados (100 GB) |
| Volume lógico | LV (logical volume) | Cada torneira, com a vazão que você escolher | arquivos (20 GB), backup (30 GB) |
O sistema de arquivos (ext4, xfs) fica dentro do LV, como ficaria dentro de uma partição. A diferença é que o LV pode crescer enquanto houver espaço livre no VG, e o VG pode crescer quando você adiciona outro disco.
disco /dev/sdb (50G) disco /dev/sdc (50G) ← PVs
\ /
+---- VG "dados" (100G) ----+ ← VG
| | |
LV arquivos LV backup (livre 50G) ← LVs
ext4 ext4
/srv/arquivos /srv/backup ← montagem
O instalador do Ubuntu Server usa LVM por padrão. Rode sudo lvs: se aparecer ubuntu-lv no grupo ubuntu-vg, seu sistema está num volume lógico.
Laboratório seguro com losetup
Para treinar sem discos extras, crie dois arquivos e transforme-os em "discos" com losetup (de loop setup). Um dispositivo loop faz um arquivo se comportar como um disco.
- sudo losetup
- O programa que liga arquivos a dispositivos loop.
- -f
- find: usa o primeiro
/dev/loopNlivre. - --show
- Mostra qual nome foi usado.
- disco1.img
- O arquivo que vai virar disco.
$ truncate -s 2G disco1.img disco2.img $ sudo losetup -f --show disco1.img [sudo: authenticate] Senha: /dev/loop20 « o número varia: os snaps já usam vários loops $ sudo losetup -f --show disco2.img /dev/loop21
Nos exemplos abaixo, troque /dev/sdb e /dev/sdc por /dev/loop20 e /dev/loop21. Ao terminar, desmonte tudo, remova o VG (seção "Remover") e solte os loops com sudo losetup -d /dev/loop20 /dev/loop21. Instale o LVM se ainda não tiver: sudo apt install lvm2.
Passo 1: criar os volumes físicos (PV)
Marcar um disco como PV grava um pequeno cabeçalho do LVM no início dele.
- sudo pvcreate
- "physical volume create": prepara discos para o LVM.
- /dev/sdb /dev/sdc
- Os discos (ou partições). Pode passar vários de uma vez.
$ sudo pvcreate /dev/sdb /dev/sdc Physical volume "/dev/sdb" successfully created. Physical volume "/dev/sdc" successfully created. $ sudo pvs PV VG Fmt Attr PSize PFree /dev/sda3 ubuntu-vg lvm2 a-- <62,00g 0 « o disco do sistema (já em uso) /dev/sdb lvm2 --- 50,00g 50,00g « novo, ainda sem grupo (coluna VG vazia) /dev/sdc lvm2 --- 50,00g 50,00g
pvcreate inutiliza o que estiver no disco. Confira com lsblk que /dev/sdb é mesmo o disco novo.
Passo 2: criar o grupo (VG)
- sudo vgcreate
- "volume group create".
- dados
- O nome do grupo. Você escolhe.
- /dev/sdb /dev/sdc
- Os PVs que formam o grupo.
$ sudo vgcreate dados /dev/sdb /dev/sdc Volume group "dados" successfully created $ sudo vgs VG #PV #LV #SN Attr VSize VFree dados 2 0 0 wz--n- 99,99g 99,99g « 2 discos, 0 volumes, quase 100 GB livres ubuntu-vg 1 1 0 wz--n- <62,00g 0
Lendo as colunas: #PV é a quantidade de discos, #LV a de volumes lógicos, #SN a de snapshots, VSize o tamanho total e VFree o espaço ainda não usado. O < antes de um número significa "um pouco menos que".
Passo 3: criar o volume lógico (LV)
- sudo lvcreate
- "logical volume create".
- -n arquivos
-n(name): o nome do volume.- -L 20G
-L(maiúsculo): tamanho exato, 20 GB.- dados
- O grupo de onde sai o espaço.
$ sudo lvcreate -n arquivos -L 20G dados Logical volume "arquivos" created. $ sudo lvs dados LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert arquivos dados -wi-a----- 20,00g
O volume aparece como um dispositivo com dois nomes, que apontam para o mesmo lugar:
$ ls -l /dev/dados/arquivos /dev/mapper/dados-arquivos lrwxrwxrwx 1 root root 7 Oct 15 10:30 /dev/dados/arquivos -> ../dm-1 lrwxrwxrwx 1 root root 7 Oct 15 10:30 /dev/mapper/dados-arquivos -> ../dm-1
Tamanho fixo ou porcentagem?
| Forma | Exemplo | Significado |
|---|---|---|
-L tamanho | -L 20G | Exatamente 20 GB |
-l porcentagem do livre | -l 50%FREE | Metade do espaço livre do VG |
-l tudo | -l 100%FREE | Todo o espaço livre que sobrou |
-l porcentagem do grupo | -l 30%VG | 30% do tamanho total do VG |
Passo 4: formatar e montar
Daqui em diante, o LV é tratado como qualquer partição:
$ sudo mkfs.ext4 -L arquivos /dev/dados/arquivos mke2fs 1.47.2 (1-Jan-2025) A criar sistema de ficheiros com 5242880 4k blocos e 1310720 inodes … $ sudo mkdir -p /srv/arquivos $ sudo mount /dev/dados/arquivos /srv/arquivos $ df -h /srv/arquivos Sist. Arq. Tam. Usado Disp. Uso% Montado em /dev/mapper/dados-arquivos 20G 24K 19G 1% /srv/arquivos
Para montar sempre no boot, adicione ao /etc/fstab (no LVM, o caminho /dev/mapper/… é estável, e o UUID também funciona):
/dev/mapper/dados-arquivos /srv/arquivos ext4 defaults,nofail 0 2
Aumentar um volume com o sistema ligado
Esta é a razão de existir do LVM. O volume arquivos está quase cheio e o VG tem espaço livre:
- sudo lvextend
- "logical volume extend": aumenta um LV.
- -r
- resizefs: aumenta também o sistema de arquivos. Sem ele, o LV cresce mas o
dfcontinua mostrando o tamanho antigo. - -L +10G
- Com
+: acrescenta 10 GB. Sem+(-L 30G), define o tamanho final. - dados/arquivos
- Qual volume: grupo/volume.
$ sudo lvextend -r -L +10G dados/arquivos Size of logical volume dados/arquivos changed from 20,00 GiB (5120 extents) to 30,00 GiB (7680 extents). Extending file system ext4 to 30,00 GiB (32212254720 bytes) on dados/arquivos... resize2fs 1.47.2 (1-Jan-2025) Filesystem at /dev/mapper/dados-arquivos is mounted on /srv/arquivos; on-line resizing required old_desc_blocks = 3, new_desc_blocks = 4 The filesystem on /dev/mapper/dados-arquivos is now 7864320 (4k) blocks long. Extended file system ext4 on dados/arquivos. Logical volume dados/arquivos successfully resized. $ df -h /srv/arquivos Sist. Arq. Tam. Usado Disp. Uso% Montado em /dev/mapper/dados-arquivos 30G 24K 28G 1% /srv/arquivos « cresceu sem desmontar
As mensagens exatas variam com a versão do lvm2; o que importa são as duas últimas linhas, que confirmam o sistema de arquivos e o volume aumentados.
Formas diferentes de aumentar
| Forma | Comando | Quando usar |
|---|---|---|
| Num passo só | sudo lvextend -r -L +10G dados/arquivos | Sempre que possível |
| Usar todo o livre | sudo lvextend -r -l +100%FREE dados/arquivos | Esse é o único volume que precisa crescer |
| Em dois passos | sudo lvextend -L +10G dados/arquivos e depois sudo resize2fs /dev/dados/arquivos | Você esqueceu o -r (no xfs, o segundo passo é sudo xfs_growfs /srv/arquivos) |
Acabou o espaço do grupo? Adicione um disco
$ sudo pvcreate /dev/sdd Physical volume "/dev/sdd" successfully created. $ sudo vgextend dados /dev/sdd Volume group "dados" successfully extended $ sudo vgs dados VG #PV #LV #SN Attr VSize VFree dados 3 1 0 wz--n- <149,99g 119,99g « 3 discos agora
Encolher (lvreduce) exige desmontar, e um erro de tamanho destrói dados. O xfs não pode ser encolhido. Se precisar, faça backup antes e use lvreduce -r, que reduz o sistema de arquivos junto.
Cenário real: o Ubuntu Server "usou só metade do disco"
O instalador do Ubuntu Server cria o volume do sistema com só parte do espaço, de propósito, para deixar folga. Muita gente estranha:
$ df -h / Sist. Arq. Tam. Usado Disp. Uso% Montado em /dev/mapper/ubuntu--vg-ubuntu--lv 98G 12G 82G 13% / « o disco tem 200 GB! $ sudo vgs VG #PV #LV #SN Attr VSize VFree ubuntu-vg 1 1 0 wz--n- <198,00g 100,00g « 100 GB guardados
O espaço não sumiu: está livre no VG. Para entregar tudo ao /:
$ sudo lvextend -r -l +100%FREE ubuntu-vg/ubuntu-lv Size of logical volume ubuntu-vg/ubuntu-lv changed from 100,00 GiB (25600 extents) to <198,00 GiB (50687 extents). … Logical volume ubuntu-vg/ubuntu-lv successfully resized. $ df -h / Sist. Arq. Tam. Usado Disp. Uso% Montado em /dev/mapper/ubuntu--vg-ubuntu--lv 195G 12G 175G 7% /
Repare nos traços dobrados em ubuntu--vg-ubuntu--lv: no /dev/mapper, o traço separa grupo e volume, então um traço que faz parte do nome vira --.
Snapshots: uma foto antes da mudança
Um snapshot congela o estado de um volume. Útil antes de uma atualização arriscada: se der errado, você volta. Ele só guarda o que mudou depois da foto, por isso pode ser bem menor que o original.
- sudo lvcreate
- O mesmo comando de criar volume.
- -s
- snapshot: cria uma foto, não um volume novo vazio.
- -n arquivos-antes
- Nome do snapshot.
- -L 5G
- Espaço para guardar as mudanças. Se encher, o snapshot fica inválido.
- dados/arquivos
- O volume a fotografar.
$ sudo lvcreate -s -n arquivos-antes -L 5G dados/arquivos Logical volume "arquivos-antes" created. $ sudo lvs dados LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert arquivos dados owi-aos--- 30,00g arquivos-antes dados swi-a-s--- 5,00g arquivos 0,01 « Data%: quanto do snapshot já foi usado
Agora você faz a mudança arriscada. Depois, uma de duas:
| Deu certo | Deu errado |
|---|---|
Apague o snapshot: sudo lvremove dados/arquivos-antes | Volte no tempo: sudo lvconvert --merge dados/arquivos-antes. Se o volume estiver em uso, a volta acontece na próxima vez que ele for ativado (desmonte e monte de novo, ou reinicie). |
O snapshot fica nos mesmos discos. Se o disco quebrar, a foto vai junto. Use-o para mudanças rápidas e mantenha backups de verdade (veja Backup).
Remover volumes e grupos
A ordem é a inversa da criação: desmonte, remova o LV, depois o VG, depois os PVs.
$ sudo umount /srv/arquivos $ sudo lvremove dados/arquivos Do you really want to remove active logical volume dados/arquivos? [y/n]: y Logical volume "arquivos" successfully removed. $ sudo vgremove dados Volume group "dados" successfully removed $ sudo pvremove /dev/sdb /dev/sdc Labels on physical volume "/dev/sdb" successfully wiped. Labels on physical volume "/dev/sdc" successfully wiped.
lvremove apaga o volume e tudo dentro dele. Lembre de tirar a linha correspondente do /etc/fstab.
Quando não funciona
$ sudo lvextend -r -L +80G dados/arquivos Insufficient free space: 20480 extents needed, but only 17919 available
O que aconteceu: o VG não tem espaço livre suficiente. Extents são os "tijolos" de 4 MB em que o LVM divide o espaço.
Como confirmar: sudo vgs dados, coluna VFree.
Como resolver: peça menos (-l +100%FREE usa tudo o que há) ou adicione um disco com pvcreate + vgextend.
$ sudo pvcreate /dev/sdb Cannot use /dev/sdb: device is partitioned
O que aconteceu: o disco tem uma tabela de partições (ou restos de outro formato). O LVM se recusa a usar o disco inteiro para não apagá-la por engano.
Como resolver: use uma partição (/dev/sdb1) ou, se o disco pode ser apagado, limpe-o com sudo wipefs -a /dev/sdb e tente de novo.
df mostra o tamanho antigo
O que aconteceu: o lvextend rodou sem -r. O volume cresceu, mas o sistema de arquivos dentro dele não.
Como resolver: sudo resize2fs /dev/dados/arquivos (ext4) ou sudo xfs_growfs /srv/arquivos (xfs). Os dois funcionam com o volume montado.
O que aconteceu: o pacote lvm2 não está instalado (comum no Ubuntu Desktop).
Como resolver: sudo apt install lvm2.
Referência rápida
| Comando | O que faz |
|---|---|
sudo pvcreate /dev/sdb | Prepara um disco ou partição como PV |
sudo pvs / sudo pvdisplay | Lista PVs (resumo / detalhado) |
sudo vgcreate NOME /dev/sdb … | Cria um grupo |
sudo vgextend NOME /dev/sdd | Adiciona disco ao grupo |
sudo vgs / sudo vgdisplay | Lista grupos |
sudo lvcreate -n LV -L 20G VG | Cria volume de 20 GB |
sudo lvcreate -n LV -l 100%FREE VG | Cria volume com todo o espaço livre |
sudo lvextend -r -L +10G VG/LV | Aumenta volume e sistema de arquivos |
sudo lvreduce -r -L -5G VG/LV | Diminui (com cuidado e backup) |
sudo lvcreate -s -n SNAP -L 5G VG/LV | Cria snapshot |
sudo lvconvert --merge VG/SNAP | Volta o volume ao estado do snapshot |
sudo lvs / sudo lvdisplay | Lista volumes |
sudo lvremove VG/LV · vgremove · pvremove | Remove volume, grupo, PV |
Exercícios
1. A ordem das camadas
Complete a ordem das camadas, usando as siglas:
2. Aumentar sem esquecer o sistema de arquivos
Complete para acrescentar 15 GB ao volume web do grupo dados, aumentando o ext4 junto:
3. Todo o espaço livre
Complete para criar o volume backup usando todo o espaço livre do grupo dados:
4. Depois de sudo lvextend -L +10G dados/arquivos (sem -r), o df -h mostra o tamanho antigo. Por quê?
5. Para que serve um snapshot LVM?
Resumo
- LVM tem três camadas: PV (discos) → VG (o reservatório) → LV (os volumes que você formata e monta).
lvextend -raumenta volume e sistema de arquivos juntos, com tudo montado.- Sem espaço no VG?
pvcreate+vgextendcom um disco novo. - No Ubuntu Server,
lvextend -r -l +100%FREE ubuntu-vg/ubuntu-lvusa o espaço que o instalador deixou livre. - Snapshots ajudam em mudanças arriscadas, mas não substituem backup.
- Treine com
truncate+losetupantes de mexer em discos reais.