FHS e Localizacao de Arquivos - find, locate e o FHS

FHS e Localizacao de Arquivos - find, locate e o FHS

O Que Voce Vai Alcancar

  • Explicar a finalidade dos principais diretorios no FHS (Filesystem Hierarchy Standard)
  • Decidir onde arquivos pertencem usando as classificacoes "compartilhavel/nao compartilhavel" e "estatico/variavel"
  • Usar os principais testes do find (-name / -type / -size / -mtime / -perm / -user / -newer / -exec) adequadamente
  • Entender como locate / updatedb funcionam e o papel do /etc/updatedb.conf
  • Responder, com fundamentacao, quando usar find vs locate, e which / whereis / type

Este e o nucleo do objetivo 104.7 do LPIC-1 "Encontrar arquivos do sistema e colocar arquivos no local correto". E a habilidade de julgar onde arquivos de configuracao e logs pertencem usando o FHS, e entao realmente localiza-los com find / locate.

Onde Cada Arquivo Pertence no FHS

O FHS 3.0 e a especificacao que padroniza a estrutura de diretorios do Linux. Cada diretorio tem uma funcao clara, e o tipo de arquivo determina onde ele pertence. Comece com os principais diretorios que aparecem frequentemente no exame.

Diretorio Finalidade no FHS
/bin Binarios essenciais de comando do usuario (para todos)
/sbin Binarios do sistema
/etc Configuracao do sistema especifica do host (estatico, nao compartilhavel)
/lib Bibliotecas compartilhadas essenciais e modulos do kernel
/usr Programas e dados compartilhaveis, somente leitura
/usr/bin Maioria dos comandos do usuario
/usr/sbin Comandos de administracao do sistema nao essenciais
/usr/local Software instalado localmente pelo administrador
/var Dados variaveis que mudam durante a operacao
/var/log Arquivos de log
/var/spool Dados de spool como impressao e correio
/tmp Arquivos temporarios
/home Diretorios home dos usuarios regulares
/root Diretorio home do usuario root
/boot Arquivos estaticos do bootloader e do kernel
/dev Arquivos de dispositivo
/proc Sistema de arquivos virtual de informacoes de processo e kernel
/sys Sistema de arquivos virtual de informacoes de dispositivo e kernel
/opt Pacotes de software de aplicativos adicionais
/mnt Ponto de montagem para sistema de arquivos temporario
/media Ponto de montagem para midia removivel
/srv Dados para servicos fornecidos por este sistema

/bin e /sbin devem conter "comandos necessarios antes de /usr ser montado". Logo apos o boot ou em modo de usuario unico, /usr pode ser uma particao separada que ainda nao foi montada, entao os comandos minimos de recuperacao sao colocados na particao raiz por design.

/proc e /sys sao sistemas de arquivos virtuais sem substancia em disco. /proc/cpuinfo e /sys/class/ sao informacoes que o kernel gera dinamicamente; nao sao um lugar para "salvar" arquivos editando.

O Que Sao Compartilhavel/Nao Compartilhavel e Estatico/Variavel

O FHS classifica arquivos ao longo de dois eixos independentes: "compartilhavel vs nao compartilhavel" e "estatico vs variavel". Uma vez que voce entenda isso, por que /usr e /var sao separados finalmente faz sentido.

  • Compartilhavel: arquivos armazenados em um host e utilizaveis por outros hosts (ex: programas sob /usr, /home)
  • Nao compartilhavel: arquivos especificos daquele host (ex: configuracao em /etc, arquivos de bloqueio de dispositivo)
  • Estatico: arquivos que nao mudam sem intervencao do administrador (binarios, bibliotecas, documentacao)
  • Variavel: arquivos que normalmente mudam durante a operacao (logs, spool, cache)
Compartilhavel Nao compartilhavel
Estatico /usr, /opt /boot, /etc
Variavel /var/mail, /var/spool/news /var/run, /var/lock

O objetivo dessa classificacao e permitir colocar arquivos estaticos em midia somente leitura ou aplicar uma politica de backup diferente apenas aos arquivos variaveis. Historicamente, o UNIX misturava ambos os tipos, mas consolidar arquivos variaveis em /var permite montar /usr como somente leitura em um sistema de arquivos separado.

Escolhendo Entre /usr e /usr/local

Software instalado pelo gerenciador de pacotes da distribuicao vai em /usr (/usr/bin, etc.), enquanto software que o administrador instala manualmente vai em /usr/local (/usr/local/bin, etc.). A razao para separar os papeis e clara, e nao mistura-los e a base de sistemas manteniveis.

A hierarquia /usr e o territorio do gerenciador de pacotes (apt / dnf, etc.) e pode ser sobrescrita por atualizacoes do SO ou de pacotes. Por outro lado, /usr/local nao e tocado pelo gerenciamento de pacotes, entao colocar software compilado a partir do codigo-fonte ou seus proprios scripts la evita acidentes onde uma atualizacao do SO exclui ou entra em conflito com eles.

Copiar um comando compilado manualmente diretamente em /usr/bin corre o risco de ser sobrescrito ou entrar em conflito quando um pacote de mesmo nome for atualizado. A intencao do FHS e colocar instalacoes manuais em /usr/local.

Usando os Principais Testes do find

find percorre um diretorio em tempo real e localiza arquivos que correspondem as suas condicoes. Diferente do locate, ele sempre reflete o estado atual e pode encadear acoes subsequentes (exclusao, alteracao de permissao, etc.) de uma vez.

Passo 1: Filtrar por nome e tipo

find /etc -name '*.conf' -type f
/etc/ssh/sshd_config.conf
/etc/logrotate.conf
/etc/resolv.conf

-name corresponde o nome do arquivo (o nome base no final do caminho) a um padrao de shell. -type f significa um arquivo regular, -type d um diretorio, e -type l um link simbolico. Use -iname para ignorar maiusculas/minusculas.

Passo 2: Buscar por tamanho e tempo de modificacao

find /var/log -type f -size +100M
find /home -type f -mtime -7
/var/log/journal/system.journal
/home/user/report-draft.md

-size +100M corresponde a arquivos maiores que 100 MiB. Os sufixos sao c (bytes), k (KiB), M (MiB), G (GiB); + significa "maior que" e - significa "menor que". -mtime -7 significa "modificado nos ultimos 7 x 24 horas". Note que -mtime +1 significa "modificado ha pelo menos 2 dias atras" (partes fracionarias sao descartadas).

Passo 3: Buscar por proprietario e permissoes

find /home -user alice -perm -0200
find / -perm /4000 -type f 2>/dev/null
/home/alice/notes.txt
/usr/bin/passwd

-user alice corresponde a arquivos de propriedade de alice. -perm /4000 significa "qualquer um dos bits especificados esta definido" (aqui SUID), enquanto um prefixo - como -perm -0664 significa "todos os bits especificados estao definidos". Isso e util para auditar bits SUID.

Passo 4: Processar os resultados de busca em lote

find /tmp -name '*.tmp' -mtime +7 -exec rm {} +
find . -name '*.txt' -newer reference.txt -exec ls -l {} \;
-rw-r--r-- 1 user user 320 May 30 10:00 ./new-note.txt

-exec command {} \; executa o comando uma vez por arquivo encontrado, com {} substituido pelo nome do arquivo. -exec command {} + anexa multiplos arquivos a uma unica linha de comando (similar ao xargs), que e mais eficiente. -newer reference.txt seleciona arquivos modificados mais recentemente que o arquivo de referencia.

Escape o ponto-e-virgula em -exec ... {} \; como \; (ou ';') para que o shell nao o interprete. Esquecer isso causa erros como find: missing argument to -exec.

Como locate e updatedb Funcionam

locate nao percorre o sistema de arquivos diretamente; ele busca em um banco de dados pre-construido de nomes de arquivo, tornando-o muito rapido. Muitas distribuicoes usam a implementacao mlocate.

Passo 1: Buscar rapidamente com locate

locate sshd_config
locate -i readme
/etc/ssh/sshd_config
/usr/share/doc/openssh-server/README

locate retorna instantaneamente nomes registrados no banco de dados. Use -i (--ignore-case) para ignorar maiusculas/minusculas. Note, porem, que os resultados sao um snapshot de "a ultima vez que o banco de dados foi atualizado".

Passo 2: Atualizar o banco de dados com updatedb

sudo updatedb
locate newfile.txt
/home/user/newfile.txt

updatedb reconstroi o banco de dados. Arquivos recem-criados ou excluidos nao sao refletidos nos resultados do locate ate voce executar updatedb. Muitos ambientes o executam periodicamente via cron, mas para encontrar um arquivo que voce acabou de criar, uma atualizacao manual e necessaria.

Passo 3: Ajustar os alvos em /etc/updatedb.conf

grep -E 'PRUNEPATHS|PRUNEFS' /etc/updatedb.conf
PRUNEFS="NFS nfs nfs4 afs binfmt_misc ..."
PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober ..."

Ajuste os alvos de indexacao em /etc/updatedb.conf. PRUNEPATHS lista diretorios a excluir da indexacao, e PRUNEFS lista tipos de sistema de arquivos a excluir. Isso previne indexacao desnecessaria de /tmp ou montagens de rede.

Quando Usar find vs locate

Use find quando precisar de precisao em tempo real, e locate quando quiser apenas uma busca rapida por nome. Eles nao competem; escolha por caso de uso.

find percorre o disco e e lento, mas esta sempre atual e suporta condicoes ricas (tamanho, tempo de modificacao, permissoes, proprietario) alem de processamento posterior via -exec. locate le o banco de dados e e instantaneo, mas e limitado a buscas baseadas em nome e nao reflete o estado atual ate apos updatedb. "Onde esta o arquivo que acabei de criar" se adequa ao find; "qual e o caminho daquele arquivo de configuracao" se adequa ao locate.

A Diferenca Entre which / whereis / type

As tres ferramentas que buscam a "localizacao" de um comando tem propositos diferentes. Use which para o binario que sera executado, whereis para o conjunto completo de arquivos relacionados, e type para como o shell interpreta um nome.

which python3
whereis ls
type cd
type ll
/usr/bin/python3
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
cd is a shell builtin
ll is aliased to `ls -alF'
  • which: retorna o caminho completo do comando executado a partir do PATH
  • whereis: localiza os arquivos de binario, codigo-fonte e pagina de manual de um comando
  • type: um builtin do shell; indica se um nome e interpretado como alias, builtin, funcao, keyword ou arquivo

Um builtin do shell como cd nao e encontrado pelo which (nenhum arquivo executavel existe). "Por que which cd esta vazio" e respondido por type cd, que diz que e um builtin.

Erros Comuns e Correcoes

  • Resultados do locate estao desatualizados: um arquivo recem-criado nao aparece / um arquivo excluido permanece. Execute sudo updatedb para atualizar o banco de dados
  • Esquecer o ponto-e-virgula para -exec: omitir \; em find ... -exec rm {} \; causa find: missing argument to -exec. Termine com \; ou +
  • Confundir /usr e /usr/local: colocar software compilado manualmente em /usr/bin causa conflito em atualizacoes de pacote. Coloque instalacoes manuais em /usr/local
  • Interpretar mal o sinal de -mtime: confundir -mtime -1 (nas ultimas 24 horas) e -mtime +1 (ha pelo menos 2 dias). "Arquivos de hoje" e -mtime -1
  • Buscar um builtin do shell com which: which cd e vazio e confuso. Use type para verificar builtins e aliases

Solucao de Problemas

Sintoma: locate nao encontra um arquivo recem-criado

Causa: locate le um banco de dados e tem apenas um snapshot de quando updatedb foi executado

Verificacao:

locate newfile.txt

Correcao: Execute sudo updatedb para atualizar o banco de dados, depois busque novamente. Para encontrar confiavelmente o estado atual, use find.

Sintoma: find -exec da "missing argument to -exec"

Causa: O ponto-e-virgula que termina o comando nao esta escapado

Verificacao:

find . -name '*.log' -exec ls -l {} \;

Correcao: Sempre termine o comando -exec com \; (executar um por vez) ou + (executar em lote).

Sintoma: Executar find / produz muitos erros de permissao

Causa: Voce esta percorrendo diretorios que um usuario regular nao pode ler (partes de /proc ou areas de outros usuarios)

Verificacao:

find / -name target.conf 2>/dev/null

Correcao: Descarte o erro padrao com 2>/dev/null, ou reduza o escopo para /etc etc. Para buscar confiavelmente todo o sistema, use sudo find.

Lista de Verificacao de Conclusao

  • [ ] Revisou a finalidade dos principais diretorios FHS em uma tabela
  • [ ] Entendeu as classificacoes compartilhavel/nao compartilhavel e estatico/variavel
  • [ ] Experimentou buscas com find por nome, tipo, tamanho, tempo de modificacao, permissoes e proprietario
  • [ ] Confirmou a diferenca entre -exec {} \; e -exec {} +
  • [ ] Refletiu atualizacoes com sudo updatedb apos uma busca com locate
  • [ ] Usou which / whereis / type adequadamente

Resumo

Objetivo Comando / Localizacao Ponto
Onde vao arquivos de configuracao /etc (estatico, nao compartilhavel) Especifico do host
Onde vao dados variaveis /var (logs, spool) Mudam durante a operacao
Software instalado manualmente /usr/local Separado do gerenciamento de pacotes
Busca condicional + acao find -size/-mtime/-exec Tempo real, atual, pos-processamento
Busca rapida por nome locate + sudo updatedb Consulta em BD, precisa de atualizacao
Localizacao de um executavel which / whereis / type Escolha por caso de uso

O FHS e o mapa para julgar o "local correto" de um arquivo, enquanto find / locate sao as ferramentas para encontrar o arquivo alvo nesse mapa. Domine ambos, e voce pode rastrear configuracoes e logs sem se perder mesmo em um sistema desconhecido.

Proximas Leituras

Continue Sua Jornada LPIC-1

Hub LPIC-1

  • Hub de Aprendizado LPIC-1 -- Mapa completo de artigos LPIC-1, acompanhamento de progresso e cobertura dos objetivos do exame

Artigos LPIC-1 Relacionados

Pratica