Pourquoi les fichiers ne peuvent-ils pas être manipulés par inode?

Pourquoi est-ce que vous ne pouvez pas accéder à un fichier lorsque vous ne connaissez que son inode, sans chercher un fichier qui est lié à cet inode? Un lien physique vers le fichier ne contient rien d’autre qu’un nom et un numéro vous indiquant où trouver l’inode avec toutes les informations réelles sur le fichier. J’ai été surpris quand on m’a dit qu’il n’y avait pas de moyen usermode d’utiliser directement le numéro d’inode pour ouvrir un fichier.

Cela semble être une capacité inoffensive et utile pour le système. Pourquoi n’est-ce pas fourni?

Certains systèmes d’exploitation ont cette facilité. Par exemple, OS X en a besoin pour supporter le gestionnaire de fichiers Carbon , et sous Linux, vous pouvez utiliser les debugfs . Bien sûr, vous pouvez le faire sous UNIX à partir de la ligne de commande via find -inum , mais la véritable raison pour laquelle vous ne pouvez pas accéder aux fichiers par inode est que cela n’est pas particulièrement utile. Cela permet de contourner les permissions de fichiers, car s’il existe un fichier que vous pouvez lire dans un dossier que vous ne pouvez pas lire ou exécuter, alors l’ouverture de l’inode vous permet de le découvrir.

La raison pour laquelle ce n’est pas très utile est que vous devez rechercher un numéro d’inode via un appel à *stat() , auquel cas vous avez déjà le nom de fichier (ou un fichier ouvert) … ou vous devez deviner l’inum.

Pour des raisons de sécurité – pour accéder à un fichier, vous devez avoir la permission sur le fichier AS WELL AS de rechercher tous les répertoires à partir de la racine nécessaire pour accéder au fichier. Si vous pouviez accéder à un fichier par inode, vous pourriez ignorer les vérifications sur les répertoires contenant.

Cela vous permet de créer un fichier accessible à un ensemble d’utilisateurs (ou à un ensemble de groupes) et à personne d’autre – créer des répertoires accessibles uniquement aux utilisateurs (un répertoire par utilisateur), puis lier le fichier à tous ces répertoires – le fichier lui-même est accessible à tout le monde, mais seul un utilisateur disposant des droits de recherche sur l’un des répertoires auxquels il est associé peut y accéder.

En réponse à votre commentaire: Pour “passer un fichier”, vous pouvez utiliser fd en passant sur les sockets AF_LOCAL au moyen de SCM_RIGHTS (voir man 7 unix ).

Btrfs possède un ioctl pour cela (BTRFS_IOC_INO_PATHS ajouté dans ce correctif ), mais il ne tente pas de vérifier les permissions le long du chemin, et est simplement réservé à root.

Si vous avez déjà recherché un fichier via un chemin, vous ne devriez pas avoir à le faire encore et encore?

 stat(f,&s); i=open(f,O_MODE); 

implique deux chaluts à travers une structure de répertoire. Cela gaspille des cycles de processeur avec des opérations de chaîne inutiles. Oui, le cache fs bien conçu gênera la plupart de cette inefficacité d’un utilisateur occasionnel, mais répéter le travail sans aucune raison est moche, si ce n’est tout simplement idiot.