原始问题
我在一个文件系统上有一个文件: /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
我可以从绑定安装目录访问索引节点,因此绑定安装必须与处于同一分区/data
,或者该硬链接跨设备工作,这应该是非法的,但仍然可以正常工作。我想念什么?