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


129

J'utilise Ubuntu 12.04. Lorsque j'essaie de créer un lien physique pour n'importe quel répertoire, cela échoue. Je peux créer des liens en dur pour les fichiers dans les limites du système de fichiers. Je connais la raison pour laquelle nous ne pouvons pas créer de liens physiques pour les 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 la raison derrière cela. Est-ce la même chose pour toutes les distributions GNU / Linux et versions Unix (BSD, Solaris, HP-UX, IBM AIX) ou uniquement sous Ubuntu ou Linux?



2
Essayez ln -F <src> <dst>et ça pourrait marcher. Certes, cela fonctionnait pour le superutilisateur dans les anciennes versions d’Unix. Quelqu'un se souvient-il s'il s'agissait d'UCB ou de System V? Oui, de mauvaises choses peuvent arriver, mais généralement pas. Si je me souviens bien, rmdirsavait ne pas continuer à effacer passé un lien dur. Cependant, les utilisateurs pourraient se perdre et effacer des choses par erreur.
Steve Pitchers

@StevePitchers Comment peut-on rmdirgérer des liens durs d'une manière spéciale? Un lien dur est juste un lien normal - mais un lien supplémentaire. Il n'est même pas facile de savoir s'il existe des liens supplémentaires inhabituels sans enregistrements supplémentaires.
Volker Siegel

1
Chaque nœud stocke le nombre de liens durs qui le dirigent: le contenu n'est publié qu'une fois qu'il n'y a plus de liens. Donc, rmdirpeut dire si le répertoire a des liens provenant d'autres endroits. La suppression récursive rm -r, doit être codée avec soin pour être sûre qu'elle agira correctement même en cas d'erreur telle que "permission refusée". BTW, UCB = BSD, doh!
Steve Pitchers

2
J'ai fait ln -Fsur des répertoires et ça marche. Mais vous n'osez pas supprimer le répertoire par la suite, de peur de corrompre le système de fichiers.
Edward Falk

Réponses:


159

Le répertoire des liens physiques casse le système de fichiers de plusieurs façons

Ils vous permettent de créer des boucles

Un lien physique vers un répertoire peut être lié à un parent de celui-ci, ce qui crée une boucle de système de fichiers. Par exemple, ces commandes pourraient créer une boucle avec le lien précédent 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épertoires est un peu difficile (bien que, par exemple, POSIX exige findd'éviter cela).

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

Ils brisent la clarté des répertoires parents

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

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

Dans le premier cas, /tmp/aest le répertoire parent de /tmp/a/b.
Dans le second cas, /tmp/a/b/lest le répertoire parent de /tmp/a/b/l/b, qui est 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. Alors

/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 dans le fichier. Ils sont les mêmes en terme de nombre d'inodes. Mais si vous ne vous attendez pas explicitement à des 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 d'aucune profondeur. Dans ce cas, un fichier enfant du lien serait répliqué dans 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 symboliques vers les répertoires peuvent-ils alors fonctionner?

Un chemin qui peut contenir des liens symboliques et même des boucles de répertoires liés logiciels 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, lorsque les 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 ainsi un chemin canonique :

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

La commande readlinkpeut résoudre un chemin d'accès à son chemin canonique:

$ readlink -f /some/symlinked/path

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

Un lien symbolique 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 matériels 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 la conserve, mais ajoute davantage de structure, comme une couche d'application.


De 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
        [  ...  ]

1
Pourquoi un lien virtuel ne peut-il pas faire tout cela?
Tanay

1
@Tanay Oui, cela pourrait aider l’expanation à le comparer à des cas similaires avec des liens souples. J'essaierai.
Volker Siegel

Comment cela concerne-t-il uniquement les répertoires? Si je comprends bien, ces problèmes concernent également les fichiers à liaison fixe. De plus, je considère le hardlinking comme un moyen facile de modifier l’autorisation d’un répertoire donné pour autoriser les autres utilisateurs à entrer, sans avoir à les autoriser également dans la chaîne parente. Cela semble très utile si vous n'avez pas la possibilité d'ajouter / de modifier des groupes ...
inetknght

excellente réponse, mais ensuite ... comment Apple at-il résolu ces problèmes pour Time Machine?
Damien

Cela semble très intéressant! Mais je ne connais rien au problème - pouvez-vous me donner un indice?
Volker Siegel

77

"De manière générale, vous ne devriez pas utiliser de liens durs" est trop large. Vous devez comprendre la différence entre les liens concrets et les liens symboliques et les utiliser de manière appropriée. Chacune présente ses propres avantages et inconvénients:

Les liens symboliques peuvent:

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

Les liens durs peuvent:

  • Empêche le fichier référencé d'être supprimé

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épertoires, tout en n'utilisant que de l'espace pour les fichiers échangés entre deux versions.

La commande cp -alest particulièrement utile à cet égard. Il crée une copie complète d'une structure de répertoires dans laquelle 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 occuperont de l'espace supplémentaire. Ceci est particulièrement utile lors de la maintenance de sauvegardes multigénérationnelles.


41
en ce qui concerne le dernier paragraphe, si vous éditez un fichier "copié" en lien direct
marcin

32
Cette description de liens physiques est plutôt trompeuse. Il est fondamentalement vrai que les liens physiques «empêchent la suppression du fichier auquel ils font référence», mais ce n'est qu'un effet secondaire des liens physiques. Ce n’est certainement PAS vrai que vous puissiez créer des liens physiques dans un répertoire, modifier le fichier "original", puis vous attendre à ce que les liens physiques pointent vers l’ancien contenu. En fait, la vérité directrice des liens physiques réside dans le fait qu'il ne s'agit pas d'un lien, du moins pas plus que le "fichier" d'origine, qui est simplement un nom pointant vers un fichier. Un lien physique est simplement un autre nom pointant sur le même fichier.
Matty

7
L'idée de sauvegarde est bonne et je l'utilise souvent beaucoup, mais je pense que les utilisateurs devraient être avertis que la modification d'un fichier modifiera également la sauvegarde.
Mark

3
Heck, un lien symbolique n'a pas besoin de pointer du tout. ln -s "Don't use this directory" READMEest légitime. En fait, si vous y réfléchissez, un répertoire peut être utilisé comme base de données relationnelle et ne pas contenir de fichiers réels.
Edward Falk

5
-1 Cela ne répond pas à la question, et certaines informations sont fausses.
Wjandrea

43

Pour votre information, vous pouvez obtenir la même chose que des liens physiques pour des 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 seront pas conscients de la liaison . Une fois, j'ai fait quelque chose comme dans l'exemple ci-dessus, puis j'ai procédé à rm -rf /home/user. Heureusement, il n'y avait rien de pertinent dans /var/www.


6
J'ai utilisé mount --bind <src> <dest>. Utilisez avec précaution pour ne pas essuyer le src;)
kachar

1
Je reçois:mount: unknown filesystem type 'bind'
Wizek

4
sur Busybox, c'est çamount -o bind src dest
Mat M

@ MatM même avec Debian
hanshenrik

2
Si vous devez uniquement monter en lecture, vous pouvez définir des autorisations sur le point de montage et éviter le rm -rfproblème. superuser.com/questions/320415/…
zanerock

19

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


17
Les liens physiques ont de bons cas d'utilisation. Dire que vous ne devriez généralement pas les utiliser est un peu trop large.
Sander Steffann

4
+2 pour fournir le lien qui répond réellement à la question du PO (et la mienne), -1 pour émettre une opinion ("Vous ne devriez généralement pas utiliser de liens durs de toute façon" - s'il y avait des liens pour le soutenir, tout irait bien). Ce qui était bien, car je ne peux pas donner +2 de toute façon. ; D
msb

3
le lien "ils cassent la structure du système de fichiers" ne fonctionne pas.
Charlie Parker

5
Essayez de résumer le contenu du lien dans la réponse et conservez-le comme référence. C’est une bonne pratique en matière d’échange de piles pour éviter la pourriture des liens, merci.
Oxwivi

3
bien fait @CharlieParker; meilleur commentaire ironique non intentionnel de tous les temps :) (?)
Eliran Malka
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.