在Linux上创建硬链接期间的EACCES与链接(2)手册页中的任何原因都不匹配

在Linux上创建硬链接期间的EACCES与链接(2)手册页中的任何原因都不匹配,linux,unix,hardlink,Linux,Unix,Hardlink,我有一个服务,它将一组文件的硬链接组装到一个临时暂存目录中,该文件具有读写权限(以及对所有父目录树的遍历权限) 在我的AWS托管节点重新启动之前,这一切都非常有效。看起来它们现在在一个更新的内核上,link(2)调用现在返回EACCES 正在检查此系统调用的(Linux)手册页: EACCES-拒绝对包含newpath的目录的写入访问,或拒绝对oldpath或new-path的路径前缀中的一个目录的搜索权限。(另见路径_决议(7)) 为了进行比较,BSD版本似乎描述了类似的语义,可能更详细一些:

我有一个服务,它将一组文件的硬链接组装到一个临时暂存目录中,该文件具有读写权限(以及对所有父目录树的遍历权限)

在我的AWS托管节点重新启动之前,这一切都非常有效。看起来它们现在在一个更新的内核上,link(2)调用现在返回EACCES

正在检查此系统调用的(Linux)手册页:

EACCES-拒绝对包含newpath的目录的写入访问,或拒绝对oldpath或new-path的路径前缀中的一个目录的搜索权限。(另见路径_决议(7))

为了进行比较,BSD版本似乎描述了类似的语义,可能更详细一些:

[EACCES]任一路径前缀的组件都拒绝搜索权限

[EACCES]请求的链接需要以拒绝写入权限的模式写入目录

[EACCES]当前进程无法访问现有文件

这些情况都不适用:作为运行服务的用户,我可以读取源文件(包括遍历其目录),并写入临时暂存目录(实际上是我创建的);此外,该暂存目录位于同一文件系统上(尽管这会导致不同的错误)


提供了什么?

重新启动时,默认情况下,新内核将引导到set
fs.protected\u hardlinks=1
。当设置此sysctl时,Linux需要对文件进行写访问,然后才允许其他用户创建指向该文件的硬链接

这在技术上符合,其中部分规定:

实现可能要求调用进程具有访问现有文件的权限


然而。因此,在当前实例中,它要么由供应商重新启用,要么基于从引入到后来禁用的时间段内的上游内核