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/updatedbfuncionam e o papel do/etc/updatedb.conf - Responder, com fundamentacao, quando usar
findvslocate, ewhich/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 doPATHwhereis: localiza os arquivos de binario, codigo-fonte e pagina de manual de um comandotype: 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 updatedbpara atualizar o banco de dados - Esquecer o ponto-e-virgula para
-exec: omitir\;emfind ... -exec rm {} \;causafind: missing argument to -exec. Termine com\;ou+ - Confundir
/usre/usr/local: colocar software compilado manualmente em/usr/bincausa 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 cde vazio e confuso. Usetypepara 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
findpor nome, tipo, tamanho, tempo de modificacao, permissoes e proprietario - [ ] Confirmou a diferenca entre
-exec {} \;e-exec {} + - [ ] Refletiu atualizacoes com
sudo updatedbapos uma busca comlocate - [ ] Usou
which/whereis/typeadequadamente
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.