Por que encontrar -inum itera toda a árvore do sistema de arquivos?

1

Surpreende-me ver iterar / percorrer todo o sistema de arquivos quando faço uma simples

find -inum 12345

Sem informações de segundo plano, parece-me que deve haver maneiras muito mais fáceis de contar todos os arquivos com este inode 12345 específico (que é simplesmente um espaço reservado aqui)?

Existe talvez uma maneira melhor para isso? Um que não requer checar toda a estrutura de diretório de um sistema de arquivos simplesmente para dizer quais nomes de arquivos estão relacionados a um inode?

atualização

Há outra questão que aborda o problema Encontre rapidamente qual arquivo (s) pertence (m) a um número de inode específico mas com a intenção de encontrar um caminho melhor (mais rápido).

Esta questão é mais direcionada para saber por que é um problema tão grande? Talvez haja um bom motivo relacionado a permissões, etc., que tentaria tornar intencionalmente difícil para os usuários evitarem atravessar a estrutura de diretório para procurar por todos os nomes de arquivos em um inode.

Ainda assim, parece bastante estranho que qualquer sistema de arquivos tenha tal problema informando todos os nomes de arquivos para um inode (pelo menos para o usuário privilegiado root )

O sistema de arquivos pelo qual estou mais interessado em responder a essa pergunta (se for importante) é o ext4.

    
por humanityANDpeace 11.10.2014 / 18:24

2 respostas

1

A razão muito simples é que, pelo menos para os sistemas de arquivos do tipo ext2 / ext3 / ext4, os nomes dos arquivos são armazenados através do entradas de diretório dados armazenados em arquivos de tipo de diretório.

Isso significa que os arquivos do diretório type possuem um sistema mais ou menos complexo para armazenar nomes de arquivos (dos arquivos dentro do diretório) e os inodes que levam aos dados desses arquivos.

de alguma forma simplificado (ext3 / 4 usam melhorias de tabelas de hash para acelerar a navegação na árvore de diretórios, etc ...), parece uma listagem:

## filenames ##    ## inode-numbers ##
filename1            0123
filename2            01242
anotherfilename      3313
yetanotherfilename   11233

Essencialmente, os nomes dos arquivos só ocorrem dentro dos dados relacionados aos arquivos direcotry e não são armazenados em nenhum lugar dos metadados que o sistema de arquivos armazena para / do inodes . Portanto, a única maneira de obter os nomes de arquivos relacionados a um número de inode é através de todas as entradas de diretório de todos os arquivos de diretório.

    
por 11.10.2014 / 20:34
1

Você escreveu:

It surprises me to see find iterate/walk through the complete filesystem when I do a simple find -inum 12345

find , por definição, faz uma caminhada na árvore iniciando no diretório ou diretórios fornecidos, com um diretório inicial padrão de . .

find -inum 12345 percorrerá toda a árvore de diretórios, começando com o diretório de trabalho atual. Ele provavelmente não passará por um sistema de arquivos inteiro, a menos que . contenha um ponto de montagem do sistema de arquivos.

Existem maneiras mais eficientes de encontrar todos os arquivos com um determinado número de inode - fsdb , debugfs e ncheck na resposta à qual você se vinculou - mas find tem que fazer uma caminhada na árvore por causa normas . Note que se o inode que você está procurando tem apenas um link, você pode dar a find a opção -quit , se ela suportar, encerrar a caminhada da árvore após a primeira partida.

Mesmo esses outros comandos nem sempre são rápidos, em parte porque eles precisam examinar um sistema de arquivos inteiro em vez de apenas uma árvore de diretórios, mas eles fazem o melhor que podem com os dados disponíveis para trabalhar. O problema básico é a estrutura da maioria dos sistemas de arquivos Unix.

  • existem muitas informações no inode de um arquivo, mas "o nome ou nomes do arquivo" e "o diretório ou diretórios que contêm o arquivo" não estão entre eles.
  • A estrutura de um diretório na maioria dos sistemas de arquivos Unix é muito simples: ele contém apenas uma lista de entradas, cada uma delas com um par (número de inode, nome de arquivo).
  • Para encontrar o diretório ou diretórios que contenham inode 12345 e o nome ou nomes pelos quais esses diretórios se referem a ele, na maioria dos sistemas de arquivos Unix, esses comandos precisam procurar em todas as entradas de todos os diretórios no sistema de arquivos até encontrar todos os diretórios. entradas correspondentes. O inode de um arquivo contém o número de entradas de diretório que se referem a ele, assim eles podem sair da pesquisa assim que encontrarem muitas entradas.
  • Por outro lado, encontrar um nome de diretório é muito mais eficiente, porque cada diretório contém o número de inode de seu diretório pai, .. , portanto, apenas um diretório precisa ser pesquisado para uma entrada correspondente. (Há uma exceção: o diretório raiz de um sistema de arquivos possui uma entrada .. que aponta para o mesmo diretório).
por 13.10.2014 / 00:16