Comment tracer efficacement un lien physique sous Linux?

Sep 02 2020

Les softlinks sont facilement traçables vers le fichier original avec readlinketc ... mais j'ai du mal à tracer des liens durs vers le fichier original.

$ ll -i /usr/bin/bash /bin/bash  
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*  
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /usr/bin/bash*
                   ^

ci-dessus est comme prévu - cool -> les deux fichiers pointent vers le même inode 1310813
(mais le nombre de liens, indiqué par ^, semble être 1. De la réponse de Gilles, la raison peut être comprise)

$ find / -samefile /bin/bash 2>/dev/null
/usr/bin/bash

ci-dessus est comme prévu - donc pas de problèmes.

$ find / -samefile /usr/bin/bash 2>/dev/null
/usr/bin/bash  

ci-dessus n'est pas cool. Comment tracer le fichier d'origine ou chaque lien physique en utilisant le /usr/bin/bashfichier comme référence?

Étrange - ci-dessous n'a pas aidé non plus.

$ find / -inum 1310813 2>/dev/null
/usr/bin/bash

Réponses

45 StephenKitt Sep 02 2020 at 13:26

Premièrement, il n'y a pas de fichier original dans le cas des liens physiques; tous les liens durs sont égaux.

Cependant, les liens physiques ne sont pas impliqués ici, comme indiqué par le nombre de liens de 1 dans ls -lla sortie de:

$ ll -i /usr/bin/bash /bin/bash  
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*  
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /usr/bin/bash*

Votre problème vient d'un lien symbolique, le binlien symbolique vers lequel pointe usr/bin. Pour trouver tous les chemins dans lesquels bashest disponible , vous devez dire findde suivre les liens symboliques, en utilisant l' -Loption:

$ find -L / -xdev -samefile /usr/bin/bash 2>/dev/null
/usr/bin/rbash
/usr/bin/bash
/bin/rbash
/bin/bash

J'utilise -xdevici parce que je sais que votre système est installé sur un seul système de fichiers; On évite ainsi de descendre dans /dev, /proc, /run, /sysetc.

24 Gilles'SO-stopbeingevil' Sep 02 2020 at 14:05

comment tracer le fichier original ou chaque lien physique en utilisant le fichier / usr / bin / bash comme référence

Avec GNU find (ou toute autre version de findcelui-ci a l' -samefileoption), et en supposant qu'il /usr/bin/bashse trouve sur le /système de fichiers, c'est correct:

find / -xdev -samefile /bin/bash

À utiliser -xdevcar les liens physiques ne peuvent pas franchir les limites du système de fichiers. Ne redirigez pas les erreurs: si vous n'avez pas l'autorisation de parcourir un répertoire, un lien en dur pourrait être présent sous ce répertoire et vous le manqueriez.

L'erreur que vous faites est que vous recherchez un autre lien physique qui n'existe pas. Vous avez en fait l'information pour savoir qu'elle n'existe pas:

1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*
                   ^

Le nombre de liens durs /bin/bashest de 1.

Il y a un seul fichier dans /lequel est le même que /usr/bin/bash. Le fichier /bin/bashest le même que /usr/bin/bashpour une raison différente: les répertoires /bin et /usr/binsont le même fichier. Depuis find / -samefile /bin/bashpointe vers /usr/bin/bash, /bina un lien symbolique vers /usr/bin. Plus précisément, à partir des informations contenues dans la question, et en supposant qu'il /binne s'agit pas d'un lien direct d'annuaire (une fonctionnalité mal supportée, rarement utilisée), nous savons que /binc'est un lien symbolique qui résout /usr/bin; il peut s'agir d'un lien symbolique vers un autre lien symbolique et ainsi de suite résolvant éventuellement vers /usr/binou vers un chemin équivalent tel que ///////usr/bin/, mais il est très probable qu'il s'agit d'un lien symbolique dont la cible est /usr/bin.

La recherche de tous les liens symboliques vers un fichier sur l'ensemble du système n'est pas particulièrement productive. Par exemple, sous Linux, il existe un fichier /proc/*/exequi est un lien symbolique vers /usr/bin/bash(ou /bin/bash) pour chaque processus qui exécute bash. Et si vous recherchez des liens symboliques vers un répertoire, vous vous retrouverez dans une récursion infinie, par exemple en /proc/*/rootpointant vers /(sauf pour les processus chrootés).

Si vous avez besoin de savoir si deux chemins pointent vers le même fichier, sous Linux, vous pouvez utiliser l'un des

[ /bin/bash -ef /usr/bin/bash ]
test /bin/bash -ef /usr/bin/bash

(ce -efn'est pas POSIX mais c'est dans dash, bash, BusyBox et GNU coreutils). Si vous avez besoin d'obtenir un chemin canonique vers un fichier, dans le sens où des fichiers distincts ont toujours des noms canoniques distincts, vous pouvez utiliser

readlink -f /bin/bash

(Cela peut manquer des fichiers égaux via des répertoires montés, par exemple si le même emplacement réseau est monté de deux manières différentes.)