Administração Linux
O sistema de arquivos do Linux: hierarquia, caminhos, links, montagens e discos
Iniciante12 min de leituraAtualizado
Esta página foi traduzida do inglês com a ajuda de IA e conferida com o original. Ler a versão em inglês
Ao final deste guia, você vai saber para que serve cada diretório de primeiro nível, como ler uma linha do ls -l, por que hard links e links simbólicos se comportam de forma diferente, como as partições são anexadas à árvore com mount e /etc/fstab, e como descobrir para onde foi o espaço em disco. Os exemplos são para sistemas Debian/Ubuntu e da família RHEL atuais.
O que você vai aprender
- Descrever a função dos principais diretórios da FHS, como /etc, /var, /usr, /opt, /proc e /run
- Ler uma linha do ls -l e identificar o tipo de arquivo, as permissões, a contagem de links, o dono e o tamanho
- Explicar a diferença entre um hard link e um link simbólico e escolher o adequado
- Inspecionar dispositivos de bloco e montagens com lsblk, findmnt e df, e adicionar uma entrada persistente ao /etc/fstab
- Localizar arquivos com find e medir o tamanho de diretórios com du
O Linux não tem letras de unidade. Existe uma única árvore, com raiz em /, e cada disco, pendrive, compartilhamento de rede e até a contabilidade interna do kernel é enxertado nela em algum ponto. Depois que você conhece as convenções sobre onde cada coisa fica, um servidor desconhecido deixa de ser um labirinto: a configuração está em /etc, os dados variáveis em /var, a visão ao vivo que o kernel tem da máquina em /proc, e assim por diante. Este guia percorre a árvore, explica os objetos que vivem nela (arquivos, diretórios, links, dispositivos) e mostra como o armazenamento é anexado a ela e como inspecioná-lo.
Uma árvore, vários sistemas de arquivos
A expressão sistema de arquivos é usada para duas coisas diferentes, e separá-las evita muita confusão.
A árvore de diretórios é o espaço de nomes lógico: /home/alice/notes.txt é um caminho na árvore. Um sistema de arquivos, no sentido de armazenamento, é uma estrutura de dados em um dispositivo de bloco — ext4, XFS, Btrfs, FAT — que armazena arquivos e diretórios. A árvore é montada no boot montando sistemas de arquivos em diretórios: o sistema de arquivos raiz é montado em /, e outros podem ser montados em /boot, /home, /var/lib/postgresql ou em qualquer outro lugar. Para um programa que percorre a árvore, as emendas são invisíveis.
Debian e Ubuntu instalam com ext4 por padrão; as distribuições da família RHEL (Rocky Linux, AlmaLinux, RHEL) usam XFS por padrão. Ambos são sistemas de arquivos com journaling maduros; o XFS não pode ser reduzido depois de criado, e essa é a principal diferença operacional que você provavelmente vai encontrar.
Os diretórios padrão
O Filesystem Hierarchy Standard (FHS) define a organização abaixo. As distribuições o seguem de perto, com algumas variações modernas indicadas pelo caminho.
| Diretório | O que fica lá |
|---|---|
/bin, /sbin, /lib | Nas distribuições atuais, são links simbólicos para /usr (o "usr merge"). Historicamente, sbin guardava os binários exclusivos do administrador. |
/usr | A maior parte do software instalado: /usr/bin para os comandos, /usr/lib e /usr/lib64 para as bibliotecas compartilhadas, /usr/share para dados independentes de arquitetura, como man pages e arquivos de locale. Somente leitura na operação normal. |
/usr/local | O software que você compila ou instala à mão, organizado como o /usr. Os gerenciadores de pacotes nunca escrevem aqui, então nada que você colocar em /usr/local/bin será sobrescrito por uma atualização. |
/opt | Aplicações de terceiros autocontidas, um diretório para cada uma (/opt/jdk-21, /opt/myapp). |
/etc | A configuração específica da máquina, em texto puro. Nada de binários. |
/var | Dados que mudam enquanto o sistema está rodando: logs (/var/log), caches de pacotes (/var/cache/apt), estado das aplicações (/var/lib/mysql), filas de e-mail e /var/tmp para arquivos temporários que precisam sobreviver a um reboot. |
/home | Os diretórios pessoais dos usuários. /root é o do superusuário, mantido à parte para continuar disponível mesmo se o /home não conseguir ser montado. |
/tmp | Espaço de rascunho que pode ser apagado no boot (muitas vezes um tmpfs em RAM). |
/run | O estado de execução desde o último boot: arquivos PID, sockets, arquivos de lock. Um tmpfs, vazio depois de cada reboot. |
/boot | A imagem do kernel, o disco RAM inicial e os arquivos do bootloader. Muitas vezes uma pequena partição separada. |
/dev | Os arquivos de dispositivo, criados dinamicamente pelo kernel e pelo udev. |
/proc, /sys | Sistemas de arquivos virtuais que expõem o estado do kernel e do hardware; não ocupam espaço em disco. |
/srv | Os dados servidos pela máquina (conteúdo web, árvores de FTP) quando o administrador prefere mantê-los fora do /var. |
/mnt, /media | Pontos de montagem temporários para o administrador e para mídias removíveis, respectivamente. |
/lost+found | Onde o fsck coloca os dados órfãos que recupera em um sistema de arquivos ext. Existe um por sistema de arquivos ext. |
Alguns deles merecem um olhar mais atento.
/etc: configuração como texto
Quase tudo o que define o comportamento de uma máquina é um arquivo legível em /etc: /etc/hostname, /etc/hosts, /etc/fstab, /etc/passwd, /etc/ssh/sshd_config, /etc/systemd/system/ para as suas unidades de serviço, /etc/nginx/ ou /etc/httpd/ para servidores web. Como é texto puro, o /etc pode ser comparado com diff, versionado e auditado com grep. Quando algo se comporta de forma inesperada, um grep -r no /etc costuma ser mais rápido do que ler a documentação.
Muitos pacotes aceitam um diretório drop-in *.d ao lado do arquivo principal — /etc/sudoers.d/, /etc/apt/sources.list.d/, /etc/systemd/system/app.service.d/. Coloque suas alterações em um arquivo novo ali em vez de editar o arquivo do pacote, e as atualizações não vão atropelá-las.
/proc e /sys: o kernel como arquivos
O /proc é uma janela para o kernel em execução. /proc/cpuinfo e /proc/meminfo descrevem o hardware; /proc/loadavg é o que o uptime lê; cada processo tem um diretório /proc/<pid>/ com sua linha de comando, seu ambiente, seus descritores de arquivo abertos (fd/), seus mapas de memória e seu diretório de trabalho atual. Ferramentas como ps, top e lsof não fazem nada mais exótico do que ler esses arquivos.
cat /proc/loadavg # 0.42 0.31 0.28 1/412 18342
ls -l /proc/$$/fd # descritores de arquivo do shell atual
cat /proc/$(pgrep -o nginx)/cmdline | tr '\0' ' '
O /sys expõe o modelo de dispositivos: quais drivers estão associados a quais dispositivos, parâmetros dos dispositivos de bloco, estatísticas das interfaces de rede. Escrever em alguns desses arquivos muda o comportamento do kernel em tempo de execução (por exemplo, o escalonador de E/S de um disco em /sys/block/sda/queue/scheduler).
/dev: tudo é arquivo
Os dispositivos aparecem como arquivos especiais, de modo que as mesmas chamadas open/read/write funcionam em um disco, em um terminal ou em uma fonte de números aleatórios. Os discos aparecem como /dev/sda, /dev/nvme0n1, /dev/vda e suas partições como /dev/sda1, /dev/nvme0n1p1. Alguns pseudodispositivos são usados no dia a dia:
/dev/nulldescarta tudo o que é escrito nele e é lido como vazio — o lugar padrão para mandar a saída que você não quer./dev/zeroproduz um fluxo infinito de bytes zero, útil para criar arquivos em branco./dev/urandomproduz bytes aleatórios./dev/ttyé o terminal de controle do processo atual.
Como ler uma linha do ls -l
O ls -l concentra muita coisa em uma linha só. Veja estas entradas do /etc:
-rw-r--r-- 1 root root 1354 Mar 14 09:12 fstab
drwxr-xr-x 2 root root 4096 Aug 30 17:40 cron.d
lrwxrwxrwx 1 root root 21 Jan 6 10:02 localtime -> /usr/share/zoneinfo/UTC
Da esquerda para a direita: o tipo de arquivo (- arquivo comum, d diretório, l link simbólico, c dispositivo de caractere, b dispositivo de bloco, s socket, p pipe nomeado), nove bits de permissão em três grupos, para o dono, o grupo e todos os outros, a contagem de hard links, o dono, o grupo, o tamanho em bytes, a data de modificação e o nome. As permissões têm um guia próprio em Usuários, grupos e permissões.
Dois detalhes costumam confundir. Arquivos cujo nome começa com ponto ficam ocultos em um ls simples; use ls -a (ou -A para omitir . e ..). E o tamanho de um diretório mostrado pelo ls é o tamanho da sua lista de entradas, não do seu conteúdo; para isso você precisa do du.
Inodes, hard links e links simbólicos
Cada arquivo em um sistema de arquivos é descrito por um inode: um registro com o dono, as permissões, os timestamps, o tamanho e a lista de blocos de dados — tudo, menos o nome. Um diretório é simplesmente uma tabela que associa nomes a números de inode. ls -i mostra os números e stat mostra o registro inteiro:
$ stat /etc/fstab
File: /etc/fstab
Size: 1354 Blocks: 8 IO Block: 4096 regular file
Device: 259,2 Inode: 1572867 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Como o nome não faz parte do inode, um mesmo inode pode ter vários nomes. Um hard link é uma segunda entrada de diretório para o mesmo inode; a contagem Links acima diz quantas existem. Apagar um nome só decrementa essa contagem, e os dados são liberados quando ela chega a zero e nenhum processo mantém o arquivo aberto. Hard links não podem atravessar sistemas de arquivos (os números de inode valem por sistema de arquivos) nem apontar para diretórios.
Um link simbólico (symlink) é um bicho bem diferente: um pequeno arquivo cujo conteúdo é um caminho. O kernel segue esse caminho quando você abre o link. Symlinks podem apontar para qualquer lugar, inclusive para diretórios, para outros sistemas de arquivos ou para destinos que ainda não existem — um link quebrado (dangling).
ln /var/lib/app/data.db /backup/data.db # hard link: mesmo inode
ln -s /opt/app-2.4.1 /opt/app # symlink: ponteiro para a "versão atual"
readlink -f /opt/app/bin/start # resolve todos os links do caminho
O padrão /opt/app -> /opt/app-2.4.1 é um recurso comum de deploy: você descompacta a nova versão ao lado da antiga e depois troca o link de forma atômica com ln -sfn /opt/app-2.5.0 /opt/app. Fazer rollback é só mais um ln.
Um symlink relativo (ln -s ../shared/config.yml config.yml) é resolvido em relação ao diretório que contém o link, o que o mantém válido se a árvore inteira for movida ou copiada; um absoluto quebra nesse caso. Prefira destinos relativos dentro da árvore de um projeto e destinos absolutos para ponteiros do sistema como um todo.
Caminhos e navegação
Um caminho absoluto começa com /; um caminho relativo é resolvido a partir do diretório de trabalho atual, que o pwd mostra e o cd altera. Em todo diretório existem duas entradas especiais: . (o próprio diretório) e .. (o diretório pai). O shell expande ~ para o seu diretório pessoal e ~bob para o do Bob.
cd /var/log # absoluto
cd ../lib # relativo: /var/lib
cd - # volta ao diretório anterior
cd # diretório pessoal
Os comandos de arquivo do dia a dia são ls, cp, mv, rm, mkdir e rmdir. Três flags importam mais do que o resto: mkdir -p cria os diretórios intermediários e não reclama se o caminho já existir; cp -a copia recursivamente preservando permissões, dono, timestamps e symlinks (o que você quer para backups, ao contrário de um simples cp -r); e rm -rf apaga sem perguntar — digite o caminho, confira e só então aperte Enter.
Discos, partições e montagens
O lsblk desenha o panorama do armazenamento: dispositivos, suas partições, tamanhos, tipos de sistema de arquivos e onde cada um está montado.
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID MOUNTPOINTS
nvme0n1
├─nvme0n1p1 vfat FAT32 6E1A-3B7C /boot/efi
├─nvme0n1p2 ext4 1.0 3f2c8a1e-4b5d-4f6a-9c1d-2e3f4a5b6c7d /
└─nvme0n1p3 swap 1 9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d [SWAP]
O findmnt lista as montagens em forma de árvore com suas opções; mount sem argumentos mostra a mesma informação no formato plano antigo. Para anexar um sistema de arquivos à mão:
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
sudo umount /mnt/data # falha com "target is busy" se algum processo estiver usando
Uma montagem manual desaparece no reboot. As montagens persistentes são declaradas no /etc/fstab, uma linha por sistema de arquivos: dispositivo, ponto de montagem, tipo, opções e dois números para a ordem do dump e do fsck.
# <device> <mount> <type> <options> <dump> <pass>
UUID=3f2c8a1e-4b5d-4f6a-9c1d-2e3f4a5b6c7d / ext4 errors=remount-ro 0 1
UUID=6E1A-3B7C /boot/efi vfat umask=0077 0 1
UUID=b1c2d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e /srv/data xfs defaults,nofail 0 2
Identifique os dispositivos pelo UUID (obtido com blkid ou lsblk -f), nunca por /dev/sdX: os nomes de dispositivo dependem da ordem de detecção e podem mudar quando um disco é adicionado. A opção nofail diz ao processo de boot para seguir em frente se aquele dispositivo estiver ausente, e é essa a diferença entre um servidor que sobe sem o disco de dados e um que cai em um shell de emergência. Depois de editar o fstab, sudo mount -a monta tudo o que ainda não está montado e valida a sua sintaxe antes que você descubra o erro no próximo reboot; em máquinas com systemd, rode antes sudo systemctl daemon-reload para que as unidades de montagem geradas sejam atualizadas.
Para onde foi o espaço?
O df informa o espaço livre de cada sistema de arquivos montado; o du mede quanto ocupa uma árvore de diretórios. Usados juntos, eles respondem à maioria dos alertas de "disco cheio".
df -h # tamanhos legíveis, uma linha por sistema de arquivos
df -i # uso de inodes — um sistema de arquivos pode ficar "cheio" com bytes livres
sudo du -sh /var/* | sort -h # qual diretório de primeiro nível em /var é o maior
sudo du -xh --max-depth=2 /var/log | sort -h | tail
O du -x fica em um único sistema de arquivos, o que importa quando /proc ou uma montagem de rede entrariam na conta. Ficar sem inodes é uma falha clássica de filas de e-mail e de diretórios de sessão que guardam milhões de arquivos minúsculos.
Quando df e du não batem, procure arquivos apagados mas ainda abertos:
sudo lsof -nP +L1 # arquivos com contagem de links 0 que continuam abertos
O culpado de sempre é um arquivo de log apagado com rm enquanto o serviço continuava escrevendo nele. Truncá-lo pelo descritor de arquivo libera o espaço sem reiniciar: : > /proc/<pid>/fd/<n>.
Encontrando arquivos
O find percorre uma árvore e aplica testes e ações a cada entrada. Sua linguagem de expressões recompensa quem aprende um punhado de primitivas:
find /var/log -name '*.log' -size +100M # logs grandes
find /etc -type f -mtime -1 # arquivos alterados nas últimas 24 h
find /srv/app -type d -name node_modules -prune -o -name '*.js' -print
find /tmp -type f -atime +7 -delete # limpa arquivos temporários antigos
find . -name '*.orig' -exec rm -v {} + # roda o rm uma vez só com vários caminhos
find /home -type f -perm -o+w # arquivos graváveis por todos: sinal de alerta
-mtime -1 significa "modificado há menos de um dia", +7 "há mais de sete dias"; a mesma convenção de sinal vale para -size. Coloque os padrões entre aspas para que o shell não os expanda antes que o find os veja. -exec ... {} + agrupa os caminhos no menor número possível de invocações do comando, enquanto \; roda o comando uma vez por arquivo.
Se você só precisa de nomes de arquivo, o locate (pacote plocate ou mlocate) responde em milissegundos a partir de um índice atualizado toda noite; rode updatedb depois de instalá-lo. which e type dizem para qual executável um nome de comando é resolvido.
Arquivando e copiando árvores
O tar empacota uma árvore de diretórios em um único arquivo, normalmente compactado:
tar -czf site-2026-09-07.tar.gz -C /var/www example.com # criar, gzip
tar -tzf site-2026-09-07.tar.gz | head # listar o conteúdo
tar -xzf site-2026-09-07.tar.gz -C /tmp/restore # extrair em outro lugar
tar --zstd -cf app.tar.zst --exclude='*.log' /opt/app # zstd: mais rápido, taxa comparável
-C dir muda de diretório antes de arquivar, de modo que o arquivo guarda example.com/... em vez de var/www/example.com/.... Sempre liste o conteúdo de um arquivo de origem desconhecida antes de extraí-lo: um arquivo criado a partir de / com caminhos absolutos pode sobrescrever arquivos do sistema.
Para copiar árvores entre diretórios ou entre máquinas, o rsync -a é melhor que cp e scp: preserva os metadados, pula os arquivos que não mudaram e retoma depois de uma interrupção.
rsync -a --delete /srv/data/ backup:/srv/data/ # espelho; barra final = "o conteúdo de"
Erros comuns
Montar pelo nome do dispositivo. /dev/sdb1 no fstab funciona até que um disco novo desloque as letras. Use UUID= ou LABEL=.
Confundir cp -r com cp -a. A cópia recursiva simples segue symlinks, atribui os arquivos ao usuário que copia e atualiza os timestamps. Backups e migrações pedem -a.
Guardar dados em /tmp. Ele pode ficar em RAM e costuma ser limpo no boot ou por um timer. Use /var/tmp se os dados precisarem sobreviver a um reboot, ou o local adequado /var/lib/<app> se forem realmente estado.
Editar diretamente os arquivos de pacote em /etc. A próxima atualização pode pedir que você mescle as alterações ou substituí-las sem avisar. Use o diretório .d do pacote ou um mecanismo de override, quando existir.
Apagar um arquivo aberto para liberar espaço. O espaço só volta quando o processo que escreve nele o fecha. Em vez disso, trunque o arquivo (: > file) ou faça a rotação do log direito.
Extrair tarballs não confiáveis como root. Inspecione antes com tar -tf, extraia em um diretório vazio e nunca extraia arquivos que contenham caminhos absolutos ou componentes ...
Principais conclusões
- Existe uma única árvore; discos, sistemas de arquivos virtuais e compartilhamentos de rede são montados em diretórios dela.
- A FHS diz onde cada coisa deve ficar:
/etcpara configuração,/varpara dados que mudam,/usrpara software instalado,/opte/usr/localpara software fora do gerenciador de pacotes,/rune/tmppara arquivos transitórios. - Um inode guarda tudo sobre um arquivo, menos o nome; hard links são nomes extras para um mesmo inode, symlinks são arquivos que contêm um caminho.
lsblk,findmntedfmostram o armazenamento; o/etc/fstabtorna as montagens persistentes e deve referenciar os dispositivos por UUID, comnofailnos discos não essenciais.du -xh --max-depth,df -ielsof +L1juntos explicam quase todo incidente de "disco cheio".- O
findcom-name,-type,-mtime,-sizee-exec ... +substitui boa parte dos scripts improvisados.
Fontes e leituras complementares
Perguntas frequentes
- Qual é a diferença entre /usr/local e /opt?
- Os dois guardam software que não veio do gerenciador de pacotes da distribuição. O /usr/local replica a estrutura do /usr (bin, lib, share) e serve para o que você compila ou instala por conta própria e que deve se integrar ao PATH do sistema. O /opt guarda pacotes de terceiros autocontidos, que mantêm todos os seus arquivos em um único diretório, como /opt/myapp, o que facilita removê-los de uma vez só.
- Por que não consigo criar um hard link para um diretório ou para outro disco?
- Um hard link é apenas mais uma entrada de diretório apontando para o mesmo inode, e números de inode só fazem sentido dentro de um sistema de arquivos; por isso um link não pode atravessar um ponto de montagem. Hard links para diretórios são recusados porque permitiriam ciclos na árvore, o que quebraria qualquer ferramenta que a percorra. Nos dois casos, use um link simbólico.
- Onde minha aplicação deve gravar seus dados e logs?
- O estado persistente fica em /var/lib/<app>, os logs em /var/log/<app> (ou no journal), os caches que podem ser reconstruídos em /var/cache/<app> e os arquivos de execução, como arquivos PID ou sockets, em /run/<app>. A configuração vai em /etc/<app>. Seguindo essas convenções, as ferramentas de backup, rotação de logs e monitoramento encontram seus arquivos onde esperam.
- Por que o df diz que o disco está cheio se o du não encontra os arquivos?
- Normalmente porque algum processo ainda mantém aberto um arquivo apagado. A entrada de diretório sumiu, então o du não o conta, mas os blocos só são liberados quando o último descritor de arquivo é fechado. Rode lsof +L1 (ou lsof -nP | grep deleted) para achar o processo e depois reinicie-o ou trunque o arquivo por meio de /proc/<pid>/fd.