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.
Neste artigo
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
Links — Symbolic vs Hard
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.
- Saber para que servem
/etc,/var,/usr,/tmpe/home— sem consultar a tabela - Montar manualmente uma partição com
mount -t ext4 /dev/sdXN /mnt/pontoe desmontar comumount - Persistir um mount no arranque via
/etc/fstabusando UUID, testar commount -aantes de reiniciar - Adicionar
nofaila mounts de dispositivos amovíveis no fstab - Criar um symlink (
ln -s) e um hard link (ln) e explicar a diferença de comportamento quando o original é apagado - Usar
df -h,du -sh,findmntelsblk -fpara diagnosticar espaço e mounts - Saber que
/proce/syssão sistemas virtuais, não ocupam espaço em disco - Resolver
target is busycomlsof +Dantes de forçar o umount
Artigos Relacionados
- Dia 1: Terminal, Shell e Comandos Essenciais — base de navegação e permissões que este artigo assume
- Dia 3: Gestão de Utilizadores e Grupos no Linux — próxima etapa do curso: criar utilizadores, grupos e configurar sudo
- Active Directory: Diagnóstico de Problemas Comuns — montagens CIFS e integração com partilhas Windows
- Windows Server 2016: Instalar o Servidor Web IIS — comparação com a abordagem Linux para servir ficheiros
- Sistemas Operativos no kbase.pt — mais artigos Linux e administração de sistemas