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 123546
puis créer un lien physique, mais ce serait beaucoup trop lent pour mon application.
NB J'utilise un système de fichiers ext4.
Réponses:
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
debugfs
sur 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).(remplacez
/dev/block/device
par le périphérique de bloc réel dans lequel le système de fichiers réside).Ensuite, à l'invite de
(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.debugfs
, entrezSi tout va bien, entrez:
pour créer le lien physique (notez que le chemin est relatif à la racine du système de fichiers). Suivi par: 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).la source
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
(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.la source