FHS e Localização de Arquivos - find, locate e o FHS
O Que Você Vai Alcançar
- Explicar a finalidade dos principais diretórios no FHS (Filesystem Hierarchy Standard)
- Decidir onde arquivos pertencem usando as classificações "compartilhável/não compartilhável" e "estático/variável"
- 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 fundamentação, quando usar
findvslocate, ewhich/whereis/type
Este é o núcleo do objetivo 104.7 do LPIC-1 "Encontrar arquivos do sistema e colocar arquivos no local correto". É a habilidade de julgar onde arquivos de configuração e logs pertencem usando o FHS, e então realmente localizá-los com find / locate.
Onde Cada Arquivo Pertence no FHS
O FHS 3.0 é a especificação que padroniza a estrutura de diretórios do Linux. Cada diretório tem uma função clara, e o tipo de arquivo determina onde ele pertence. Comece com os principais diretórios que aparecem frequentemente no exame.
| Diretório | Finalidade no FHS |
|---|---|
/bin |
Binários essenciais de comando do usuário (para todos) |
/sbin |
Binários do sistema |
/etc |
Configuração do sistema específica do host (estático, não compartilhável) |
/lib |
Bibliotecas compartilhadas essenciais e módulos do kernel |
/usr |
Programas e dados compartilháveis, somente leitura |
/usr/bin |
Maioria dos comandos do usuário |
/usr/sbin |
Comandos de administração do sistema não essenciais |
/usr/local |
Software instalado localmente pelo administrador |
/var |
Dados variáveis que mudam durante a operação |
/var/log |
Arquivos de log |
/var/spool |
Dados de spool como impressão e correio |
/tmp |
Arquivos temporários |
/home |
Diretórios home dos usuários regulares |
/root |
Diretório home do usuário root |
/boot |
Arquivos estáticos do bootloader e do kernel |
/dev |
Arquivos de dispositivo |
/proc |
Sistema de arquivos virtual de informações de processo e kernel |
/sys |
Sistema de arquivos virtual de informações de dispositivo e kernel |
/opt |
Pacotes de software de aplicativos adicionais |
/mnt |
Ponto de montagem para sistema de arquivos temporário |
/media |
Ponto de montagem para mídia removível |
/srv |
Dados para serviços fornecidos por este sistema |
/bin e /sbin devem conter "comandos necessários antes de /usr ser montado". Logo após o boot ou em modo de usuário único, /usr pode ser uma partição separada que ainda não foi montada, então os comandos mínimos de recuperação são colocados na partição raiz por design.
/proc e /sys são sistemas de arquivos virtuais sem substância em disco. /proc/cpuinfo e /sys/class/ são informações que o kernel gera dinamicamente; não são um lugar para "salvar" arquivos editando.
O Que São Compartilhável/Não Compartilhável e Estático/Variável
O FHS classifica arquivos ao longo de dois eixos independentes: "compartilhável vs não compartilhável" e "estático vs variável". Uma vez que você entenda isso, por que /usr e /var são separados finalmente faz sentido.
- Compartilhável: arquivos armazenados em um host e utilizáveis por outros hosts (ex: programas sob
/usr,/home) - Não compartilhável: arquivos específicos daquele host (ex: configuração em
/etc, arquivos de bloqueio de dispositivo) - Estático: arquivos que não mudam sem intervenção do administrador (binários, bibliotecas, documentação)
- Variável: arquivos que normalmente mudam durante a operação (logs, spool, cache)
| Compartilhável | Não compartilhável | |
|---|---|---|
| Estático | /usr, /opt |
/boot, /etc |
| Variável | /var/mail, /var/spool/news |
/var/run, /var/lock |
O objetivo dessa classificação é permitir colocar arquivos estáticos em mídia somente leitura ou aplicar uma política de backup diferente apenas aos arquivos variáveis. Historicamente, o UNIX misturava ambos os tipos, mas consolidar arquivos variáveis 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 distribuição vai em /usr (/usr/bin, etc.), enquanto software que o administrador instala manualmente vai em /usr/local (/usr/local/bin, etc.). A razão para separar os papéis é clara, e não misturá-los é a base de sistemas manteníveis.
A hierarquia /usr é o território do gerenciador de pacotes (apt / dnf, etc.) e pode ser sobrescrita por atualizações do SO ou de pacotes. Por outro lado, /usr/local não é tocado pelo gerenciamento de pacotes, então colocar software compilado a partir do código-fonte ou seus próprios scripts lá evita acidentes onde uma atualização 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 intenção do FHS é colocar instalações manuais em /usr/local.
Usando os Principais Testes do find
find percorre um diretório em tempo real e localiza arquivos que correspondem às suas condições. Diferente do locate, ele sempre reflete o estado atual e pode encadear ações subsequentes (exclusão, alteração de permissão, 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 padrão de shell. -type f significa um arquivo regular, -type d um diretório, e -type l um link simbólico. Use -iname para ignorar maiúsculas/minúsculas.
Passo 2: Buscar por tamanho e tempo de modificação
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 são c (bytes), k (KiB), M (MiB), G (GiB); + significa "maior que" e - significa "menor que". -mtime -7 significa "modificado nos últimos 7 x 24 horas". Note que -mtime +1 significa "modificado há pelo menos 2 dias atrás" (partes fracionárias são descartadas).
Passo 3: Buscar por proprietário e permissões
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 está definido" (aqui SUID), enquanto um prefixo - como -perm -0664 significa "todos os bits especificados estão definidos". Isso é útil 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 {} substituído pelo nome do arquivo. -exec command {} + anexa múltiplos arquivos a uma única linha de comando (similar ao xargs), que é mais eficiente. -newer reference.txt seleciona arquivos modificados mais recentemente que o arquivo de referência.
Escape o ponto-e-vírgula em -exec ... {} \; como \; (ou ';') para que o shell não o interprete. Esquecer isso causa erros como find: missing argument to -exec.
Como locate e updatedb Funcionam
locate não percorre o sistema de arquivos diretamente; ele busca em um banco de dados pré-construído de nomes de arquivo, tornando-o muito rápido. Muitas distribuições usam a implementação 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 maiúsculas/minúsculas. Note, porém, que os resultados são um snapshot de "a última 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 reconstrói o banco de dados. Arquivos recém-criados ou excluídos não são refletidos nos resultados do locate até você executar updatedb. Muitos ambientes o executam periodicamente via cron, mas para encontrar um arquivo que você acabou de criar, uma atualização manual é necessária.
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 indexação em /etc/updatedb.conf. PRUNEPATHS lista diretórios a excluir da indexação, e PRUNEFS lista tipos de sistema de arquivos a excluir. Isso previne indexação desnecessária de /tmp ou montagens de rede.
Quando Usar find vs locate
Use find quando precisar de precisão em tempo real, e locate quando quiser apenas uma busca rápida por nome. Eles não competem; escolha por caso de uso.
find percorre o disco e é lento, mas está sempre atual e suporta condições ricas (tamanho, tempo de modificação, permissões, proprietário) além de processamento posterior via -exec. locate lê o banco de dados e é instantâneo, mas é limitado a buscas baseadas em nome e não reflete o estado atual até após updatedb. "Onde está o arquivo que acabei de criar" se adequa ao find; "qual é o caminho daquele arquivo de configuração" se adequa ao locate.
A Diferença Entre which / whereis / type
As três ferramentas que buscam a "localização" de um comando têm propósitos diferentes. Use which para o binário que será 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 binário, código-fonte e página de manual de um comandotype: um builtin do shell; indica se um nome é interpretado como alias, builtin, função, keyword ou arquivo
Um builtin do shell como cd não é encontrado pelo which (nenhum arquivo executável existe). "Por que which cd está vazio" é respondido por type cd, que diz que é um builtin.
Erros Comuns e Correções
- Resultados do locate estão desatualizados: um arquivo recém-criado não aparece / um arquivo excluído permanece. Execute
sudo updatedbpara atualizar o banco de dados - Esquecer o ponto-e-vírgula 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 atualizações de pacote. Coloque instalações manuais em/usr/local - Interpretar mal o sinal de
-mtime: confundir-mtime -1(nas últimas 24 horas) e-mtime +1(há pelo menos 2 dias). "Arquivos de hoje" é-mtime -1 - Buscar um builtin do shell com which:
which cdé vazio e confuso. Usetypepara verificar builtins e aliases
Solução de Problemas
Sintoma: locate não encontra um arquivo recém-criado
Causa: locate lê um banco de dados e tem apenas um snapshot de quando updatedb foi executado
Verificação:
locate newfile.txt
Correção: Execute sudo updatedb para atualizar o banco de dados, depois busque novamente. Para encontrar confiavelmente o estado atual, use find.
Sintoma: find -exec dá "missing argument to -exec"
Causa: O ponto-e-vírgula que termina o comando não está escapado
Verificação:
find . -name '*.log' -exec ls -l {} \;Correção: Sempre termine o comando -exec com \; (executar um por vez) ou + (executar em lote).
Sintoma: Executar find / produz muitos erros de permissão
Causa: Você está percorrendo diretórios que um usuário regular não pode ler (partes de /proc ou áreas de outros usuários)
Verificação:
find / -name target.conf 2>/dev/null
Correção: Descarte o erro padrão com 2>/dev/null, ou reduza o escopo para /etc etc. Para buscar confiavelmente todo o sistema, use sudo find.
Lista de Verificação de Conclusão
- [ ] Revisou a finalidade dos principais diretórios FHS em uma tabela
- [ ] Entendeu as classificações compartilhável/não compartilhável e estático/variável
- [ ] Experimentou buscas com
findpor nome, tipo, tamanho, tempo de modificação, permissões e proprietário - [ ] Confirmou a diferença entre
-exec {} \;e-exec {} + - [ ] Refletiu atualizações com
sudo updatedbapós uma busca comlocate - [ ] Usou
which/whereis/typeadequadamente
Resumo
| Objetivo | Comando / Localização | Ponto |
|---|---|---|
| Onde vão arquivos de configuração | /etc (estático, não compartilhável) |
Específico do host |
| Onde vão dados variáveis | /var (logs, spool) |
Mudam durante a operação |
| Software instalado manualmente | /usr/local |
Separado do gerenciamento de pacotes |
| Busca condicional + ação | find -size/-mtime/-exec |
Tempo real, atual, pós-processamento |
| Busca rápida por nome | locate + sudo updatedb |
Consulta em BD, precisa de atualização |
| Localização de um executável | which / whereis / type |
Escolha por caso de uso |
O FHS é o mapa para julgar o "local correto" de um arquivo, enquanto find / locate são as ferramentas para encontrar o arquivo alvo nesse mapa. Domine ambos, e você pode rastrear configurações e logs sem se perder mesmo em um sistema desconhecido.