Ubuntu ZFS
ZFS é um sistema de arquivos e gerenciador de discos ao mesmo tempo. Ele faz sozinho o que, no método tradicional, exige RAID + LVM + ext4: espelha discos, divide o espaço em volumes, comprime, tira snapshots instantâneos e detecta e corrige dados corrompidos. O Ubuntu é uma das poucas distribuições que traz ZFS pronto nos repositórios.
- O que são pool, vdev e dataset no ZFS.
- Montar um laboratório com arquivos, sem discos extras.
- Criar um pool espelhado e ler o
zpool status. - Criar datasets, ligar compressão e definir cotas.
- Tirar snapshots, voltar no tempo (
rollback) e verificar os dados comscrub.
Leia antes RAID e LVM: o ZFS junta as duas ideias. Os exemplos acontecem na máquina fictícia servidor, com os discos /dev/sdb e /dev/sdc.
Conceito: pool, vdev e dataset
| Peça | O que é | Comparando com o método tradicional | Exemplo |
|---|---|---|---|
| vdev | Um grupo de discos com uma forma de proteção (espelho, raidz) | Um RAID | mirror-0 = sdb + sdc |
| pool (zpool) | Todo o espaço de um ou mais vdevs | O VG do LVM | tank |
| dataset | Uma "pasta especial" dentro do pool, com regras próprias (compressão, cota, snapshots) | Um LV já formatado e montado | tank/fotos, montado em /tank/fotos |
| snapshot | Uma foto de um dataset num instante | Snapshot do LVM, só que instantâneo e sem tamanho reservado | tank/fotos@antes |
Duas diferenças importantes em relação ao ext4:
- Não existe "formatar e montar": ao criar o pool e os datasets, eles já aparecem montados.
- Checksums: cada bloco gravado tem uma "impressão digital". Na leitura, o ZFS confere. Se o dado estiver corrompido e houver espelho, ele lê a cópia boa e conserta a ruim sozinho.
| Tipo de vdev | Equivale a | Discos mín. | Aguenta perder |
|---|---|---|---|
| (disco único) | Sem proteção | 1 | Nenhum |
mirror | RAID 1 | 2 | Todos menos um |
raidz1 | RAID 5 | 3 | 1 |
raidz2 | RAID 6 | 4 | 2 |
Instalar e montar o laboratório
$ sudo apt install zfsutils-linux $ zfs version zfs-2.4.1-1ubuntu5.1 zfs-kmod-2.4.1-1ubuntu5.1
O ZFS aceita arquivos como discos, desde que você passe o caminho completo. Para treinar, não precisa nem de losetup:
$ truncate -s 1G z1.img z2.img z3.img $ sudo zpool create lab mirror /home/ana/lab/z1.img /home/ana/lab/z2.img $ zpool list lab NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT lab 960M 116K 960M - - 0% 0% 1.00x ONLINE -
Nos exemplos a seguir, o pool se chama tank (nome tradicional nos tutoriais de ZFS) e usa discos reais. No laboratório, troque tank por lab.
Criar um pool espelhado
- sudo zpool create
- Cria um pool.
- tank
- O nome do pool. Ele será montado em
/tank. - mirror
- O tipo de vdev: os discos seguintes formam um espelho.
- /dev/sdb /dev/sdc
- Os discos inteiros. O ZFS cria as partições sozinho.
$ sudo zpool create tank mirror /dev/sdb /dev/sdc $ df -h /tank Sist. Arq. Tam. Usado Disp. Uso% Montado em tank 49G 128K 49G 1% /tank « já montado, sem mkfs nem mount
Silêncio é sucesso: o zpool create não imprime nada quando dá certo.
Os nomes sdb e sdc podem trocar de lugar depois de reiniciar. Em servidores, use os nomes fixos de /dev/disk/by-id/: ls -l /dev/disk/by-id/ mostra algo como ata-WDC_WD20EFRX_WD-WCC4M1234567.
Ler o zpool status
$ zpool status tank pool: tank state: ONLINE « o pool está saudável config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 « o vdev espelhado sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 errors: No known data errors « nenhum dado corrompido
| Coluna / estado | Significado |
|---|---|
ONLINE | Funcionando normalmente |
DEGRADED | Funciona, mas perdeu proteção (um disco do espelho falhou) |
FAULTED / UNAVAIL | Disco com defeito / não encontrado |
READ / WRITE | Erros de leitura / gravação no disco |
CKSUM | Dados que não bateram com a "impressão digital" (corrupção detectada) |
Para ver só se há algo errado em qualquer pool: zpool status -x, que responde all pools are healthy quando está tudo bem.
Datasets: organizar o pool
Em vez de criar pastas comuns em /tank, crie datasets. Cada um pode ter compressão, cota e snapshots próprios.
- sudo zfs create
- Cria um dataset (repare:
zfs, nãozpool). - tank/fotos
- Pool/nome. Vai aparecer em
/tank/fotos.
$ sudo zfs create tank/fotos $ sudo zfs create tank/backup $ zfs list NAME USED AVAIL REFER MOUNTPOINT tank 660K 48.0G 96K /tank tank/backup 96K 48.0G 96K /tank/backup tank/fotos 96K 48.0G 96K /tank/fotos
USED é o que o dataset e seus filhos ocupam; AVAIL é o que ainda cabe; REFER é o que os dados atuais ocupam (sem contar snapshots).
Regras por dataset: zfs set
| Propriedade | Comando | Efeito |
|---|---|---|
| Compressão | sudo zfs set compression=lz4 tank/backup | Comprime o que for gravado daqui em diante. O lz4 é tão rápido que costuma até acelerar |
| Cota | sudo zfs set quota=20G tank/fotos | O dataset não passa de 20 GB |
| Reserva | sudo zfs set reservation=5G tank/backup | Garante 5 GB só para ele |
| Ponto de montagem | sudo zfs set mountpoint=/srv/fotos tank/fotos | Muda onde aparece |
| Data de acesso | sudo zfs set atime=off tank | Não grava a data de cada leitura (menos escrita) |
$ sudo zfs set compression=lz4 tank/backup $ zfs get compression,compressratio tank/backup NAME PROPERTY VALUE SOURCE tank/backup compression lz4 local tank/backup compressratio 2.31x - « depois de copiar logs: ocupam 2,3 vezes menos
A coluna SOURCE diz de onde veio o valor: local (definido neste dataset), inherited from tank (herdado do pai) ou default.
Snapshots e rollback
Um snapshot do ZFS é instantâneo e, no começo, não ocupa espaço: ele só passa a ocupar conforme os arquivos originais mudam.
- sudo zfs snapshot
- Tira a foto.
- tank/fotos@antes-limpeza
- Dataset +
@+ nome do snapshot.
$ sudo zfs snapshot tank/fotos@antes-limpeza $ zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT tank/fotos@antes-limpeza 0B - 3.20G - « 0B: nada mudou ainda $ rm /tank/fotos/2025/*.jpg « ops, apagou demais
Agora, duas formas de recuperar:
Forma 1: pegar só alguns arquivos de volta
Todo dataset tem uma pasta escondida .zfs/snapshot com o conteúdo de cada snapshot, só para leitura:
$ ls /tank/fotos/.zfs/snapshot/antes-limpeza/2025 | head -3 IMG_0001.jpg IMG_0002.jpg IMG_0003.jpg $ cp /tank/fotos/.zfs/snapshot/antes-limpeza/2025/IMG_0002.jpg /tank/fotos/2025/
Forma 2: voltar o dataset inteiro
$ sudo zfs rollback tank/fotos@antes-limpeza $ ls /tank/fotos/2025 | wc -l 412 « tudo de volta
zfs rollback descarta tudo o que foi gravado depois do snapshot. Se houver snapshots mais novos, ele pede -r, que apaga esses snapshots mais novos.
Para apagar um snapshot que não serve mais: sudo zfs destroy tank/fotos@antes-limpeza. O @ é essencial: zfs destroy tank/fotos (sem @) apaga o dataset inteiro.
O pacote zfs-auto-snapshot tira snapshots a cada 15 minutos, de hora em hora, por dia e por semana, e apaga os antigos sozinho.
Scrub: conferir todos os dados
O scrub lê todos os blocos do pool e confere as impressões digitais. Se achar algo corrompido e houver espelho, conserta. No Ubuntu, um scrub automático já roda todo mês (pacote zfsutils-linux). Para rodar agora:
$ sudo zpool scrub tank $ zpool status tank | grep scan scan: scrub repaired 0B in 00:04:12 with 0 errors on Thu Oct 15 10:40:12 2026
repaired 0B e 0 errors: nada precisou ser consertado.
Trocar um disco com defeito
$ zpool status tank pool: tank state: DEGRADED « perdeu a proteção status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 sdb ONLINE 0 0 0 sdc UNAVAIL 0 0 0 « disco sumiu errors: No known data errors $ sudo zpool replace tank sdc /dev/sdd $ zpool status tank | grep -A1 scan scan: resilver in progress since Thu Oct 15 11:02:40 2026 2.10G / 3.20G scanned, 1.95G / 3.20G issued at 410M/s
Resilver é o nome do ZFS para reconstrução. Note que ele só copia os dados existentes, não o disco inteiro, por isso é mais rápido que no mdadm. O próprio zpool status diz o que fazer na linha action:.
Quando não funciona
$ sudo zpool create tank mirror /dev/sdb /dev/sdc invalid vdev specification use '-f' to override the following errors: /dev/sdb contains a filesystem of type 'ext4'
O que aconteceu: o disco tem um sistema de arquivos antigo. O ZFS não apaga sem você confirmar.
Como resolver: se tem certeza de que pode apagar, repita com -f: sudo zpool create -f tank mirror /dev/sdb /dev/sdc.
O que aconteceu: já existe uma pasta comum /tank com arquivos. O ZFS não monta por cima.
Como resolver: mova ou apague o conteúdo da pasta, ou escolha outro lugar: sudo zpool create -m /srv/dados tank mirror ….
O que aconteceu: pools não são montados automaticamente em outra máquina.
Como resolver: sudo zpool import lista os pools encontrados nos discos; sudo zpool import tank traz o pool. Antes de desligar a máquina antiga, o ideal é rodar sudo zpool export tank.
O que aconteceu: algum programa (ou um terminal com cd lá dentro) está usando o dataset.
Como resolver: saia da pasta e descubra quem usa: sudo lsof /tank/fotos.
Referência rápida
| Comando | O que faz |
|---|---|
sudo zpool create NOME mirror D1 D2 | Cria pool espelhado |
zpool list / zpool status | Espaço / saúde dos pools |
zpool status -x | Só mostra pools com problema |
sudo zpool scrub NOME | Confere todos os dados |
sudo zpool replace NOME VELHO NOVO | Troca disco |
sudo zpool export / import NOME | Desliga / traz pool (mover entre máquinas) |
sudo zfs create POOL/DATASET | Cria dataset |
zfs list / zfs list -t snapshot | Lista datasets / snapshots |
sudo zfs set PROP=VALOR DATASET | Define propriedade |
zfs get PROP DATASET | Mostra propriedade |
sudo zfs snapshot DATASET@NOME | Tira snapshot |
sudo zfs rollback DATASET@NOME | Volta ao snapshot |
sudo zfs destroy DATASET@NOME | Apaga snapshot (sem @, apaga o dataset) |
Exercícios
1. Pool espelhado
Complete para criar o pool dados espelhando /dev/sdb e /dev/sdc:
2. Snapshot
Complete para tirar um snapshot chamado segunda do dataset dados/docs:
3. Compressão
Complete para ligar compressão lz4 no dataset dados/logs:
4. Qual comando apaga o dataset inteiro, e não só um snapshot?
5. O zpool status mostra state: DEGRADED. O que isso significa?
Resumo
- ZFS junta RAID, gerenciador de volumes e sistema de arquivos: pool (com vdevs) → datasets → snapshots.
zpool create tank mirror D1 D2cria e já monta;zfs create tank/xcria datasets.zpool status:ONLINEbom,DEGRADEDtroque o disco comzpool replace.- Snapshots são instantâneos; arquivos antigos ficam em
.zfs/snapshot;rollbackvolta tudo. - Scrub confere e conserta os dados; treine com arquivos-imagem antes de usar discos reais.