Btrfs + Snapper no Arch Linux / CachyOS
O que é Btrfs
Btrfs é um sistema de arquivos moderno que utiliza Copy-on-Write (CoW).
Quando um arquivo é alterado, o Btrfs não sobrescreve os dados existentes imediatamente. Ele grava os dados modificados em outro local e só então atualiza as referências.
Isso permite recursos como:
- Snapshots instantâneos
- Rollback do sistema
- Compressão transparente
- Checksums para detecção de corrupção
- Subvolumes
Subvolumes
Subvolumes são como “mini sistemas de arquivos” dentro da mesma partição Btrfs.
Configuração comum no Arch/CachyOS:
@
@home
@srv
@cache
@snapshots
Normalmente:
@ → /
@home → /home
Por isso um snapshot da raiz não inclui sua pasta pessoal.
Ver os subvolumes existentes:
sudo btrfs subvolume list /
Exemplo:
ID 400 path @
ID 399 path @home
ID 263 path .snapshots
Ver quais subvolumes estão montados:
findmnt -t btrfs
Snapshots
Snapshots são “fotografias” do estado de um subvolume em determinado momento.
Eles são extremamente rápidos porque o Btrfs não copia todos os arquivos.
Criar snapshot somente leitura da raiz:
sudo btrfs subvolume snapshot -r / /.snapshots/root-snap-$(date +%Y-%m-%d_%H-%M)
Criar snapshot da home:
sudo btrfs subvolume snapshot -r /home /home/.snapshots/home-snap-$(date +%Y-%m-%d_%H-%M)
Importante:
Snapshot não é backup.
Se o SSD morrer, os snapshots morrem junto porque estão armazenados no mesmo disco.
Snapper
Snapper automatiza a criação e gerenciamento de snapshots.
Instalação:
sudo pacman -S snapper snap-pac grub-btrfs
Criar configurações:
sudo snapper -c root create-config /
sudo snapper -c home create-config /home
Ativar timers:
sudo systemctl enable --now snapper-timeline.timer
sudo systemctl enable --now snapper-cleanup.timer
Ver configurações existentes:
sudo snapper list-configs
Exemplo:
Config | Subvolume
root | /
home | /home
Criar snapshot manual:
sudo snapper -c root create --description "antes-da-atualizacao"
Listar snapshots:
sudo snapper list
Rollback
Ver snapshots disponíveis:
sudo snapper list
Restaurar snapshot:
sudo snapper rollback N
sudo reboot
Exemplo:
sudo snapper rollback 33
Recuperar arquivo apagado:
sudo cp /.snapshots/33/snapshot/caminho/arquivo .
Comparar snapshots:
sudo snapper diff 33..0
Entendendo o uso real do disco
Em Btrfs, df -h pode enganar porque snapshots compartilham blocos.
Ver uso real:
sudo btrfs filesystem usage /
Exemplo de alerta:
Data,single: Size:437.01GiB, Used:433.74GiB (99.25%)
Acima de 90% merece atenção.
Quanto espaço os snapshots ocupam?
Ver uso total dos snapshots:
sudo btrfs filesystem du -s /.snapshots
Exemplo:
Total: 119.70GiB
Exclusive: 881MiB
Shared: 36.82GiB
Significado:
- Total: tamanho lógico dos arquivos.
- Shared: dados compartilhados com outros snapshots.
- Exclusive: espaço que seria liberado ao apagar os snapshots.
A coluna mais importante é Exclusive.
Ver cada snapshot individualmente:
sudo btrfs filesystem du /.snapshots/*
Serve para descobrir qual snapshot está consumindo espaço.
Apagando snapshots
Nunca use:
rm -rf
Snapshots são subvolumes.
Use:
sudo snapper list
Apagar um snapshot:
sudo snapper delete 20
Apagar vários:
sudo snapper delete 14-94
Home:
sudo snapper -c home list
sudo snapper -c home delete 1-10
O mistério do subvolid=5
Muita gente vê isto:
sudo btrfs subvolume list /
e encontra:
@_backup_2026...
@home_backup_2026...
mas não consegue acessá-los.
Motivo:
O sistema normalmente monta apenas o subvolume padrão (@).
Ver qual é o subvolume padrão:
sudo btrfs subvolume get-default /
Exemplo:
ID 400 path @
Isso significa que você está enxergando apenas o subvolume @, não a raiz real do Btrfs.
Montando a raiz real do Btrfs
Todo sistema Btrfs possui um subvolume especial:
subvolid=5
Ele representa o topo absoluto da árvore Btrfs.
Criar ponto de montagem:
sudo mkdir -p /mnt/btrfs-top
Montar a raiz real:
sudo mount -o subvolid=5 /dev/nvme0n1p2 /mnt/btrfs-top
Agora você consegue enxergar:
sudo ls -lah /mnt/btrfs-top
Exemplo:
@
@home
@srv
@cache
@_backup_2026...
@home_backup_2026...
Desmontar quando terminar:
sudo umount /mnt/btrfs-top
Pense assim:
subvolid=5
│
├── @
├── @home
├── @srv
├── @cache
├── .snapshots
├── @_backup_2026...
└── @home_backup_2026...
Normalmente o sistema monta apenas:
@
Montar o subvolid=5 permite enxergar toda a árvore.
Backups criados pelo rollback
Após um rollback, o Snapper costuma criar subvolumes de segurança:
@_backup_2026-05-31...
@home_backup_2026-05-31...
Eles não aparecem no:
sudo snapper list
mas aparecem em:
sudo btrfs subvolume list /
depois que você monta o subvolid=5.
Remover:
sudo btrfs subvolume delete "/mnt/btrfs-top/@_backup_..."
sudo btrfs subvolume delete "/mnt/btrfs-top/@home_backup_..."
Sincronizar remoção:
sudo btrfs subvolume sync /mnt/btrfs-top
Liberando espaço após exclusões
Às vezes o espaço não aparece imediatamente.
Sincronizar:
sudo btrfs filesystem sync /
Reorganizar chunks parcialmente utilizados:
sudo btrfs balance start -dusage=50 /
Verificar novamente:
df -h
sudo btrfs filesystem usage /
Por que snapshots lotam o SSD?
O Snapper cria snapshots PRE e POST durante atualizações.
Exemplo:
PRE
↓
pacman -Syu
↓
POST
Mesmo uma atualização pequena gera novos snapshots.
Outro caso comum:
- Instala jogo de 50 GB.
- Cria snapshot.
- Remove o jogo.
O snapshot continua preservando aqueles dados antigos.
Resultado: espaço continua ocupado.
Limitar quantidade de snapshots
Editar:
sudo nano /etc/snapper/configs/root
Configuração conservadora:
TIMELINE_LIMIT_HOURLY="3"
TIMELINE_LIMIT_DAILY="3"
TIMELINE_LIMIT_WEEKLY="1"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"
NUMBER_LIMIT="10"
NUMBER_LIMIT_IMPORTANT="5"
Executar limpeza manual:
sudo snapper cleanup number
sudo snapper cleanup timeline
Desativar snapshots automáticos
Desativar completamente:
sudo systemctl disable --now snapper-timeline.timer
sudo systemctl disable --now snapper-cleanup.timer
Ou manter o Snapper instalado sem criar timelines:
TIMELINE_CREATE="no"
Ver timers ativos:
sudo systemctl list-timers | grep snapper
Encontrar quem está ocupando espaço
Cache do pacman:
sudo du -sh /var/cache/pacman/pkg
sudo paccache -rk2
sudo pacman -Scc
Logs:
sudo journalctl --vacuum-time=7d
Diretórios mais pesados:
sudo du -xh / | sort -h | tail -40
Ferramenta interativa:
sudo pacman -S ncdu
sudo ncdu /
Manutenção
Verificar integridade dos dados:
sudo btrfs scrub start -Bd /
Ver estatísticas dos dispositivos:
sudo btrfs device stats /
Resumo
Btrfs
├── CoW → copia antes de alterar
├── Subvolumes → @ e @home separados
├── Snapshots → rollback rápido
├── Snapper → automação
└── grub-btrfs → snapshots no boot
Fluxo normal:
pacman -Syu
↓
PRE snapshot
↓
atualização
↓
POST snapshot
↓
problema?
↓
snapper rollback N
↓
reboot
Fluxo de limpeza:
snapper list
↓
snapper delete <intervalo>
↓
montar subvolid=5
↓
verificar @_backup_* e @home_backup_*
↓
btrfs subvolume delete
↓
btrfs filesystem sync /
↓
btrfs balance start -dusage=50 /
↓
btrfs filesystem usage /