我正在尝试创建硬链接,但收到错误消息“操作不允许”
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
但是,通过在命令中添加-s
,我可以创建软链接。我还可以复制文件。所以我的用户有权在目录中创建文件。
为什么我在尝试创建硬链接时会出现权限错误以及如何防止这种情况发生?
编辑-基于一些答案的附加信息:
文件系统是 ext4,并且还有一个绑定挂载dir1
(/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)
该设备设置为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
lsattr
文件显示:
tikey@helios64:/data$ lsattr dir1/img1.jpg
--------------e------- dir1/img1.jpg
答案1
请注意,这是说Operation not permitted
而不是Permission denied
。
除了权限之外,还有几个原因导致无法建立硬链接:
- 硬链接必须针对同一文件系统上的文件。(但这通常表示
Invalid cross-device link
- 只有某些文件系统(例如 unix 文件系统)支持硬链接。如果我尝试在 msdos/vfat 文件系统上硬链接文件,我会得到
Operation not permitted
- 目录不能硬链接,但是这给了
hard link not allowed for directory
因此,您尝试硬链接的文件系统可能由于某种原因不支持此文件的硬链接。
答案2
提供的答案让我走上了正确的道路 - 谢谢。问题在于文件的所有权。该文件属于一个不再存在的用户 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
这就是为什么将文件复制到 后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
如果显示 1,则意味着 - 除其他条件外 - 创建链接的进程的文件系统 UID 必须与目标文件的所有者 (UID) 匹配
答案3
注意:这个答案是在 OP 使用之前写的lsattr
,表明答案的前提不适用于他们的具体情况。我仍然认为不变性总体上是一个合理的假设。答案代表了未来可能有用的用户。
可能是文件不可变。运行lsattr /data/dir1/img1.jpg
确认。存在i
表示“不可变”。
具有该属性的文件
i
无法修改:无法删除或重命名,无法创建指向此文件的链接,无法修改文件的大部分元数据,也无法以写入模式打开文件。只有超级用户或拥有该权限的进程才能CAP_LINUX_IMMUTABLE
设置或清除此属性。
您i
使用以下命令清除属性
chattr -i /data/dir1/img1.jpg
但上述功能是必需的,因此您很可能需要sudo
。在删除属性之前,最好先想想为什么存在该属性。如果您需要将其设置回来:chattr +i …
。请注意,这会更改实际文件的元数据(例如:inode),而不是其目录条目(名称、路径);因此,如果您设法在原始路径chattr -i
之后创建硬链接chattr +i
,那么您的硬链接将变为不可变的,因为它是同一个文件。