Pourquoi les liens durs ne sont-ils pas autorisés pour les répertoires?

93

J'utilise Ubuntu 12.04. Lorsque j'essaie de créer un lien dur pour un répertoire, il échoue. Je peux créer des liens durs pour les 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 des fichiers au-delà du système de fichiers.

J'ai essayé ces commandes:

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

Je veux juste savoir pourquoi. Est-ce la même chose pour toutes les distributions GNU / Linux et les versions Unix (BSD, Solaris, HP-UX, IBM AIX) ou seulement sous Ubuntu ou Linux?

    
posée Nischay 01.11.2012 - 22:18
la source

4 réponses

122

Les liens durs de répertoire décomposent le système de fichiers de plusieurs manières

Ils vous permettent de créer des boucles

Un lien physique vers un répertoire peut être associé à un parent de lui-même, ce qui crée une boucle de système de fichiers. Par exemple, ces commandes pourraient créer une boucle avec le lien arrière 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

Toute commande find sans le prédicat -maxdepth sera exécutée dans une boucle infinie. Cela signifie que vous ne pouvez plus utiliser find , qui est une commande importante, de manière cohérente. Similaire pour la commande locate tout aussi importante.

Une arborescence, par définition, n’a pas de boucles, donc le système de fichiers n’est plus une arborescence.

Ils brisent la non-ambiguïté des répertoires parents

Avec une boucle de système de fichiers, plusieurs répertoires parent 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 , identique à /tmp/a/b .
Donc, il a deux répertoires parents.

Ils multiplient les fichiers

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

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

sont des fichiers différents.
Il existe une infinité d'autres chemins du fichier. Ils sont les mêmes en termes de nombre d'inodes bien sûr. Mais si vous n'attendez pas explicitement de boucles, il n'y a aucune raison de vérifier cela.

Un répertoire hardlink peut également pointer vers un répertoire enfant, ou un répertoire qui n’est ni enfant ni parent de quelque profondeur que ce soit. Dans ce cas, un fichier enfant du lien serait répliqué sur deux fichiers, identifiés par deux chemins.

Votre exemple

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Comment les liens logiciels vers les répertoires peuvent-ils fonctionner alors?

Un chemin qui peut contenir des liens hypertextes et même des boucles de répertoires liés est souvent utilisé pour identifier et ouvrir un fichier. Il peut être utilisé comme chemin linéaire normal.

Mais il existe d’autres situations, lorsque des chemins sont utilisés pour comparer des fichiers. Dans ce cas, les liens symboliques dans le chemin peuvent être résolus en premier, en le convertissant en une représentation minimale et généralement acceptée, créant un chemin canonique :

Ceci est possible, car les liens logiciels peuvent tous être étendus à des chemins sans lien. Après avoir fait cela avec tous les liens logiciels dans 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 ce que le système de fichiers utilise

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 liens symboliques 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 le conserve, mais ajoute plus de structure comme une couche d'application.

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
        [  ...  ]
    
réponse donnée Volker Siegel 17.09.2014 - 13:06
la source
72

"En règle générale, vous ne devriez pas utiliser de liens physiques" est trop large. Vous devez comprendre la différence entre les liens physiques et les liens symboliques, et les utiliser comme il convient. Chacun d’entre eux présente ses propres avantages et inconvénients:

Les liens symboliques peuvent:

  • Pointez sur les répertoires
  • Pointez sur des objets inexistants
  • Pointez sur des fichiers et des répertoires situés en dehors du même système de fichiers

Les liens physiques peuvent:

  • Empêche la suppression du fichier auquel ils font référence

Les liens physiques sont particulièrement utiles pour effectuer des applications de "copie sur écriture". Ils vous permettent de conserver une copie de sauvegarde d'une structure de répertoire, tout en n'utilisant que de l'espace pour les fichiers qui changent entre deux versions.

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 physiques vers les fichiers d'origine. Vous pouvez ensuite procéder à la mise à jour des fichiers dans la structure, et seuls les fichiers que vous mettez à jour occupent plus d'espace. Ceci est particulièrement utile lors de la maintenance de sauvegardes multigénérationnelles.

    
réponse donnée user133232 18.02.2013 - 16:06
la source
36

FYI, vous pouvez réaliser la même chose que les liens durs pour les répertoires en utilisant mount:

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

Ceci est très dangereux car la plupart des outils et programmes ne connaissent pas 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 .

    
réponse donnée stackount 07.11.2013 - 18:39
la source
18

La raison pour laquelle les répertoires de liaison matérielle ne sont pas autorisés est un peu technique. Essentiellement, ils brisent la structure du système de fichiers . Vous ne devriez généralement pas utiliser de liens physiques de toute façon. Les liens symboliques permettent la plupart des mêmes fonctionnalités sans causer de problèmes (par exemple, ln -s target link ).

    
réponse donnée astex 01.11.2012 - 22:25
la source

Lire d'autres questions sur les étiquettes