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?
filesystem
directory
hard-link
Nischay
la source
la source
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,rmdir
savait ne pas continuer à effacer passé un lien dur. Cependant, les utilisateurs pourraient se perdre et effacer des choses par erreur.rmdir
gé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.rmdir
peut dire si le répertoire a des liens provenant d'autres endroits. La suppression récursiverm -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!ln -F
sur 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.Réponses:
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
:Un système de fichiers avec une boucle de répertoire a une profondeur infinie:
É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
find
d'é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:
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
.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
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
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
readlink
peut résoudre un chemin d'accès à son chemin canonique: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
:la source
"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:
Les liens durs peuvent:
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 -al
est 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.la source
ln -s "Don't use this directory" README
est 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.Pour votre information, vous pouvez obtenir la même chose que des liens physiques pour des répertoires en utilisant mount:
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
.la source
mount --bind <src> <dest>
. Utilisez avec précaution pour ne pas essuyer lesrc
;)mount: unknown filesystem type 'bind'
mount -o bind src dest
rm -rf
problème. superuser.com/questions/320415/…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
).la source