Problème d'origine
J'ai un fichier sur un système de fichiers: /data/src/file
et je veux le lier à: /home/user/proj/src/file
mais /home
est sur un disque et /data
sur un autre donc j'obtiens une erreur:
$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
D'accord, j'ai donc appris que je ne peux pas établir de lien dur entre les appareils. Logique.
Problème à portée de main
J'ai donc pensé que j'aurais envie de créer un src
dossier sur /data
le système de fichiers de:
$ mkdir -p /data/other/src
$ cd /home/user/proj
$ sudo mount --bind /data/other/src src/
$ cd src
$ # (now we're technically on `/data`'s file system, right?)
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
Pourquoi cela ne fonctionne toujours pas?
solution de contournement
Je sais que cette configuration est correcte car je peux créer le lien dur tant que je suis dans le "vrai" /data
répertoire au lieu du lien lié.
$ cd /data/other/src
$ ln /data/src/file .
$ # OK
$ cd /home/user/proj/src
$ ls -lh
total 35M
-rw------- 2 user user 35M Jul 17 22:22 file
$
Quelques informations système
$ uname -a
Linux <host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ findmnt
.
.
.
├─/home /dev/sdb8 ext4 rw,relatime,data=ordered
│ └─/home/usr/proj/src /dev/sda2[/other/src]
│ ext4 rw,relatime,data=ordered
└─/data /dev/sda2 ext4 rw,relatime,data=ordered
$ mountpoint -d /data
8:2
$ mountpoint -d /home/usr/proj/src/
8:2
Remarque : J'ai modifié manuellement les noms de fichier et de répertoire pour rendre la situation plus claire, il peut donc y avoir une faute de frappe ou deux dans les affichages de commande.
mount
ln
bind-mount
jdk1.0
la source
la source
/data
je peux accéder à l'inode à partir du répertoire de montage de liaison, donc soit le montage de liaison doit être sur la même partition que/data
, soit le lien dur fonctionne sur plusieurs appareils, ce qui devrait être illégal, mais fonctionne quand même. Qu'est-ce que je rate?Réponses:
Il y a un manque décevant de commentaires dans le code . C'est comme si personne ne l'avait jamais jugé utile, car les montures de liaison temporelle ont été implémentées dans la version 2.4. Assurément, tout ce que vous auriez à faire serait de remplacer
.mnt->mnt_sb
où il est dit.mnt
...- Al Viro
Il y a un exemple concret plus loin dans le fil
la source
La raison pour laquelle vous ne pouvez pas effectuer de liaison entre appareils est que vous introduisez des ambiguïtés. L'entrée de répertoire du fichier contient (dans les systèmes simples) le numéro i-node du fichier concerné. Un lien dur (juste une autre entrée de répertoire) doit également contenir le même numéro i-node. C'est bien, mais les numéros i-node ne sont uniques que dans un seul système de fichiers (ils sont généralement un ensemble dense commençant à 1).
Votre monture de liaison ne résout pas ce problème. Oui, il construit une sorte de «fiction» de la structure, mais ce qu'il ne fait pas, c'est renuméroter tous les i-nœuds sur un système de fichiers pour s'assurer qu'ils sont tous uniques sur les deux systèmes de fichiers concernés! Ce serait idiot.
Cette restriction a toujours existé sur les systèmes UNIX. Le lien symbolique a été inventé en partie pour résoudre ce problème. Je sais qu'ils ne sont pas fonctionnellement tout à fait les mêmes, mais ils sont généralement OK.
Essayez un lien symbolique? (
ln -s
)la source
ls -l
. Un raisonnement un peu idiot au début, mais ensuite cela a conduit à un trou de lapin et je suis devenu curieux de savoir ce qui se passait avec les liens durs ...