Оригінальна проблема
У мене є файл в одній файловій системі: /data/src/file
і я хочу важко пов’язати це: /home/user/proj/src/file
але /home
на одному диску, а /data
на іншому, тому я отримую помилку:
$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
Гаразд, тому я дізнався, що не можу важко зв’язатись між пристроями. Має сенс.
Проблема під рукою
Тож я подумав, що захоплюсь і прив’яжу монтувати src
папку, що знаходиться у /data
файловій системі:
$ 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
Чому це все ще не працює?
Обхід
Я знаю, що у мене є така настройка правильно, тому що я можу зробити жорстке посилання, якщо я перебуваю у «справжньому» /data
каталозі замість прив’язаного.
$ 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
$
Деякі відомості про систему
$ 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
Примітка . Я вручну змінив імена файлів та каталогів, щоб зробити ситуацію більш зрозумілою, тому в зчитуваннях команд може бути помилка друку.
/data
я можу отримати доступ до inode з каталогу каталогів, тому або прив'язка повинна бути на тому ж розділі /data
, або жорстке посилання працює на пристроях, що має бути незаконним, але все одно працює. Що я пропускаю?