Surpreende-me ver encontrar iterar/percorrer o sistema de arquivos completo quando faço um simples
find -inum 12345
Sem informações básicas, parece-me que deveria haver maneiras muito mais fáceis de informar todos os arquivos com este inode específico 12345 (que é simplesmente um espaço reservado aqui)?
Existe talvez uma maneira melhor para isso? Aquele que não exige verificar toda a estrutura de diretórios de um sistema de arquivos simplesmente para saber quais nomes de arquivos estão relacionados a um inode?
atualizar
Há outra questão abordando o assunto Encontre rapidamente quais arquivos pertencem 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 isso é 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 percorrer a estrutura de diretórios para procurar todos os nomes de arquivos em um inode.
Ainda assim, parece bastante estranho que qualquer sistema de arquivos tenha esse problema ao informar todos os nomes de arquivos para um usuário inode (pelo menos para o root
usuário privilegiado).
O sistema de arquivos para o qual estou mais interessado em responder a esta pergunta (se for importante) é o ext4.
Responder1
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 doentradas de diretóriodados armazenados em arquivos do tipo diretório.
Isso significa que aqueles arquivos do tipo diretório 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.
um tanto simplificado (ext3/4 usa aprimoramentos de tabelas hash para acelerar a travessia da árvore de diretórios, etc ...) parece uma listagem:
## filenames ## ## inode-numbers ##
filename1 0123
filename2 01242
anotherfilename 3313
yetanotherfilename 11233
Essencialmente os nomes dos arquivossó ocorre dentro dos dados relacionados aos arquivos de diretório enão são armazenados em nenhum lugar nos metadadoso sistema de arquivos armazenapara/dos inodes. Portanto, a única maneira de obter os nomes de arquivos relacionados a um número de inode é percorrendo todas as entradas de diretório de todos os arquivos de diretório.
Responder2
Você escreveu:
Surpreende-me ver find iterar/percorrer todo o sistema de arquivos quando faço um simples find -inum 12345
find
, por definição, percorre a árvore começando no diretório ou diretórios especificados, com um diretório inicial padrão de .
.
find -inum 12345
percorrerá toda a árvore de diretórios, começando pelo diretório de trabalho atual. Provavelmente não percorrerá 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ê vinculou - mas find
é necessário fazer uma caminhada na árvore por causa depadrões. Observe que se o inode que você está procurando tiver apenas um link, você pode dar find
a -quit
opção, se for compatível, de encerrar a caminhada na árvore após a primeira correspondência.
Mesmo esses outros comandos nem sempre são rápidos, em parte porque precisam examinar todo um sistema de arquivos em vez de apenas uma árvore de diretórios, mas fazem o melhor que podem com os dados que têm disponíveis para trabalhar. O problema básico é a estrutura da maioria dos sistemas de arquivos Unix.
- há 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 um par (número do inode, nome do arquivo).
- Para encontrar o diretório ou diretórios contendo o 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 pesquisar cada entrada de cada diretório no sistema de arquivos até encontrar todas as entradas correspondentes. O inode de um arquivofazcontém o número de entradas de diretório que se referem a ele, para que possam encerrar a pesquisa assim que encontrarem esse número de entradas.
- Por outro lado, encontrar o nome de um diretório é muito mais eficiente, porque cada diretório contém o número do inode de seu diretório pai,
..
portanto, apenas um diretório precisa ser pesquisado em busca de uma entrada correspondente. (Há uma exceção: o diretório raiz de um sistema de arquivos possui uma..
entrada que aponta para esse mesmo diretório.)
Responder3
Uma resposta mais simples poderia ser por analogia.
Imagine pesquisar em uma lista telefônica um número de telefone em vez de um nome.