¿Cómo crear un enlace duro a un inodo (ext4)?


17

Si conozco el nodo de índice (inodo) de un archivo, pero no sé su ruta (o cualquiera de sus rutas), ¿es posible crear un enlace directo a ese inodo directamente?

Podría encontrar el archivo usando sudo find / -inum 123546y luego crear un enlace duro, pero eso sería demasiado lento para mi aplicación.

Nota: estoy usando un sistema de archivos ext4.


1
Estrechamente relacionado: eliminar o renombrar un archivo a través de su inodo (los cuales son igualmente imposibles de hacer directamente).
Gilles 'SO- deja de ser malvado'

Respuestas:


23

AFAIK, no con la API del núcleo. Si existiera una interfaz de este tipo, tendría que limitarse al superusuario, ya que de lo contrario eso permitiría a cualquiera acceder a los archivos en directorios a los que no tiene acceso de búsqueda.

Pero podría usarlo debugfsen el sistema de archivos (una vez que esté desmontado) para hacerlo (suponiendo que tenga acceso de escritura al dispositivo de bloqueo).

debugfs -w / dev / block / device

(reemplace /dev/block/devicecon el dispositivo de bloque real en el que reside el sistema de archivos).

Luego, cuando se le solicite debugfs, ingrese

stat < 123 >
(con los corchetes angulares, reemplazando 123 con el número de inodo real) para verificar que el archivo existe (el inodo tiene un recuento de enlaces mayor que 0) y no es un directorio.

Si todo está bien, ingrese:

En < 123 > ruta / a / archivo nuevo
para crear el enlace duro (tenga en cuenta que la ruta es relativa a la raíz del sistema de archivos). Seguido por:

mi < 123 >
para incrementar el recuento de enlaces (presione Enterpara todos los campos, excepto el recuento de enlaces donde desee agregar 1 al valor actual).


66
Dicha interfaz también tendría que verificar que el archivo tenga un recuento de enlaces distinto de cero, de lo contrario sería posible resucitar un archivo eliminado pero aún abierto, que el IIRC fue rechazado porque viola invariantes del núcleo.
Gilles 'SO- deja de ser malvado'


1
@PhilipCouling, el bit de permiso de ejecución en un directorio se traduce en permiso de búsqueda . Ya dije en los directorios, entonces no tengo acceso de búsqueda .
Stéphane Chazelas

3
@OrangeDog, el permiso de búsqueda es la terminología utilizada por el estándar POSIX.
Stéphane Chazelas

1
@mosvy: Ese cheque se puede eliminar del núcleo. Sin embargo, debe parchear un par de lugares en VFS para que no se mangue. Lo hice mientras trabajaba en mi tesis hace años.
Joshua

3

Dependiendo de su caso de uso, otro enfoque podría ser recopilar primero todos los candidatos de archivo en un directorio al vincularlo y luego vincular los archivos que le interesan particularmente.

Como

mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
  while IFS=/ read -rd '' i n; do
    ln "$n" "by-inode/$((i/1000))/$i"
  done

(suponiendo que sus números de inodo sean todos inferiores a 1,000,000, cree más directorios si es necesario).

Posteriormente, sus inodes se agrupan en 1000 y se recogen en el by-inode/árbol. Desde allí, puede vincularlos según sea necesario.

Sin embargo, <path>tenga en cuenta que significa que eliminar archivos debajo no reclamará el espacio debido a ese enlace extra duro.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.