Navegando pelo Sistema de Arquivos com Confiança

[31] Navegando pelo Sistema de Arquivos com Confiança

A árvore de diretórios do Linux e o que cada ramo guarda: /etc, /var, /home, /proc e /sys, caminhos absolutos e relativos, busca com find, o papel do sudo e a leitura de logs com tail e grep.
DevOps

8 min de leitura

No artigo O Terminal Não é o Inimigo foram apresentados os primeiros movimentos no terminal. Agora é preciso entender o terreno onde esses movimentos acontecem.

O Linux organiza todos os arquivos em uma única árvore de diretórios que começa em / — chamado de diretório raiz. Não existe C:\ ou D:\ como no Windows. Tudo — arquivos do sistema, configurações, dispositivos de hardware, discos externos — está dentro dessa árvore.

Compreender essa estrutura é essencial. Ao configurar um servidor, depurar um container ou escrever um script de automação, será necessário saber exatamente onde estão os arquivos que importam.

O Mapa do Sistema

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

Cada diretório tem uma função específica. Os mais relevantes para o trabalho em DevOps:

/etc — Configurações do sistema

É onde vivem os arquivos de configuração de praticamente todo serviço do Linux. Nginx, SSH, DNS, usuários — tudo passa pelo /etc.

cat /etc/hostname        # Nome da máquina
cat /etc/hosts           # Mapeamento local de nomes para IPs
cat /etc/os-release      # Informações sobre a distribuição Linux

/var — Dados variáveis

Logs, filas, bancos de dados locais — arquivos que crescem com o tempo. Quando um sistema apresenta comportamento inesperado, /var/log é um dos primeiros lugares a se investigar.

ls /var/log

/home — Diretórios dos usuários

Cada usuário tem seu espaço em /home/nome-do-usuario. É onde ficam arquivos pessoais, configurações de shell e chaves SSH.

/tmp — Arquivos temporários

O sistema limpa este diretório automaticamente em reinicializações. Útil para arquivos de trabalho que não precisam persistir.

/usr — Programas e bibliotecas

A maioria dos programas instalados fica em /usr/bin. Bibliotecas em /usr/lib.

/proc e /sys — O sistema em tempo real

Não são diretórios reais no disco — são interfaces para o kernel. Informações do sistema podem ser lidas como se fossem arquivos comuns:

cat /proc/cpuinfo      # Informações sobre o processador
cat /proc/meminfo      # Uso de memória

Caminhos Absolutos e Relativos

Todo arquivo no Linux possui um caminho absoluto — que começa em / e descreve a localização completa:

/home/usuario/devops-curso/modulo01/anotacoes.txt

E um caminho relativo — que parte do diretório atual:

# Estando em /home/usuario
cd devops-curso/modulo01
cat anotacoes.txt

Atalhos essenciais:

.       # O diretório atual
..      # O diretório pai
~       # O home do usuário
-       # O diretório anterior

Buscando Arquivos

Quando não se sabe onde um arquivo está, usa-se find:

# Por nome
find / -name "nginx.conf" 2>/dev/null

# Por extensão dentro de um diretório
find /etc -name "*.conf"

# Modificados nas últimas 24 horas
find /var/log -mtime -1

O 2>/dev/null descarta mensagens de erro de permissão que poluiriam a saída.

Para buscas mais rápidas por nome:

locate nginx.conf

# Atualizar o índice antes, se necessário
sudo updatedb

Entendendo o sudo

O sudosuperuser do — executa um comando com privilégios de administrador.

sudo ls /root

O diretório /root é o home do superusuário e não é acessível por usuários comuns. Com sudo, elevam-se privilégios apenas para aquele comando específico.

Executar tudo como root o tempo todo é uma prática perigosa. O princípio do mínimo privilégio — elevar apenas o necessário, apenas quando necessário — reaparecerá quando forem abordados IAM na AWS e RBAC no Kubernetes.

Inspecionando Arquivos sem Abrir um Editor

head /var/log/syslog        # Primeiras 10 linhas
tail /var/log/syslog        # Últimas 10 linhas
tail -f /var/log/syslog     # Acompanha em tempo real
wc -l /var/log/syslog       # Conta linhas
grep "error" /var/log/syslog          # Filtra por palavra
grep -i "error" /var/log/syslog       # Sem diferenciar maiúsculas

O tail -f é um dos comandos mais usados em produção. Quando algo está errado em um servidor, abre-se o log com tail -f e observa-se o que acontece em tempo real.

Um Exercício Completo

# Cria estrutura de um projeto fictício
mkdir -p ~/devops-curso/modulo01/exercicios
cd ~/devops-curso/modulo01/exercicios

# Confirma onde está
pwd

# Cria logs fictícios
echo "INFO: sistema iniciado" > app.log
echo "ERROR: falha na conexão com o banco" >> app.log
echo "INFO: tentativa de reconexão" >> app.log
echo "INFO: conexão restabelecida" >> app.log

# Filtra apenas erros
grep "ERROR" app.log

# Conta linhas
wc -l app.log

# Verifica metadados do arquivo
ls -la app.log

Saída esperada do grep:

ERROR: falha na conexão com o banco

Saída do wc -l:

4 app.log

É exatamente assim que se investiga um problema em um servidor real — sem interface gráfica, sem mouse, apenas comandos e lógica.

Referências para Aprofundamento

Documentação e leitura

Prática

Referência rápida

Exercícios

Exercício 1

Um serviço está se comportando de forma inesperada em um servidor. Em qual diretório você procura a configuração dele, e em qual procura o registro do que aconteceu? Por que essa separação existe?

Ver resposta

✓ Resposta: A configuração fica em /etc, onde vivem os arquivos de praticamente todo serviço do Linux — Nginx, SSH, DNS, usuários. O registro fica em /var/log, porque /var guarda dados variáveis, aqueles que crescem com o tempo. A separação é proposital: /etc é o que você define, /var é o que o sistema produz. Por isso, ao diagnosticar, um responde "como isto deveria funcionar" e o outro responde "o que de fato aconteceu".

Exercício 2

Por que /proc e /sys não são diretórios reais no disco, e o que essa escolha de design permite na prática?

Ver resposta

✓ Resposta: São interfaces para o kernel apresentadas em forma de arquivo — o conteúdo é gerado no momento da leitura, não lido de um disco. Isso permite consultar o estado vivo do sistema com as mesmas ferramentas de sempre: cat /proc/cpuinfo para o processador, cat /proc/meminfo para memória. Não é preciso API nem programa especial; qualquer comando que saiba ler arquivo sabe inspecionar o kernel.

Exercício 3

Estando em /home/usuario, quais dos caminhos abaixo chegam ao mesmo arquivo? Qual a diferença prática entre eles?

/home/usuario/devops-curso/modulo01/anotacoes.txt
devops-curso/modulo01/anotacoes.txt
~/devops-curso/modulo01/anotacoes.txt
./devops-curso/modulo01/anotacoes.txt
Ver resposta

✓ Resposta: Os quatro chegam ao mesmo arquivo. O primeiro é absoluto: começa em / e vale de qualquer lugar. Os outros três dependem de contexto — o relativo parte do diretório atual, ~ expande para o home do usuário e ./ é o diretório atual escrito de forma explícita. A diferença aparece em automação: um caminho relativo quebra se o script for executado de outro diretório, e é por isso que scripts de produção costumam usar caminhos absolutos.

Exercício 4

O que 2>/dev/null faz no comando abaixo, e por que ele quase sempre acompanha um find que parte da raiz?

find / -name "nginx.conf" 2>/dev/null
Ver resposta

✓ Resposta: Redireciona a saída de erro — o descritor 2 — para /dev/null, descartando-a. Buscar a partir de / faz o find tentar entrar em diretórios que o usuário não tem permissão de ler, e cada tentativa gera um "Permission denied" que afoga o resultado útil no meio do ruído. Repare que só o erro é descartado: os caminhos encontrados continuam saindo normalmente, porque vão pela saída padrão.

Exercício 5

sudo ls /root funciona, mas ls /root não. Explique o motivo — e por que operar sempre como root é considerado prática perigosa.

Ver resposta

✓ Resposta: /root é o home do superusuário e não é acessível a usuários comuns; o sudo eleva privilégios apenas para aquele comando específico. Operar sempre como root remove a rede de proteção: qualquer erro de digitação ou script mal escrito passa a alcançar o sistema inteiro, sem nada barrando. É o princípio do mínimo privilégio — elevar apenas o necessário, apenas quando necessário — e ele reaparece adiante em IAM na AWS e RBAC no Kubernetes.

Exercício 6

Considerando o app.log criado no artigo, o que grep "ERROR" app.log retorna? E em que situação grep -i "error" daria um resultado diferente? Por fim, por que tail -f é tão usado em produção?

Ver resposta

✓ Resposta: grep "ERROR" devolve uma única linha: ERROR: falha na conexão com o banco. Nesse arquivo específico, grep -i "error" devolveria a mesma coisa — mas em log real a diferença é decisiva, porque -i ignora maiúsculas e minúsculas e captura também Error e error, variações que aparecem quando o sistema não padroniza o nível de log. Já o tail -f mantém o arquivo aberto e imprime cada linha conforme ela é escrita: você reproduz o problema e vê o erro surgir no instante em que acontece, em vez de reabrir o log a cada tentativa.

Comentários

Mais em DevOps

Processos, Serviços e o Comando `systemctl`
Processos, Serviços e o Comando `systemctl`

Processos e serviços no Linux: leitura de ps aux e top, busca com pgrep, a…

O Terminal Não é o Inimigo
O Terminal Não é o Inimigo

Por que um curso de DevOps começa por um mês inteiro de terminal: o que é o…

SSH: Conectando e Gerenciando Servidores Remotos
SSH: Conectando e Gerenciando Servidores Remotos

SSH na prática: verificação de host com known_hosts, autenticação por par de…