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 sudo — superuser 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
- Filesystem Hierarchy Standard (FHS) — A especificação oficial que define o que cada diretório do Linux deve conter.
- The Linux Command Line — Capítulos 3 e 4 — Cobre navegação e exploração do sistema de arquivos com profundidade.
- An Introduction to Linux I/O Redirection — DigitalOcean — Explica redirecionamento, pipes e o papel do
/dev/null.
Prática
- Over The Wire: Bandit — níveis 0 a 5 — Os primeiros níveis trabalham exatamente navegação e leitura de arquivos.
- TryHackMe — Linux Fundamentals — Ambiente interativo no navegador. Não requer configuração local.
Referência rápida
- The Linux Documentation Project — Diagramas e explicações concisas sobre a hierarquia de diretórios. Útil como segunda tela enquanto se pratica.
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.