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.

Você vai aprender
  • 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 com scrub.

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çaO que éComparando com o método tradicionalExemplo
vdevUm grupo de discos com uma forma de proteção (espelho, raidz)Um RAIDmirror-0 = sdb + sdc
pool (zpool)Todo o espaço de um ou mais vdevsO VG do LVMtank
datasetUma "pasta especial" dentro do pool, com regras próprias (compressão, cota, snapshots)Um LV já formatado e montadotank/fotos, montado em /tank/fotos
snapshotUma foto de um dataset num instanteSnapshot do LVM, só que instantâneo e sem tamanho reservadotank/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 vdevEquivale aDiscos mín.Aguenta perder
(disco único)Sem proteção1Nenhum
mirrorRAID 12Todos menos um
raidz1RAID 531
raidz2RAID 642

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.

Discos pelo ID, não pelo nome

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 / estadoSignificado
ONLINEFuncionando normalmente
DEGRADEDFunciona, mas perdeu proteção (um disco do espelho falhou)
FAULTED / UNAVAILDisco com defeito / não encontrado
READ / WRITEErros de leitura / gravação no disco
CKSUMDados 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ão zpool).
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

PropriedadeComandoEfeito
Compressãosudo zfs set compression=lz4 tank/backupComprime o que for gravado daqui em diante. O lz4 é tão rápido que costuma até acelerar
Cotasudo zfs set quota=20G tank/fotosO dataset não passa de 20 GB
Reservasudo zfs set reservation=5G tank/backupGarante 5 GB só para ele
Ponto de montagemsudo zfs set mountpoint=/srv/fotos tank/fotosMuda onde aparece
Data de acessosudo zfs set atime=off tankNã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
Atenção

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.

Snapshots automáticos

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

"is in use and contains a … filesystem"
$ 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.

"mountpoint '/tank' exists and is not empty"

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 pool sumiu depois de mover os discos para outro servidor

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.

"dataset is busy" ao destruir

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

ComandoO que faz
sudo zpool create NOME mirror D1 D2Cria pool espelhado
zpool list / zpool statusEspaço / saúde dos pools
zpool status -xSó mostra pools com problema
sudo zpool scrub NOMEConfere todos os dados
sudo zpool replace NOME VELHO NOVOTroca disco
sudo zpool export / import NOMEDesliga / traz pool (mover entre máquinas)
sudo zfs create POOL/DATASETCria dataset
zfs list / zfs list -t snapshotLista datasets / snapshots
sudo zfs set PROP=VALOR DATASETDefine propriedade
zfs get PROP DATASETMostra propriedade
sudo zfs snapshot DATASET@NOMETira snapshot
sudo zfs rollback DATASET@NOMEVolta ao snapshot
sudo zfs destroy DATASET@NOMEApaga snapshot (sem @, apaga o dataset)

Exercícios

1. Pool espelhado

Complete para criar o pool dados espelhando /dev/sdb e /dev/sdc:

sudo zpool create dados /dev/sdb /dev/sdc

2. Snapshot

Complete para tirar um snapshot chamado segunda do dataset dados/docs:

sudo zfs snapshot

3. Compressão

Complete para ligar compressão lz4 no dataset dados/logs:

sudo zfs set 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 D2 cria e já monta; zfs create tank/x cria datasets.
  • zpool status: ONLINE bom, DEGRADED troque o disco com zpool replace.
  • Snapshots são instantâneos; arquivos antigos ficam em .zfs/snapshot; rollback volta tudo.
  • Scrub confere e conserta os dados; treine com arquivos-imagem antes de usar discos reais.