FHS e Localização de Arquivos - find, locate e o FHS

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 / updatedb funcionam e o papel do /etc/updatedb.conf
  • Responder, com fundamentação, quando usar find vs locate, e which / 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 do PATH
  • whereis: localiza os arquivos de binário, código-fonte e página de manual de um comando
  • type: 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 updatedb para atualizar o banco de dados
  • Esquecer o ponto-e-vírgula 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 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. Use type para 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 find por 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 updatedb após uma busca com locate
  • [ ] Usou which / whereis / type adequadamente

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.

Próximas 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

Prática