创建硬链接时不允许进行操作(但软链接可以)

Tho*_*mas 10 linux hardlink links

我正在尝试创建硬链接,但收到错误消息“不允许操作”

tikey@helios64:/data/$ ln /data/dir1/img1.jpg /data/dir2/
ln: failed to create hard link '/data/dir2/img1.jpg' => '/data/dir1/img1.jpg': Operation not permitted
Run Code Online (Sandbox Code Playgroud)

-s但是,通过在命令中添加 a ,我可以创建软链接。我也可以复制该文件。所以我的用户有权在目录中创建文件。

为什么在尝试创建硬链接时会出现权限错误?我可以采取哪些措施来防止出现这种情况?

编辑 - 基于一些答案的附加信息:

文件系统是 ext4,并且还有dir1on的绑定挂载/srv(但卸载/srv/dir1没有任何区别):

/dev/md127 on /data type ext4 (rw,relatime,stripe=256)
/data/dir1 on /srv/dir1 type fuse (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)
Run Code Online (Sandbox Code Playgroud)

该设备设置为 raid 5:

md127 : active raid5 sdc[1] sdb[2] sdd[0]
      7813772288 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      bitmap: 0/30 pages [0KB], 65536KB chunk
Run Code Online (Sandbox Code Playgroud)

lsattr该文件显示:

tikey@helios64:/data$ lsattr dir1/img1.jpg
--------------e------- dir1/img1.jpg
Run Code Online (Sandbox Code Playgroud)

use*_*489 8

请注意,这里说的Operation not permitted是而不是Permission denied

除了权限之外,无法建立硬链接还有以下几个原因:

  • 硬链接必须针对同一文件系统上的文件。(但这通常说Invalid cross-device link
  • 只有某些文件系统(例如unix文件系统)支持硬链接。如果我尝试硬链接 msdos/vfat 文件系统上的文件,我会得到Operation not permitted
  • 目录不能硬链接,但这给出了hard link not allowed for directory

因此,由于某种原因,您尝试硬链接的文件系统可能不支持该文件的硬链接。


Tho*_*mas 7

提供的答案让我走上了正轨 - 谢谢。问题在于文件的所有权。该文件属于一个不再存在的用户 ID。

tikey@helios64:/data/dir2$ ls -la ../dir1/
total 146500
drwxrwxr-x+ 2 tikey users    4096 Jan 30 11:41 .
drwxrwxr-x+ 4 tikey users    4096 Jan 30 11:10 ..
-rw-r--r--+ 2 tikey tikey 6414300 Jan 30 11:41 copy.jpg
-rw-r--r--+ 1  1011  1011 6414300 Nov 20 02:39 img1.jpg
Run Code Online (Sandbox Code Playgroud)

这就是为什么在将文件复制到copy.jpg硬链接后可以创建的原因。更改 的所有权后,还可以创建 的img1.jpg硬链接。img1.jpg

正如评论中指出的,可以配置此行为,请参阅Unix&Linux SE 上的此答案。要检查配置了哪种行为,请检查/proc/sys/fs/protected_hardlinks

tikey@helios64:/data$ sudo cat /proc/sys/fs/protected_hardlinks
1
Run Code Online (Sandbox Code Playgroud)

如果显示 1,则意味着 - 除其他条件外 - 创建链接的进程的文件系统 UID 必须与目标文件的所有者 (UID) 匹配

  • 可能 `sudo cat /proc/sys/fs/protected_hardlinks` 会产生 `1`。深入了解[Unix&Linux SE 上的这个答案](https://unix.stackexchange.com/a/377719/108618)。 (2认同)