Nesta aula, vamos mergulhar na estrutura do sistema de arquivos Linux, um dos pilares para qualquer profissional que trabalha com servidores, desenvolvimento ou operações. Compreender onde cada arquivo reside e por que ele está ali não é apenas uma questão de curiosidade: é fundamental para configurar serviços, diagnosticar problemas, automatizar tarefas e escrever scripts robustos. Vamos explorar o padrão FHS (Filesystem Hierarchy Standard), os diretórios mais críticos como /etc, /var e /usr, além dos arquivos de dispositivo e dos sistemas de arquivos virtuais /proc e /sys.

O Linux adota uma estrutura hierárquica única, onde tudo é tratado como arquivo, desde dispositivos até informações do kernel. Essa filosofia torna o sistema poderoso e flexível, mas exige que o administrador conheça bem o papel de cada diretório. Ao final desta aula, você terá uma visão clara de como o sistema está organizado e como utilizar esse conhecimento no seu dia a dia.

FHS (visão geral)

O FHS (Filesystem Hierarchy Standard) é uma especificação que define a estrutura de diretórios em sistemas operacionais baseados em Unix, incluindo o Linux. Ele foi criado para padronizar a localização de arquivos e diretórios, facilitando a interoperabilidade entre diferentes distribuições e permitindo que usuários e administradores saibam onde encontrar determinados arquivos. O FHS é mantido pela Linux Foundation e sua versão mais recente é a 3.0, publicada em 2015.

A estrutura é organizada em uma árvore única, com o diretório raiz / no topo. A partir dele, todos os outros diretórios são ramificados. O FHS define dois tipos de diretórios: os estáticos (que raramente mudam, como /usr e /opt) e os dinâmicos (que contêm dados que mudam com frequência, como /var e /tmp). Essa separação é importante para estratégias de backup, particionamento e montagem de sistemas de arquivos em redes.

Vamos ver uma árvore simplificada dos principais diretórios:

/
├── bin
├── boot
├── dev
├── etc
├── home
├── lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var

Alguns diretórios merecem destaque imediato: /bin contém binários essenciais (como ls, cp), /sbin contém binários de sistema (como fdisk, mount), /boot armazena o kernel e arquivos de boot, e /home é onde ficam os diretórios dos usuários. Vamos explorar os mais relevantes para scripts e administração.

/etc, /var, /usr

Esses três diretórios são essenciais para a administração do sistema. Cada um tem uma função específica e é importante saber diferenciá-los.

Diretório /etc

O diretório /etc (de "et cetera") concentra os arquivos de configuração do sistema e dos serviços. É aqui que ficam arquivos como passwd, shadow, hosts, fstab, e os arquivos de configuração de serviços como Apache (httpd), SSH (ssh) e outros. A maioria desses arquivos é texto puro e pode ser editada com um editor de texto, mas é recomendável ter cuidado, pois erros podem quebrar o sistema.

Exemplos de arquivos importantes em /etc:

  • /etc/passwd — informações básicas dos usuários
  • /etc/shadow — senhas criptografadas e políticas de expiração
  • /etc/hosts — mapeamento estático de nomes para IPs
  • /etc/fstab — definição de sistemas de arquivos montados na inicialização
  • /etc/resolv.conf — configuração de DNS

Você pode listar o conteúdo do diretório com:

ls -la /etc

Muitos serviços criam subdiretórios em /etc, como /etc/nginx ou /etc/ssh, para organizar seus arquivos de configuração. Em scripts, é comum fazer backup desses arquivos antes de alterá-los.

Diretório /var

O diretório /var (de "variable") contém dados variáveis, ou seja, arquivos que mudam de tamanho e conteúdo durante a execução do sistema. Aqui ficam logs, spools de impressão, arquivos temporários de serviços, cache e bases de dados de alguns aplicativos. É um dos diretórios que mais cresce, por isso é importante monitorar seu espaço em disco.

Subdiretórios comuns:

  • /var/log — logs do sistema (syslog, auth.log, etc.)
  • /var/spool — filas de impressão, cron, etc.
  • /var/tmp — arquivos temporários que persistem entre reinicializações
  • /var/lib — dados de aplicativos (bancos de dados, pacotes)
  • /var/cache — cache de pacotes e aplicativos

Veja como visualizar os logs mais recentes:

ls -lt /var/log | head

Diretório /usr

O diretório /usr (de "Unix System Resources") contém a maioria dos programas, bibliotecas e arquivos de documentação do sistema. Embora o nome sugira "user", ele é usado para software do sistema e do usuário. Na maioria das distribuições, /usr é um sistema de arquivos separado e pode ser montado como somente leitura em sistemas críticos.

Principais subdiretórios:

  • /usr/bin — binários de usuário (comandos como vim, python3)
  • /usr/sbin — binários de administração (como useradd)
  • /usr/lib — bibliotecas compartilhadas
  • /usr/local — software compilado localmente
  • /usr/share — dados independentes de arquitetura (documentação, ícones)

Exemplo de uso: descobrir onde está um comando:

which python3
# Muitas vezes retorna /usr/bin/python3

Arquivos de dispositivo

No Linux, quase tudo é tratado como arquivo, inclusive os dispositivos de hardware. Eles são representados por arquivos especiais no diretório /dev. Esses arquivos não armazenam dados comuns; eles servem como interface para o kernel, permitindo que programas interajam com o hardware por meio de operações de leitura e escrita.

Existem dois tipos principais de arquivos de dispositivo: os de bloco (block devices) e os de caractere (character devices). Dispositivos de bloco transferem dados em blocos, como discos rígidos (/dev/sda) e SSDs. Dispositivos de caractere transferem dados caractere por caractere, como terminais (/dev/tty) e portas seriais (/dev/ttyS0).

Exemplos:

  • /dev/sda — primeiro disco rígido SATA/SCSI
  • /dev/sda1 — primeira partição do disco
  • /dev/tty — terminal atual
  • /dev/null — dispositivo que descarta tudo o que é escrito
  • /dev/zero — fornece fluxo de zeros

Você pode ver os dispositivos com:

ls -l /dev/sda*

No contexto de scripts, é comum usar /dev/null para descartar saídas indesejadas:

comando_que_gera_saida > /dev/null 2>&1

Também é possível criar arquivos de dispositivo com o comando mknod, mas isso raramente é necessário em sistemas modernos, pois o udev gerencia a criação automática.

/proc e /sys

Os diretórios /proc e /sys são sistemas de arquivos virtuais que expõem informações internas do kernel e permitem a configuração em tempo real. Eles não ocupam espaço em disco, pois são gerados dinamicamente.

Diretório /proc

O /proc (de "process") é um sistema de arquivos virtual que fornece uma visão detalhada dos processos em execução e do sistema. Cada processo em execução tem um subdiretório com seu PID, contendo arquivos como status, cmdline, environ e fd. Além disso, o /proc contém informações sobre memória, CPU, versão do kernel, e muito mais.

Exemplos de arquivos úteis:

  • /proc/cpuinfo — detalhes da CPU
  • /proc/meminfo — informações de memória
  • /proc/version — versão do kernel
  • /proc/uptime — tempo de atividade do sistema
  • /proc/loadavg — carga média do sistema

Para ver informações da CPU:

cat /proc/cpuinfo | grep "model name" | head -1

Para listar todos os processos:

ls /proc | grep -E '^[0-9]+$'

Diretório /sys

O /sys (de "sysfs") é outro sistema de arquivos virtual, introduzido no kernel 2.6, que expõe informações sobre dispositivos e drivers, além de permitir a configuração de alguns parâmetros do kernel em tempo real. Ele é mais estruturado que /proc e é usado pelo udev para gerenciar dispositivos.

Em /sys, você encontra subdiretórios como /sys/class, /sys/block e /sys/devices. Por exemplo, para ver informações sobre a temperatura da CPU em muitos sistemas:

cat /sys/class/thermal/thermal_zone0/temp

Esse comando retorna a temperatura em miligraus Celsius (ex.: 45000 = 45°C).

Scripts avançados podem usar /sys para ajustar brilho de tela, gerenciar energia ou monitorar sensores. Por exemplo, para ver a velocidade da ventoinha:

cat /sys/class/hwmon/hwmon0/fan1_input

Boas práticas e observações finais

Ao trabalhar com a estrutura de arquivos, siga estas boas práticas:

  • Sempre faça backup de arquivos de configuração antes de alterá-los, especialmente em /etc.
  • Prefira usar caminhos absolutos em scripts para evitar ambiguidade.
  • Monitore o espaço em disco, principalmente em /var e /tmp, para evitar que logs preencham o disco.
  • Use /dev/null para descartar saídas indesejadas em scripts.
  • Consulte /proc e /sys para obter informações em tempo real, mas evite escrever neles sem conhecimento profundo.
  • Respeite o FHS ao instalar software manualmente: use /usr/local para compilações locais.

Exercícios

  1. Explique a diferença entre os diretórios /etc, /var e /usr, e dê um exemplo de arquivo que normalmente reside em cada um.

    ✓ Resposta: /etc guarda arquivos de configuração do sistema e serviços (ex.: /etc/passwd). /var contém dados variáveis como logs e spool (ex.: /var/log/syslog). /usr contém programas e bibliotecas (ex.: /usr/bin/python3).
  2. Qual comando você usaria para ver a quantidade total de memória RAM do sistema usando /proc? Escreva o comando.

    ✓ Resposta: grep MemTotal /proc/meminfo ou cat /proc/meminfo | grep MemTotal.
  3. O que é o FHS e por que ele é importante para a padronização do sistema?

    ✓ Resposta: O FHS é um padrão que define a hierarquia de diretórios em sistemas Unix/Linux. Ele garante que arquivos e diretórios tenham localizações previsíveis, facilitando a administração, o desenvolvimento de software e a interoperabilidade entre distribuições.
  4. Escreva um script que liste todos os arquivos de dispositivo do tipo bloco em /dev (use ls -l e filtre pela primeira letra 'b' no tipo).

    ✓ Resposta:
    ls -l /dev | grep '^b'
    
  5. Como você pode descobrir o PID do processo atual usando /proc? Dica: existe um link simbólico chamado self.

    ✓ Resposta: O link /proc/self aponta para o diretório do processo atual. O PID pode ser obtido com readlink /proc/self ou basename $(readlink /proc/self).

Referências