Dia 2: Sistema de Ficheiros Linux — FHS, Mounts e Links

O Linux organiza tudo num único trunk: uma só raiz / de onde pendem todos os directórios. O Filesystem Hierarchy Standard (FHS) define o que vai onde — /etc guarda configuração, /var guarda dados variáveis, /home guarda utilizadores. Quem vem do Windows espera um C:\, D:\ por cada disco — no Linux, um disco novo não ganha letra, ganha um ponto de montagem.

Este artigo cobre os três pilares do dia 2: a hierarquia FHS (directórios e convenções), os mounts (como se anexam sistemas de ficheiros à árvore) e os links (symbolic vs hard — dois mecanismos fundamentalmente diferentes para apontar para o mesmo conteúdo). No fim sabe montar um disco em /mnt/backup, persistir isso no arranque via /etc/fstab e perceber porque é que um ln -s sobrevive a um rm do ficheiro original e um hard link não.

A Hierarquia FHS (Filesystem Hierarchy Standard)

O Filesystem Hierarchy Standard é a convenção que mantém o Linux portátil entre distribuições. Sem ele, o Debian podia guardar configuração em /settings, o Fedora em /conf, e nenhum script funcionava em ambos. O FHS resolve isto dizendo: configuração fica em /etc, binários essenciais em /bin e /sbin, dados partilhados só de leitura em /usr/share, dados variáveis em /var. A versão actual é a FHS 3.0, publicada pela Linux Foundation (FHS 3.0 spec).

A árvore começa em / (a raiz). Tudo o resto — discos USB, partições, sistemas de ficheiros de rede NFS, sistemas virtuais do kernel — é montado dentro desta árvore. Não há letras de drive. Um disco novo aparece como uma pasta qualquer, digamos /mnt/disco2, e a partir daí acede-se como qualquer outro directório. Esta ideia — tudo é um ficheiro numa árvore única — é o que distingue o modelo Unix do modelo DOS/Windows.

A man page file-hierarchy(7) do systemd descreve a versão moderna implementada por distribuições que adoptaram o usrmerge — Debian 12+, Fedora, Arch — onde /bin, /sbin, /lib são symlinks para /usr/bin, /usr/sbin, /usr/lib (file-hierarchy(7)). O RHEL 9 e Rocky 9 mantêm os directórios separados por compatibilidade, mas a tendência é convergir tudo em /usr.

Directórios Raiz e o Seu Papel

A tabela seguinte resume os directórios do nível raiz que vais usar todos os dias. Não decore — use-a como referência rápida. A coluna “Conteúdo” indica o tipo de ficheiro que ali vive; a coluna “Exemplo” mostra um caminho real.

Directório Conteúdo Exemplo
/ Raiz — tudo o resto pendura daqui
/bin Binários essenciais para todos os utilizadores /bin/ls, /bin/bash
/sbin Binários de sistema (root) /sbin/mount, /sbin/ip
/etc Configuração do sistema (texto) /etc/fstab, /etc/hostname
/home Directorias pessoais dos utilizadores /home/maria
/root Directoria pessoal do root (não em /home) /root/.bashrc
/usr Aplicações, bibliotecas, documentação (só leitura) /usr/bin/git, /usr/share/doc
/var Dados variáveis: logs, spool, cache, bases de dados /var/log/syslog, /var/lib/mysql
/tmp Ficheiros temporários (apagado no reboot em muitos sistemas) /tmp/build-1234
/dev Device files (discos, terminais, null) /dev/sda1, /dev/null
/proc Sistema virtual: processos e estado do kernel /proc/cpuinfo, /proc/mounts
/sys Sistema virtual: hardware e módulos do kernel /sys/class/net
/mnt Ponto de montagem temporário (admin) /mnt/usb
/media Montagem automática de dispositivos amovíveis /media/maria/PENDRIVE
/opt Software opcional de terceiros (auto-contido) /opt/google/chrome
/run Dados de runtime (sockets, PIDs) — tmpfs, volátil /run/sshd.pid

Quatro directórios merecem atenção especial porque não existem em disco: /proc, /sys, /dev e /run. São sistemas de ficheiros virtuais montados pelo kernel — ler /proc/cpuinfo não vai a disco nenhum, o kernel gera o conteúdo no momento. Isto é o “tudo é um ficheiro” levado a sério: o estado do hardware, dos processos e das ligações de rede é exposto como ficheiros de texto.

Mounts — Como o Linux Anexa Sistemas de Ficheiros

No Linux, montar é o acto de anexar um sistema de ficheiros (uma partição formatada, uma partilha NFS, um pen drive USB) a um directório da árvore. O directório de destino — o ponto de montagem — pode ser qualquer pasta vazia. Depois de montado, navegar para essa pasta mostra o conteúdo do sistema de ficheiros montado; antes de montar, mostra o conteúdo que estava na pasta (ou nada, se estava vazia).

O comando mount é a ferramenta manual. Por baixo, o kernel mantém uma tabela dos mounts activos visível em /proc/mounts (mount(8)). O exemplo típico: montar um pen drive formatado em ext4 que apareceu como /dev/sdb1.

Criar o ponto de montagem e montar manualmente. O -t ext4 declara o tipo de sistema de ficheiros; em muitos casos o kernel detecta-o automaticamente, mas declará-lo evita ambiguidades.

# Criar o ponto de montagem (uma pasta vazia)
sudo mkdir -p /mnt/usb

# Montar a partição /dev/sdb1 nesse ponto
sudo mount -t ext4 /dev/sdb1 /mnt/usb

# Verificar o resultado
mount | grep /mnt/usb
# Esperado: /dev/sdb1 on /mnt/usb type ext4 (rw,relatime)

# Desmontar quando já não for necessário
sudo umount /mnt/usb

Parâmetros-chave do comando acima: -t ext4 força o tipo de sistema de ficheiros; /dev/sdb1 é o device file que representa a primeira partição do segundo disco; /mnt/usb é o ponto de montagem — o directório onde o conteúdo passa a ser acessível. As opções entre parêntesis no output (rw,relatime) são flags de montagem: rw = leitura e escrita, relatime = actualiza o access-time do inode apenas em escritas (optimização de performance).

Opções de montagem frequentes. A tabela resume as flags que aparecem no mount e no fstab — vale a pena conhecê-las porque controlam segurança e performance.

Opção Efeito
ro Só leitura — útil para logs arquivados ou evidência forense
rw Leitura e escrita (default)
noexec Proíbe executar binários deste mount — boa prática para /tmp e /dev/shm
nosuid Ignora bits SUID/SGID — segurança em mounts de dados
nodev Ignora device files — segurança em mounts não-root
noatime Não actualiza o access-time — ganho de performance em SSDs
relatime Access-time só se for mais recente que o modify-time (default moderno)
bind Cria um segundo ponto de acesso ao mesmo conteúdo (mount bind)

Atenção: se desmontar um mount que está em uso (ficheiros abertos, processo com working dir lá dentro), o umount falha com target is busy. Use lsof +D /mnt/usb ou fuser -vm /mnt/usb para identificar quem segura o mount antes de forçar.

Montar um pen drive FAT32 com opções de segurança. Dispositivos amovíveis costumam usar FAT ou exFAT, que não suportam permissões Unix — as opções uid, gid, dmask e fmask aplicam permissões simuladas a todos os ficheiros.

# Montar pen drive FAT32: dono = maria (uid 1000), sem exec
sudo mount -t vfat -o uid=1000,gid=1000,dmask=027,fmask=137,noexec /dev/sdb1 /mnt/usb

uid=1000 e gid=1000 definem o dono e grupo de todos os ficheiros (tipicamente o primeiro utilizador não-root em Debian/Ubuntu). dmask=027 dá às directorias permissões rwxr-x--- e fmask=137 aos ficheiros rw-r-x---. noexec impede executar binários do pen — protecção básica contra malware que se propaga via USB.

/etc/fstab — Persistir Mounts no Arranque

Mounts manuais via mount desaparecem no reboot. Para que um disco seja montado automaticamente no arranque, adiciona-se uma linha ao /etc/fstab — o ficheiro de configuração que o systemd lê no boot para montar tudo. O formato tem seis campos separados por espaços ou tabs (fstab(5), Arch Wiki: fstab).

Campo Significado Exemplo
1 — Device Device file, UUID, LABEL ou PARTUUID UUID=a1b2c3...
2 — Mount point Directoria onde montar /mnt/backup
3 — Type Tipo de sistema de ficheiros ext4, xfs, nfs
4 — Options Opções de montagem (vírgula-separated) defaults,noatime
5 — Dump Flag obsoleto para o comando dump (0 = ignorar) 0
6 — Pass Ordem de verificação fsck no boot (0 = não verificar, 1 = raiz, 2 = outros) 2

Exemplo real: montar uma partição de backup em ext4 no arranque. Primeiro, descobrir o UUID da partição — o UUID é preferível a /dev/sdb1 porque é estável mesmo que a ordem dos discos mude no BIOS.

# Descobrir o UUID da partição
sudo blkid /dev/sdb1
# Esperado: /dev/sdb1: UUID="a1b2c3d4-..." BLOCK_SIZE="4096" TYPE="ext4"

# Adicionar ao /etc/fstab (uma linha)
echo 'UUID=a1b2c3d4-0000-0000-0000-000000000000 /mnt/backup ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstab

# Criar o ponto de montagem
sudo mkdir -p /mnt/backup

# Testar SEM rebootar: monta tudo do fstab que ainda não está montado
sudo mount -a

# Se não houver erro, o mount está persistente.
# Verificar:
findmnt /mnt/backup
# Esperado: TARGET SOURCE FSTYPE OPTIONS
#           /mnt/backup /dev/sdb1 ext4 rw,noatime

blkid mostra o UUID, tipo e block size de cada partição. tee -a acrescenta a linha ao fstab sem o truncar (usar >> com sudo precisa de tee porque o redirect é feito pelo shell do utilizador, não pelo sudo). mount -a é o teste crítico: monta tudo do fstab sem reiniciar, pelo que se a sintaxe estiver errada o sistema não fica inacessível no próximo boot.

Atenção: um fstab mal configurado pode impedir o arranque. Se o sistema entrar em emergency mode por causa de um mount que falha, adicione nofail às opções para que o boot continue mesmo se o device não estiver presente. Isto é mandatório para discos USB ou NFS que podem não estar disponíveis no arranque.

Exemplo com nofail e x-systemd.automount — ideal para partilhas NFS ou discos externos que podem não estar prontos no boot. O systemd só monta quando o directório é acedido pela primeira vez.

# Partilha NFS com automount e nofail
nas.example.com:/exports/dados /mnt/nas nfs defaults,nofail,x-systemd.automount,x-systemd.idle-timeout=5min 0 0

O Linux tem dois tipos de link — e a diferença é estrutural, não cosmética. Um symbolic link (symlink) é um atalho: um ficheiro especial que contém um caminho textual para outro ficheiro. Um hard link é um segundo nome para o mesmo inode — dois ficheiros que apontam para o mesmo conteúdo no disco, indistinguíveis um do outro (ln(1), link(2)).

Para perceber a diferença, é preciso saber o que é um inode. Cada ficheiro num sistema de ficheiros Unix tem um inode — uma estrutura no disco que guarda os metadados (permissões, dono, datas, tamanho) e os ponteiros para os blocos de dados. O nome do ficheiro no directório é apenas uma entrada que mapeia esse nome para um número de inode. Um hard link é uma segunda entrada de directório que aponta para o mesmo inode; um symlink é um ficheiro novo cujo conteúdo é o caminho para outro ficheiro. A coluna Links do ls -l mostra quantas entradas de directório apontam para o mesmo inode — o link count.

Característica Symbolic link (symlink) Hard link
O que é Ficheiro com um caminho textual Segunda entrada para o mesmo inode
Se apagar o original Symlink quebra (dangling) Conteúdo permanece acessível
Cross-filesystem Sim (pode apontar para outro mount) Não (mesmo filesystem)
Directórios Sim (pode apontar para pasta) Não (proibido para evitar ciclos)
Comando ln -s alvo nome ln alvo nome
Tamanho Tamanho do caminho (bytes) 0 bytes extra (mesmo inode)

Demonstração prática: criar ambos os tipos e observar o comportamento. Vamos criar um ficheiro original, um symlink e um hard link, e ver o que acontece quando apagamos o original.

# Criar o ficheiro original
echo "conteudo importante" > original.txt

# Criar symlink e hard link
ln -s original.txt soft.link
ln original.txt hard.link

# Inspecionar inodes
ls -li original.txt soft.link hard.link
# Esperado:
# 1234567 -rw-r--r-- 2 user user 19 ... original.txt
# 1234568 lrwxrwxrwx 1 user user 12 ... soft.link -> original.txt
# 1234567 -rw-r--r-- 2 user user 19 ... hard.link
# Repare: original.txt e hard.link partilham o inode 1234567 (link count = 2)
#         soft.link tem inode diferente (1234568) e mostra "->"

# Ler ambos
cat soft.link   # "conteudo importante"
cat hard.link   # "conteudo importante"

# Apagar o original
rm original.txt

# Agora:
cat soft.link   # cat: soft.link: No such file or directory  (symlink quebrado)
cat hard.link   # "conteudo importante"  (conteudo ainda acessivel via hard link)

A lição: o hard link não é uma cópia — é o mesmo ficheiro visto por outro nome. O symlink é um ponteiro indireto. Use symlinks quando precisa de atalhar para directórios ou para outros mounts (ex: /bin → /usr/bin em sistemas com usrmerge). Use hard links quando quer que o conteúdo sobreviva à remoção do nome original — tipicamente em backups incrementais (rsync usa hard links com --link-dest) e em snapshots de sistemas de ficheiros.

Nota: para ver os inodes e confirmar que dois ficheiros partilham o mesmo, use ls -li (primeira coluna = número de inode) ou stat ficheiro para metadados completos (stat(2)). O comando readlink soft.link mostra o caminho para onde o symlink aponta.

Comandos de Diagnóstico: df, du, findmnt, lsblk

Quatro comandos dão a visão completa do estado dos mounts e do uso de disco. df mostra espaço livre por sistema de ficheiros; du mostra tamanho ocupado por directória; findmnt lista a árvore de mounts de forma legível; lsblk mostra dispositivos de bloco e as suas partições.

# Espaco livre por filesystem (legivel)
df -h
# Esperado:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda2        50G   18G   30G  38% /
# /dev/sda1       511M  6.1M  505M   2% /boot/efi
# tmpfs           3.9G     0  3.9G   0% /dev/shm

# Tamanho ocupado por uma directoria (resumido, profundidade 1)
du -sh /var/* 2>/dev/null | sort -rh | head
# Esperado:
# 4.2G  /var/log
# 1.8G  /var/lib
# 500M /var/cache

# Arvore de mounts (formato arvore)
findmnt
# Esperado: arvore hierarquica com TARGET, SOURCE, FSTYPE, OPTIONS

# Dispositivos de bloco e particoes
lsblk -f
# Esperado:
# NAME FSTYPE LABEL UUID MOUNTPOINT
# sda
# ├─sda1 vfat BOOT ... /boot/efi
# └─sda2 ext4 root ... /

df -h mostra tamanho, usado, disponível e percentagem de uso por mount — a flag -h converte para KB/MB/GB legíveis (df(1)). du -sh soma o tamanho de cada directória — -s resume, -h human-readable, sort -rh ordena por tamanho descendente (du(1)). findmnt é a forma moderna de ver os mounts em árvore — mais legível que mount sem argumentos (findmnt(8)). lsblk -f mostra discos, partições, filesystem types e UUIDs — útil antes de editar o fstab.

Erros Comuns

Problema Causa Solução
umount: target is busy Há processos ou ficheiros abertos no mount lsof +D /mnt/usb para ver quem segura; fechar ou matar o processo; ou umount -l (lazy umount)
Sistema entra em emergency mode no boot Linha do fstab refere um device que não está presente Adicionar nofail às opções; ou comentar a linha no modo de recuperação
Symlink torna-se vermelho/quebrado Ficheiro alvo foi apagado ou movido Recriar o alvo ou recriar o symlink com ln -sf novo_alvo link
mount: wrong fs type, bad option, bad superblock Tipo declarado não corresponde ao real, ou partição não formatada Confirmar com blkid e usar o tipo correcto; se necessário formatar com o utilitário apropriado
Device USB muda de /dev/sdb para /dev/sdc após reboot Ordem de detecção de discos varia no arranque Usar UUID= ou PARTUUID= no fstab em vez de device files
ln: failed to create hard link Tentou criar hard link entre filesystems diferentes ou para um directório Hard links só funcionam dentro do mesmo filesystem e para ficheiros (não directórios); usar symlink nesses casos
Ficheiros em mount USB sem permissões de dono Filesystem FAT/exFAT não suporta permissões Unix Montar com uid=,gid=,dmask=,fmask= para simular permissões

Checklist Rápido

Antes de avançar para o Dia 3, confirme que domina os pontos seguinte. Cada item tem um link para a secção relevante do artigo.

  1. Saber para que servem /etc, /var, /usr, /tmp e /home — sem consultar a tabela
  2. Montar manualmente uma partição com mount -t ext4 /dev/sdXN /mnt/ponto e desmontar com umount
  3. Persistir um mount no arranque via /etc/fstab usando UUID, testar com mount -a antes de reiniciar
  4. Adicionar nofail a mounts de dispositivos amovíveis no fstab
  5. Criar um symlink (ln -s) e um hard link (ln) e explicar a diferença de comportamento quando o original é apagado
  6. Usar df -h, du -sh, findmnt e lsblk -f para diagnosticar espaço e mounts
  7. Saber que /proc e /sys são sistemas virtuais, não ocupam espaço em disco
  8. Resolver target is busy com lsof +D antes de forçar o umount

Artigos Relacionados