183 votes

Pourquoi les liens directs ne sont-ils pas autorisés pour les annuaires ?

J'utilise Ubuntu 12.04. Lorsque j'essaie de créer un lien dur pour un répertoire, cela échoue. Je peux créer des liens durs pour des fichiers à l'intérieur des limites du système de fichiers. Je connais la raison pour laquelle nous ne pouvons pas créer de liens durs pour les fichiers au-delà du système de fichiers.

J'ai essayé ces commandes :

$ ln /Some/Directory /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Directory /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Je veux juste savoir la raison de ce phénomène. Est-ce la même chose pour toutes les distros GNU/Linux et les saveurs Unix (BSD, Solaris, HP-UX, IBM AIX) ou seulement dans Ubuntu ou Linux ?

216voto

Volker Siegel Points 12033

Les liens durs de répertoire cassent le système de fichiers de plusieurs façons

Ils vous permettent de créer des boucles

Un lien dur vers un répertoire peut être lié à un parent de lui-même, ce qui crée une boucle du système de fichiers. Par exemple, ces commandes peuvent créer une boucle avec le lien retour l :

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Un système de fichiers avec une boucle de répertoire a une profondeur infinie :

cd /tmp/a/b/l/b/l/b/l/b/l/b

Éviter une boucle infinie lors de la traversée d'une telle structure de répertoire est quelque peu difficile (bien que POSIX exige par exemple que find pour éviter cela).

Un système de fichiers avec ce type de lien dur n'est plus un arbre, car un arbre ne doit pas, par définition, contenir de boucle.

Ils brisent l'univocité des répertoires parents.

Avec une boucle de système de fichiers, plusieurs répertoires parents existent :

cd /tmp/a/b
cd /tmp/a/b/l/b

Dans le premier cas, /tmp/a est le répertoire parent de /tmp/a/b .
Dans le second cas, /tmp/a/b/l est le répertoire parent de /tmp/a/b/l/b qui est identique à /tmp/a/b .
Il a donc deux répertoires parents.

Ils multiplient les dossiers

Les fichiers sont identifiés par des chemins, après résolution des liens symboliques. Ainsi,

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

sont des fichiers différents.
Il existe une infinité de chemins supplémentaires pour le fichier. Ils sont identiques en termes de numéro d'inode, bien sûr. Mais si vous ne vous attendez pas explicitement à des boucles, il n'y a aucune raison de vérifier cela.

Un lien dur de répertoire peut également pointer vers un répertoire enfant, ou un répertoire qui n'est ni enfant ni parent d'aucune profondeur. Dans ce cas, un fichier qui est un enfant du lien serait répliqué en deux fichiers, identifiés par deux chemins.

Votre exemple

$ ln /Some/Directory /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Directory/foobar.txt /home/nischay/Hard-Directory/foobar.txt
Files /Some/Directory/foobar.txt and /home/nischay/Hard-Directory/foobar.txt are identical
$ echo bar >> /Some/Directory/foobar.txt
$ diff -s /Some/Directory/foobar.txt /home/nischay/Hard-Directory/foobar.txt
Files /Some/Directory/foobar.txt and /home/nischay/Hard-Directory/foobar.txt are identical
$ cat /Some/Directory/foobar.txt
foo
bar

Comment les liens mous vers les annuaires peuvent-ils alors fonctionner ?

Un chemin d'accès qui peut contenir des liens souples et même des boucles de répertoire souples est souvent utilisé uniquement pour identifier et ouvrir un fichier. Il peut être utilisé comme un chemin normal et linéaire.

Mais il existe d'autres situations où les chemins sont utilisés pour comparer des fichiers. Dans ce cas, les liens symboliques dans le chemin peuvent être résolus d'abord, en le convertissant en un fichier minimal et d'une représentation acceptée par tous, créant une chemin canonique :

Cela est possible, car les liens souples peuvent tous être étendus à des chemins sans lien. Après avoir fait cela avec tous les liens mous d'un chemin, le chemin restant fait partie d'un arbre, où un chemin est toujours sans ambiguïté.

La commande readlink peut résoudre un chemin vers son chemin canonique :

$ readlink -f /some/symlinked/path

Les liens logiciels sont différents de ceux utilisés par le système de fichiers.

Un lien logiciel ne peut pas causer tous les problèmes car il est différent des liens à l'intérieur du système de fichiers. Il peut être distingué des liens durs, et résolu en un chemin sans symlinks si nécessaire.
Dans un certain sens, l'ajout de liens symboliques ne modifie pas la structure de base du système de fichiers - il la conserve, mais ajoute une structure supplémentaire comme une couche d'application.


Von man readlink :

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]

86voto

regomodo Points 125

"Vous ne devriez généralement pas utiliser de liens physiques de toute façon" est trop large. Vous devez comprendre la différence entre les liens physiques et les liens symboliques, et utiliser chacun d'eux comme il convient. Chacun a ses propres avantages et inconvénients :

Symlinks le peut :

  • Pointer vers des répertoires
  • Pointer vers des objets inexistants
  • Pointer vers des fichiers et des répertoires en dehors du même système de fichiers

Les liens durs le peuvent :

  • Empêcher la suppression du fichier qu'ils référencent

Les liens durs sont particulièrement utiles pour réaliser des applications de "copie sur écriture". Ils permettent de conserver une copie de sauvegarde d'une structure de répertoire, tout en n'utilisant de l'espace que pour les fichiers qui changent entre deux versions. Notez que l'implémentation doit d'abord rompre le lien (ou les modifications s'appliqueront aussi au fichier original !).

La commande cp -al est particulièrement utile à cet égard. Il fait une copie complète d'une structure de répertoire, où tous les fichiers sont représentés par des liens directs vers les fichiers originaux. Vous pouvez ensuite procéder à la mise à jour des fichiers de la structure (après avoir créé des copies réelles de ces fichiers uniquement), et seuls les fichiers que vous mettez à jour occuperont de l'espace supplémentaire. Ceci est particulièrement utile pour la gestion des sauvegardes multigénérationnelles.

58voto

stackount Points 786

Pour info, vous pouvez obtenir la même chose que les liens directs pour les répertoires en utilisant mount :

mount -t bind /var/www /home/user/workspace/www

C'est très dangereux car la plupart des outils et des programmes ne seront pas conscients de la liaison . Une fois, j'ai fait quelque chose comme dans l'exemple ci-dessus et j'ai ensuite procédé à rm -rf /home/user . Heureusement, il n'y avait rien de pertinent dans /var/www .

22voto

user3439968 Points 161

La raison pour laquelle il n'est pas permis d'établir des liens directs avec des annuaires est un peu plus technique. Essentiellement, ils brisent la structure du système de fichiers . De toute façon, vous ne devriez généralement pas utiliser de liens physiques. Les liens symboliques permettent la plupart des mêmes fonctionnalités sans causer de problèmes (par ex. ln -s target link ).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X