我正在尝试创建硬链接,但收到错误消息“不允许操作”
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
但是,通过将 a 添加-s
到命令中,我可以创建软链接。我也可以复制文件。所以我的用户有权在目录中创建文件。
为什么在尝试创建硬链接时会出现权限错误,我可以做些什么来防止它?
编辑 - 基于一些答案的附加信息:
文件系统是 ext4 并且还有一个绑定挂载dir1
on /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
提供的答案让我走上了正确的轨道 - 谢谢。问题是文件的所有权。该文件属于不再存在的用户 ID。
这就是为什么在将文件复制到
copy.jpg
硬链接后可以创建的原因。更改 的所有权后,也可以创建img1.jpg
硬链接。img1.jpg
正如评论中所指出的,可以配置此行为,请参阅Unix&Linux SE 上的此答案。要检查配置了哪些行为,请检查
/proc/sys/fs/protected_hardlinks
.如果它显示 1,则意味着 - 除其他条件外 - 创建链接的进程的文件系统 UID 必须与目标文件的所有者 (UID) 匹配
请注意,这表示
Operation not permitted
而不是Permission denied
.除了权限之外,无法建立硬链接还有几个原因:
Invalid cross-device link
Operation not permitted
hard link not allowed for directory
因此,由于某种原因,您尝试硬链接的文件系统可能不支持该文件的硬链接。
注意:此答案是在使用 OP 之前编写的,
lsattr
并表明答案的前提不适用于他们的具体情况。我仍然认为不变性通常是一个理智的假设。答案代表它可能对未来有用的用户。可能是文件是不可变的。运行
lsattr /data/dir1/img1.jpg
确认。存在i
意味着“不可变”。来自
man 1 chattr
:您使用清除
i
属性但上述功能是必需的,因此您很可能需要
sudo
. 在删除该属性之前,最好考虑一下该属性为何存在。如果您需要将其重新设置:chattr +i …
. 请注意,这会更改实际文件的元数据(想想:inode),而不是其目录条目(名称、路径);因此,如果您设法在原始路径之后创建硬链接,chattr -i
那么chattr +i
您的硬链接将变得不可变,因为它是同一个文件。