Problema originale
Ho un file su un filesystem: /data/src/file
e voglio collegarlo a: /home/user/proj/src/file
ma si /home
trova su un disco e /data
su un altro, quindi viene visualizzato un errore:
$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
Ok, quindi ho imparato che non riesco a collegarmi duramente tra i dispositivi. Ha senso.
Problema a portata di mano
Quindi ho pensato che avrei avuto voglia di legare e montare una src
cartella che si trova sul /data
file system:
$ 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
Perché questo non funziona ancora?
Soluzione
So di avere questa configurazione giusta perché posso creare il collegamento reale purché sia nella /data
directory "reale" anziché in quella associata.
$ 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
$
Alcune informazioni di sistema
$ 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
Nota : ho modificato manualmente i nomi di file e directory per rendere più chiara la situazione, quindi potrebbero esserci un errore di battitura o due nelle letture dei comandi.
/data
posso accedere all'inode dalla directory di bind mount, quindi o il bind mount deve trovarsi sulla stessa partizione /data
oppure il collegamento reale funziona su tutti i dispositivi, il che dovrebbe essere illegale, ma funziona comunque. Cosa mi sto perdendo?