Nesta aula, vamos mergulhar na estrutura do sistema de arquivos Linux, um dos alicerces para qualquer profissional que trabalha com administração de sistemas, desenvolvimento ou operações. Compreender como os diretórios são organizados e qual a função de cada um é essencial para navegar com segurança, configurar serviços, diagnosticar problemas e otimizar o desempenho. Vamos explorar o padrão FHS (Filesystem Hierarchy Standard), que define a árvore de diretórios na maioria das distribuições Linux, e depois detalhar os diretórios mais críticos: /etc, /var, /usr, além dos dispositivos e dos sistemas de arquivos virtuais /proc e /sys.

Você vai perceber que o Linux não é apenas um sistema operacional, mas um ecossistema com uma filosofia de organização que prioriza clareza, modularidade e segurança. Ao final desta aula, você será capaz de explicar a finalidade de cada diretório principal, localizar arquivos de configuração, entender onde ficam os logs e os dados variáveis, e até mesmo inspecionar informações do kernel e de hardware usando /proc e /sys. Tudo isso com exemplos práticos que você pode executar em seu próprio terminal.

FHS (visão geral)

O Filesystem Hierarchy Standard (FHS) é um padrão mantido pela Linux Foundation que define a estrutura de diretórios e seus conteúdos em sistemas operacionais Linux e Unix-like. Ele foi criado para garantir consistência entre diferentes distribuições, facilitando a vida de administradores, desenvolvedores e usuários que precisam navegar em sistemas desconhecidos. O FHS especifica, por exemplo, que o diretório raiz (/) deve conter subdiretórios como /bin, /etc, /home, /tmp, entre outros, e descreve o propósito de cada um.

A adoção do FHS não é obrigatória, mas a grande maioria das distribuições (Debian, Ubuntu, CentOS, Fedora, Arch, etc.) segue o padrão com pequenas variações. Isso significa que, se você aprendeu a estrutura em uma distribuição, conseguirá se adaptar rapidamente a outra. O FHS também define que alguns diretórios são obrigatórios e outros são opcionais, e especifica que certos diretórios devem estar no mesmo sistema de arquivos da raiz (por exemplo, /etc e /bin), enquanto outros podem ser montados separadamente (como /home e /var).

Vamos ver uma árvore simplificada da raiz do sistema, que você pode visualizar com o comando ls / no seu terminal:

$ ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Cada um desses diretórios tem uma função específica. Por exemplo, /bin contém os executáveis essenciais do sistema, /boot guarda os arquivos do kernel e do carregador de boot, /home abriga os diretórios pessoais dos usuários, e /tmp é usado para arquivos temporários. O FHS também define que o diretório raiz deve conter /dev (dispositivos), /proc e /sys (sistemas de arquivos virtuais), que são tópicos que abordaremos em detalhes adiante.

Para ver a árvore completa de diretórios, você pode usar o comando tree (se instalado) ou find. Mas lembre-se: a estrutura pode variar um pouco entre distribuições, especialmente em relação a alguns links simbólicos (por exemplo, /bin às vezes é um link para /usr/bin).

/etc, /var, /usr

Vamos explorar três diretórios que são fundamentais para a operação do sistema: /etc, /var e /usr.

O diretório /etc (de "et cetera") é onde ficam os arquivos de configuração do sistema e dos aplicativos instalados. Aqui você encontrará arquivos como passwd (que lista os usuários), fstab (que define as montagens de dispositivos), hostname, resolv.conf (configuração de DNS), entre muitos outros. A maioria dos serviços, como servidores web, bancos de dados e ferramentas de rede, armazena suas configurações em subdiretórios ou arquivos dentro de /etc. Por exemplo, o Apache usa /etc/apache2/ (ou /etc/httpd/ em distribuições baseadas em Red Hat), e o MySQL usa /etc/mysql/.

É importante notar que /etc deve conter apenas arquivos de configuração, não binários ou dados variáveis. A convenção é que todos os arquivos aqui são editados manualmente ou por ferramentas de gerenciamento de configuração. Para inspecionar o conteúdo, você pode usar comandos como ls /etc ou cat /etc/passwd para visualizar. Por exemplo:

$ ls /etc | head -20
adduser.conf
alternatives
apache2
apt
bash.bashrc
bind
cron.d
crontab
debian_version
default
dpkg
environment
fstab
gshadow
hostname
hosts
init.d
issue
kernel
ld.so.conf

O diretório /var (de "variable") é usado para dados variáveis, ou seja, arquivos que mudam de tamanho e conteúdo durante a operação do sistema. Isso inclui logs (/var/log), spool de impressão e e-mail (/var/spool), dados de serviços como bancos de dados (/var/lib) e arquivos temporários que sobrevivem a reinicializações (/var/tmp). Um dos subdiretórios mais importantes é /var/log, onde você encontra os logs do sistema, como syslog ou journal (dependendo do sistema de logging). Por exemplo, o arquivo /var/log/auth.log registra tentativas de autenticação, e /var/log/dpkg.log registra atividades de pacotes (no Debian/Ubuntu).

O diretório /usr (de "Unix System Resources") é o maior diretório do sistema, contendo a maioria dos programas, bibliotecas, documentação e arquivos de cabeçalho. Ele é dividido em subdiretórios como /usr/bin (executáveis de usuário), /usr/lib (bibliotecas compartilhadas), /usr/share (dados independentes de arquitetura, como documentação e ícones) e /usr/local (programas instalados manualmente pelo administrador, fora do gerenciador de pacotes). Em muitas distribuições modernas, /bin e /sbin são links simbólicos para /usr/bin e /usr/sbin, respectivamente, como parte de uma iniciativa para unificar os binários em /usr.

Vamos ver um exemplo de como navegar e verificar o uso de espaço desses diretórios:

$ du -sh /etc /var /usr
6,2M    /etc
1,2G    /var
5,4G    /usr

Esses números variam de acordo com o sistema, mas mostram que /usr é geralmente o maior, seguido de /var e /etc.

Arquivos de dispositivo

No Linux, todos os dispositivos de hardware são representados como arquivos especiais no diretório /dev (de "devices"). Isso significa que você pode interagir com um dispositivo (como um disco rígido, uma porta serial ou um pendrive) usando as mesmas operações de leitura e escrita que usa com arquivos comuns, como cat, dd ou echo. Essa abstração torna o acesso a hardware muito mais simples e uniforme.

Existem dois tipos principais de arquivos de dispositivo: dispositivos de bloco e dispositivos de caractere. Dispositivos de bloco (como discos /dev/sda) transferem dados em blocos de tamanho fixo e suportam acesso aleatório, enquanto dispositivos de caractere (como terminais /dev/tty) transferem dados como um fluxo de bytes, um caractere por vez. Você pode identificar o tipo de um dispositivo com o comando ls -l /dev. Por exemplo, a primeira letra do modo de arquivo (b para bloco, c para caractere) indica o tipo:

$ ls -l /dev/sda /dev/tty
brw-rw---- 1 root disk    8, 0 mai 18 09:30 /dev/sda
crw-rw-rw- 1 root tty     5, 0 mai 18 09:30 /dev/tty

Os arquivos de dispositivo podem ser criados dinamicamente pelo sistema (usando o udev), mas também podem ser criados manualmente com o comando mknod, embora isso raramente seja necessário. O diretório /dev também contém alguns arquivos especiais como /dev/null (que descarta tudo que é escrito), /dev/zero (que fornece bytes nulos) e /dev/random (que gera números aleatórios). Esses arquivos são úteis em scripts e operações de redirecionamento.

Para listar todos os dispositivos reconhecidos pelo sistema, você pode usar lsblk (para blocos) ou lspci e lsusb para hardware específico. Por exemplo:

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0   100G  0 disk
├─sda1   8:1    0    97G  0 part /
├─sda2   8:2    0     1K  0 part
└─sda5   8:5    0   3,9G  0 part [SWAP]
sr0     11:0    1  1024M  0 rom

Neste exemplo, vemos o disco sda com suas partições. O diretório /dev também contém links simbólicos como /dev/disk/by-uuid, que podem ser usados para montar dispositivos de forma mais estável, independente da ordem de detecção.

/proc e /sys

Os diretórios /proc e /sys são sistemas de arquivos virtuais que fornecem uma interface com o kernel e com o hardware em tempo real. Eles não existem fisicamente no disco; são criados na memória quando o sistema é inicializado e refletem o estado atual do sistema. Isso permite que você obtenha informações detalhadas sobre processos, memória, CPU, dispositivos e muito mais, simplesmente lendo arquivos ou diretórios.

O /proc (de "process") é um sistema de arquivos que expõe informações sobre os processos em execução e sobre o kernel. Cada processo em execução tem um diretório com seu PID (identificador de processo) em /proc, por exemplo, /proc/1 para o processo init. Dentro desses diretórios, você encontra informações como o comando executado (cmdline), o uso de memória (status), os arquivos abertos (fd) e muito mais. Além disso, /proc contém arquivos e diretórios especiais como /proc/cpuinfo (informações da CPU), /proc/meminfo (uso de memória), /proc/uptime (tempo desde a inicialização) e /proc/interrupts (interrupções).

Para visualizar informações do processador, por exemplo, você pode usar:

$ cat /proc/cpuinfo | head -10
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 142
model name	: Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
stepping	: 10
microcode	: 0xea
cpu MHz		: 799.998
cache size	: 6144 KB
physical id	: 0
siblings	: 8

O diretório /sys (de "system") é outro sistema de arquivos virtual, mas focado em fornecer uma visão estruturada dos dispositivos do sistema e de suas propriedades. Ele é usado principalmente pelo udev para gerenciar dispositivos dinamicamente e também pode ser usado por administradores para ajustar parâmetros de hardware. Por exemplo, /sys/class/net contém informações sobre interfaces de rede, /sys/block sobre dispositivos de bloco e /sys/power sobre gerenciamento de energia. Muitos arquivos em /sys são graváveis, permitindo que você altere configurações de hardware em tempo real, como a velocidade de um ventilador ou o brilho da tela (em laptops).

Um exemplo prático é mudar a política de governança de CPU:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
powersave
$ echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance

Esses sistemas de arquivos são essenciais para ferramentas de monitoramento como htop, ps, free e lscpu, que leem as informações de /proc e /sys para exibir dados de forma amigável. Entender como acessá-los diretamente é uma habilidade valiosa para diagnosticar problemas sem depender de ferramentas externas.

Boas práticas e observações finais

Ao trabalhar com a estrutura do sistema de arquivos, é importante seguir algumas boas práticas. Primeiro, nunca remova ou modifique arquivos em /etc sem fazer backup, pois isso pode quebrar o sistema. Segundo, evite escrever diretamente em /proc ou /sys a menos que saiba exatamente o que está fazendo, pois alterações podem afetar a estabilidade do sistema. Terceiro, use os links simbólicos em /dev/disk para montar dispositivos, pois eles são mais estáveis que os nomes de dispositivo como /dev/sda, que podem mudar entre reinicializações.

Além disso, lembre-se de que a estrutura pode variar entre distribuições. Por exemplo, no Red Hat, o Apache usa /etc/httpd, enquanto no Debian usa /etc/apache2. Sempre consulte a documentação oficial da sua distribuição para entender as particularidades. Dominar a estrutura de diretórios é um passo fundamental para se tornar um administrador de sistemas Linux competente.

Referências

Exercícios

  1. Explore o diretório /etc e identifique o arquivo que contém a lista de usuários do sistema. Qual é o caminho completo do arquivo e qual comando você usaria para visualizá-lo?
  2. ✓ Resposta: O arquivo é /etc/passwd. Para visualizá-lo, use cat /etc/passwd ou less /etc/passwd.
  3. Qual diretório contém os logs do sistema? Dê um exemplo de um arquivo de log comum e o que ele registra.
  4. ✓ Resposta: Os logs ficam em /var/log. Um exemplo é /var/log/auth.log (em Debian/Ubuntu) que registra tentativas de autenticação, ou /var/log/messages (em Red Hat) que registra mensagens gerais do sistema.
  5. Explique a diferença entre dispositivos de bloco e dispositivos de caractere, e dê um exemplo de cada um encontrado em /dev.
  6. ✓ Resposta: Dispositivos de bloco transferem dados em blocos e permitem acesso aleatório; exemplo: /dev/sda (disco rígido). Dispositivos de caractere transferem dados como fluxo de bytes, um por vez; exemplo: /dev/tty (terminal).
  7. Como você pode obter informações sobre a memória do sistema usando o diretório /proc? Cite o arquivo e um comando para visualizar as informações.
  8. ✓ Resposta: Use o arquivo /proc/meminfo. Comando: cat /proc/meminfo ou grep MemTotal /proc/meminfo para ver apenas a memória total.
  9. Qual é o propósito do diretório /sys? Dê um exemplo de uma informação que você pode obter ou modificar nele.
  10. ✓ Resposta: O /sys expõe informações e controles sobre dispositivos de hardware. Por exemplo, /sys/class/net/eth0/address mostra o endereço MAC da interface de rede, e você pode alterar /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor para mudar a política de frequência da CPU.