¿Por qué find -inum recorre todo el árbol del sistema de archivos?

¿Por qué find -inum recorre todo el árbol del sistema de archivos?

Me sorprende ver encontrar iterar/recorrer el sistema de archivos completo cuando hago una simple

find -inum 12345

Sin información previa, me parece que debería haber formas mucho más fáciles de identificar todos los archivos con este inodo específico 12345 (que es simplemente un marcador de posición aquí).

¿Existe tal vez una manera mejor para esto? ¿Uno que no requiera revisar toda la estructura de directorios de un sistema de archivos simplemente para saber qué nombres de archivos están relacionados con un inodo?

actualizar

Hay otra pregunta que aborda el tema. Encuentre rápidamente qué archivos pertenecen a un número de inodo específico pero con la intención de encontrar una forma mejor (más rápida).

Esta pregunta está más dirigida a saber por qué es un problema en primer lugar. Tal vez haya una buena razón relacionada con los permisos, etc., que intentaría dificultar intencionalmente a los usuarios evitar atravesar la estructura del directorio para buscar todos los nombres de archivos en un inodo.

Aún así, parece bastante extraño que cualquier sistema de archivos tenga tal problema al decirle todos los nombres de archivos a un rootusuario de inodo (al menos al privilegiado).

El sistema de archivos para el que estoy más interesado en que se responda esta pregunta (si es importante) es ext4.

Respuesta1

La razón muy simple es que al menos para los sistemas de archivos de tipo ext2/ext3/ext4, los nombres de archivos se almacenan a través delentradas de directoriodatos almacenados en archivos de tipo directorio.

Esto significa que aquellos archivos que son de tipo directorio tienen un sistema más o menos complejo para almacenar los nombres de los archivos (de los archivos dentro del directorio) y los inodos que conducen a los datos de esos archivos.

algo simplificado (ext3/4 usa mejoras en las tablas hash para acelerar el recorrido del árbol de directorios, etc.), se parece a esta lista:

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

Esencialmente los nombres de archivossolo ocurre dentro de los datos relacionados con los archivos del directorio yno se almacenan en ninguna parte de los metadatosel sistema de archivos almacenapara/de los inodos. Por lo tanto, la única forma de obtener los nombres de archivos relacionados con un número de inodo es revisando todas las entradas del directorio de todos los archivos del directorio.

Respuesta2

Tu escribiste:

Me sorprende ver iterar/recorrer el sistema de archivos completo cuando hago un simple find -inum 12345

find, por definición, recorre un árbol comenzando en el directorio o directorios dados, con un directorio inicial predeterminado de ..

find -inum 12345recorrerá todo el árbol de directorios comenzando con el directorio de trabajo actual. Probablemente no recorrerá un sistema de archivos completo, a menos que .contenga un punto de montaje del sistema de archivos.

Hay formas más eficientes de encontrar todos los archivos con un número de inodo determinado ( fsdb, debugfsy nchecken la respuesta a la que se vinculó), pero findtiene que recorrer el árbol debido aestándares. Tenga en cuenta que si el inodo que está buscando tiene solo un enlace, puede darle findla -quitopción, si lo admite, de finalizar el recorrido del árbol después de la primera coincidencia.

Incluso esos otros comandos no siempre son rápidos, en parte porque deben revisar un sistema de archivos completo en lugar de solo un árbol de directorios, pero hacen lo mejor que pueden con los datos que tienen disponibles para trabajar. El problema básico es la estructura de la mayoría de los sistemas de archivos Unix.

  • hay mucha información en el inodo de un archivo, pero "el nombre o nombres del archivo" y "el directorio o directorios que contienen el archivo" no se encuentran entre ellos.
  • La estructura de un directorio en la mayoría de los sistemas de archivos Unix es muy simple: solo contiene una lista de entradas, cada una de ellas un par (número de inodo, nombre de archivo).
  • Para encontrar el directorio o directorios que contienen el inodo 12345, y el nombre o nombres con los que esos directorios se refieren a él, en la mayoría de los sistemas de archivos Unix, estos comandos tienen que buscar en cada entrada de cada directorio del sistema de archivos hasta encontrar todas las entradas coincidentes. El inodo de un archivo.hacecontiene el número de entradas del directorio que hacen referencia a él, de modo que puedan dejar de buscar tan pronto como hayan encontrado tantas entradas.
  • Por el contrario, encontrar el nombre de un directorio es mucho más eficiente, porque cada directorio contiene el número de inodo de su directorio principal, ..por lo que sólo es necesario buscar una entrada coincidente en ese directorio. (Hay una excepción: el directorio raíz de un sistema de archivos tiene una ..entrada que apunta a ese mismo directorio).

Respuesta3

Una respuesta más sencilla podría ser por analogía.

Imagínese buscar en una guía telefónica un número de teléfono en lugar de un nombre.

información relacionada