Comment créer un lien dur vers un inode (ext4)?

17

Si je connais le nœud d'index (inode) d'un fichier, mais je ne connais pas son chemin (ou l'un de ses chemins), est-il possible de créer un lien dur vers cet inode directement?

Je pourrais trouver le fichier en utilisant sudo find / -inum 123546puis créer un lien physique, mais ce serait beaucoup trop lent pour mon application.

NB J'utilise un système de fichiers ext4.

Une pierre
la source
1
Étroitement liés: supprimer ou renommer un fichier via son inode (les deux sont également impossibles à faire directement).
Gilles 'SO- arrête d'être méchant'

Réponses:

23

AFAIK, pas avec l'API du noyau. Si une telle interface existait, elle devrait être limitée au super-utilisateur, sinon cela permettrait à quiconque d'accéder aux fichiers dans des répertoires auxquels il n'a pas accès en recherche.

Mais vous pouvez utiliser debugfssur le système de fichiers (une fois qu'il est démonté) pour le faire (en supposant que vous avez un accès en écriture au périphérique de bloc).

debugfs -w / dev / block / device

(remplacez /dev/block/devicepar le périphérique de bloc réel dans lequel le système de fichiers réside).

Ensuite, à l'invite de debugfs, entrez

stat < 123 >
(avec les crochets, en remplaçant 123 par le numéro d'inode réel) pour vérifier que le fichier existe (l'inode a un nombre de liens supérieur à 0) et n'est pas un répertoire.

Si tout va bien, entrez:

ln < 123 > chemin / vers / nouveaufichier
pour créer le lien physique (notez que le chemin est relatif à la racine du système de fichiers). Suivi par:

mi < 123 >
pour augmenter le nombre de liens (appuyez sur Enterpour tous les champs sauf le nombre de liens où vous voudrez ajouter 1 à la valeur actuelle).

Stéphane Chazelas
la source
6
Une telle interface devrait également vérifier que le fichier a un nombre de liens non nul, sinon il serait possible de ressusciter un fichier supprimé mais toujours ouvert, que l'IIRC a été rejeté car il viole les invariants du noyau.
Gilles 'SO- arrête d'être méchant'
2
@Gilles related: unix.stackexchange.com/a/499760/308316
mosvy
1
@PhilipCouling, le bit d'autorisation d' exécution sur un répertoire se traduit par une autorisation de recherche . J'ai déjà dit dans les répertoires que je n'ai pas accès à la recherche .
Stéphane Chazelas
3
@OrangeDog, l' autorisation de recherche est la terminologie utilisée par la norme POSIX.
Stéphane Chazelas
1
@mosvy: Cette vérification peut être supprimée du noyau. Vous devez cependant corriger quelques endroits dans VFS pour qu'il ne se mouille pas lui-même. Je l'ai fait en travaillant sur ma thèse il y a des années.
Joshua
3

Selon votre cas d'utilisation, une autre approche pourrait être de collecter d'abord tous les candidats de fichier dans un répertoire en le liant en dur puis en liant en dur les fichiers qui vous intéressent particulièrement.

Tel que

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

(en supposant que vos numéros d'inode sont tous inférieurs à 1 000 000, créez plus de répertoires si nécessaire).

Ensuite, vos inodes sont regroupés par 1000 et collectés dans l' by-inode/arbre. De là, vous pouvez les lier au besoin.

Notez cependant que cela signifie que la suppression de fichiers sous <path>ne récupérera pas l'espace en raison de ce lien dur supplémentaire.

glglgl
la source