Filesystem e navegação com intenção
Objetivos desta aula
- Entender a hierarquia FHS e o propósito de cada diretório
- Buscar arquivos e conteúdo rapidamente com find e grep
- Inspecionar arquivos grandes sem travar o terminal
- Usar links simbólicos em estratégias de release e rollback
- Descobrir quem está consumindo espaço em disco
1. Uma árvore só, começando em /
Diferente do Windows, o Linux não tem letras de unidade: tudo parte de /. Discos adicionais são "montados" em um diretório (por exemplo /mnt/dados) e passam a fazer parte da mesma árvore. Entender isso evita confusão quando um disco cheio afeta só parte do sistema.
2. O mapa que acelera qualquer investigação
/etc— configuração do sistema e dos serviços./var— dados que mudam: logs, filas, bancos, caches./usr— programas e bibliotecas do sistema./opt— software de terceiros ou da empresa (usaremos/opt/cloudshop)./tmp— temporários, apagados no reinício./home— arquivos de pessoas./proce/sys— visão viva do kernel e dos processos.
Quando alguém disser "a configuração está errada", você já sabe onde olhar; quando disser "o disco encheu", você começa por /var.
3. Caminhos absolutos e relativos
/opt/cloudshop/server.js é absoluto: funciona de qualquer lugar. ./server.js é relativo ao diretório atual. Regra profissional: em scripts, serviços systemd e pipelines use sempre absoluto, porque você não controla de onde o processo será iniciado.
4. Navegar com poucas teclas
pwd diz onde você está, cd - volta ao diretório anterior, cd sozinho vai para a sua home. ls -alh mostra tudo, inclusive arquivos ocultos, com tamanho legível. tree -L 2 dá a visão de estrutura em dois níveis — ótimo para entender um servidor desconhecido.
5. find: buscar por características do arquivo
find filtra por nome (-name), tamanho (-size +50M), tempo de modificação (-mtime -2 = últimas 48 h), tipo (-type f) e permissão (-perm). É a ferramenta para perguntas como "qual arquivo de configuração mudou ontem?" — pergunta que resolve incidentes causados por alteração manual.
6. grep: buscar dentro do conteúdo
grep -rn "DATABASE_URL" /etc/ mostra arquivo e linha. Opções que valem memorizar: -i ignora maiúsculas, -c conta ocorrências, -v inverte a busca, -A3/-B3 mostra linhas de contexto. Onde existir ripgrep (rg), a busca é bem mais rápida.
7. Arquivos gigantes: nunca use cat
Um cat em log de 4 GB inunda o terminal e trava sua sessão no meio da crise. Use tail -n 100 para o fim, tail -f para acompanhar ao vivo, head para o começo e less +G para navegar sem carregar tudo (dentro do less: /termo busca, G vai ao fim, q sai).
8. Montando um filtro em linha de montagem (pipes)
O | liga a saída de um comando à entrada do próximo. É assim que se constrói diagnóstico: grep ERROR app.log | awk '{print $1}' | sort | uniq -c | sort -rn | head responde "quais horários concentram erros?". Aprenda quatro peças — grep, awk, sort, uniq — e você resolve a maioria das análises sem instalar nada.
9. Metadados: stat e ls -l
stat arquivo mostra dono, grupo, permissões, tamanho e três datas (acesso, modificação, mudança de metadados). Em investigação, a data de modificação prova se alguém alterou a configuração antes da falha — evidência objetiva em vez de suposição.
10. Links simbólicos e a estratégia de release
Um symlink é um atalho para outro caminho. Deploy clássico: cada versão em /opt/cloudshop/releases/2026-09-06 e um link current apontando para a ativa. Publicar é trocar o link; reverter também. Isso dá rollback praticamente instantâneo, mesma ideia que Kubernetes implementa com Deployments.
11. Espaço em disco: df e du
df -h responde "quanto falta em cada ponto de montagem"; du -xh --max-depth=1 /var | sort -h responde "quem está ocupando". Faça sempre nessa ordem: primeiro identifique a partição cheia, depois desça no diretório culpado. Lembre também de df -i: é possível ter espaço livre e ficar sem inodes por excesso de arquivos pequenos.
12. Rotina de primeiros 60 segundos em servidor desconhecido
uname -a e lsb_release -a (que sistema é), df -h (disco), systemctl list-units --type=service --state=running (o que roda), ls /etc | less e ls /var/log (onde estão config e logs). Escreva o resultado no runbook do módulo.
Na prática
Comandos de navegação e busca que você usará todo dia
bash
pwd # onde estou -> /home/usuario
ls -alh /etc | head # listar com tamanho legivel
tree -L 2 /var 2>/dev/null || ls -R /var | head
find /var/log -name "*.log" -size +50M # logs grandes
find /etc -name "*.conf" -mtime -2 # config alterada nas ultimas 48h
grep -rn "DATABASE_URL" /etc/cloudshop/ 2>/dev/null
# /etc/cloudshop/app.env:4:DATABASE_URL=postgres://...
tail -n 100 -f /var/log/syslog # acompanhar em tempo real (Ctrl+C sai)
less +G /var/log/syslog # abrir no fim sem carregar tudo
stat /etc/hosts # metadados: dono, permissao, datas
du -xh --max-depth=1 /var | sort -h # quem ocupa espaco -> 2,1G /var/logNota de segurança: Evite grep recursivo em / como root: além de lento, pode expor conteúdo sensível no histórico do terminal.
Análise de log com pipes (sem instalar nada)
bash
# Quantos erros por hora no log da aplicacao
grep "ERROR" /var/log/cloudshop/app.log | awk '{print substr($2,1,2)}' | sort | uniq -c | sort -rn | head
# 142 14 <- pico de erros as 14h
# 87 15
# Top 5 mensagens de erro repetidas
grep "ERROR" /var/log/cloudshop/app.log | cut -d' ' -f4- | sort | uniq -c | sort -rn | head -5
# IPs que mais acessaram (log do nginx)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -5Release com symlink: publicar e reverter em segundos
bash
sudo mkdir -p /opt/cloudshop/releases/2026-09-06
# ... copia os arquivos da nova versao para a pasta acima ...
sudo ln -sfn /opt/cloudshop/releases/2026-09-06 /opt/cloudshop/current
ls -l /opt/cloudshop/current
# current -> /opt/cloudshop/releases/2026-09-06
sudo systemctl restart cloudshop-api # servico aponta para /opt/cloudshop/current
# Rollback: basta apontar para a versao anterior
sudo ln -sfn /opt/cloudshop/releases/2026-09-01 /opt/cloudshop/current
sudo systemctl restart cloudshop-apiDisco cheio: investigação em ordem
bash
df -h # /dev/root 40G 40G 0 100% / <- partição cheia
df -i # confira tambem inodes (IUse% 100% e problema diferente)
sudo du -xh --max-depth=1 / | sort -h | tail -5
# 1,2G /usr
# 6,8G /var <- desca aqui
sudo du -xh --max-depth=1 /var | sort -h | tail -3
# 5,9G /var/log
sudo find /var/log -type f -size +200M -exec ls -lh {} \;
sudo journalctl --vacuum-size=500M # libera espaco do journal com criterioNota de segurança: Nunca apague log "para liberar espaço" antes de coletar a evidência do incidente: copie o trecho relevante primeiro.
Por que isso importa
Em incidente, velocidade de navegação define quantos minutos o serviço fica fora. Quem procura arquivo com clique perde a janela.
Erro comum
Usar cat em arquivos enormes e travar a sessão SSH durante a crise.
Dica de produção
Prefira less +G e tail -f; e sempre confirme com stat quem é o dono do arquivo de configuração.
Pergunta de entrevista
Onde você procuraria a configuração e os logs de um serviço desconhecido em um servidor?
Glossário
- FHS
- Filesystem Hierarchy Standard: convenção sobre o propósito de cada diretório.
- symlink
- Atalho que aponta para outro caminho, usado em estratégias de release/rollback.
- ponto de montagem
- Diretório onde um disco ou partição é acoplado à árvore de arquivos.
- inode
- Estrutura que representa um arquivo no filesystem; podem esgotar mesmo com espaço livre.
- pipe
- Operador | que liga a saída de um comando à entrada do próximo.
- glob
- Padrão como *.log usado pelo shell para expandir nomes de arquivos.
- stat
- Comando que exibe metadados de um arquivo: dono, permissões, tamanho e datas.
Conexão com o CloudShop
Definir /opt/cloudshop para a aplicação e /var/log/cloudshop para os logs.
Quiz da aula
1. Onde ficam, por convenção, os arquivos de configuração do sistema?
2. Qual comando encontra arquivos de configuração alterados nas últimas 48 horas?
3. O disco está em 100% e você precisa achar o culpado. Qual sequência é correta?
4. Por que usar symlink 'current' em deploy?
Minhas anotações
Salvo automaticamente neste navegador.