CentOS 6和CentOS 7之间的硬链接权限行为不同


8

尝试创建硬链接时,CentOS 7中出现权限错误。使用CentOS 6中设置的相同权限,我不会收到该错误。问题集中在组权限上。我不确定哪个操作系统版本正确和错误。

让我说明发生了什么。在当前的工作目录中,我有两个目录:源目录和目标目录。开始时,目的地为空;源包含一个文本文件。

[root@tc-dlx-nba cwd]# ls -l
total 0
drwxrwxrwx. 2 root root  6 Jun 12 14:33 destination
drwxrwxrwx. 2 root root 21 Jun 12 14:33 source
[root@tc-dlx-nba cwd]# ls -l destination/
total 0
[root@tc-dlx-nba cwd]# ls -l source/
total 4
-rw-r--r--. 1 root root 8 Jun 12 14:20 test.txt
[root@tc-dlx-nba cwd]# 

如您所见,关于权限,两个目录均为777,所有者和组均设置为root。文本文件的所有者和组也都设置为root。但是,文本文件的权限对所有者是读写的,但对于组是只读的。

以root用户身份登录时,在目标目录中创建指向文本文件(在源目录中)的硬链接没有问题。

[root@tc-dlx-nba cwd]# ln source/test.txt destination/
[root@tc-dlx-nba cwd]# ls destination/
test.txt

但是,如果以其他用户身份登录(在这种情况下为admin),则无法创建链接。我得到:“不允许操作。”

[root@tc-dlx-nba cwd]# rm -f destination/test.txt 
[root@tc-dlx-nba cwd]# su admin
bash-4.2$ pwd
/root/cwd
bash-4.2$ ln source/test.txt destination/
ln: failed to create hard link ‘destination/test.txt’ => ‘source/test.txt’: Operation not permitted

发生的事情对我来说实际上是有意义的,但是由于CentOS 6中允许上述操作,所以我想检查一下我是否误解了。对我来说,这似乎是CentOS 6中的错误,已在CentOS 7中修复。

有人知道会给什么吗?我是否正确认为上述行为是正确的行为?是正确的CentOS 6吗?或者,都是正确的,也许我缺少一些微妙的组权限问题?谢谢。


编辑:我刚刚在我拥有的Debian v7 VM上尝试了相同的测试。Debian同意CentOS 7:“不允许操作”。


编辑2:我只是在Mac OS X(Yosemite)上尝试过同样的事情。这与CentOS 6的工作方式一样。换句话说,它允许创建链接。(注意:在OS X上,根组称为“ wheel”。据我所知,这是唯一的区别。)


1
看来用户admin没有权限影响链接。链接的所有权取决于谁拥有被链接的文件/文件夹。管理员与root用户不同。那是我的2美分。作为管理员,请尝试使用“ sudo ln source / test.txt destination /”。您可能还想开始使用-s标志。当创建不带-s标志的链接时,就是在建立硬链接。这是灾难的秘诀,因为如果链接的文件/文件夹被破坏,原始文件也将被破坏。使用-s“软链接”,链接到文件的破坏不会影响原始文件。
Baazigar 2015年

@Baazigar-谢谢。我已经调查过了。这是我的问题。我继承了一个依赖于CentOS 6行为(能够创建链接)的Perl应用程序。我正在将应用程序迁移到CentOS7。这实际上只是总体方案中的一个小问题,但是我不知道为什么使用Perl链接功能而不是Perl File :: Copy功能。我认为仅复制文件就足够了。但是,我必须在进行更改之前进行尽职调查-并且(当然)没有文档或注释来解释我继承的原始决定。
Mario

如果没有文档说明或没有理由说明现在的解决方案,那么您的解决方案在假设可行的情况下同样有效,而在有文档的情况下更有效。我认为centos对链接的处理没有改变。我认为您很有可能在旧的盒子上还没有遇到过某些东西,可能是/ etc / group或其他地方的东西,可以解释明显的异常。
Baazigar 2015年

@Baazigar-我只是在Mac OS X中尝试了相同的操作,尽管我不得不使用“ wheel”组(root的组)代替“ root”组。您可能知道,OS X是BSD的变体。这与CentOS 6的工作方式相同-换句话说,它允许建立链接。目前,我不知道什么是对的。在(主要是)符合POSIX的系统上不应该有一种统一的做法吗?
Mario 2015年

Answers:


5

我启动了一些新的CentOS 6和7虚拟机,并能够重新创建您显示的确切行为。经过一番挖掘之后,事实证明,这实际上是内核中出于安全性考虑对硬链接和软链接的默认行为的更改。以下页面为我指明了正确的方向:

http://kernel.opensuse.org/cgit/kernel/commit/?id=561ec64ae67ef25cac8d72bb9c4bfc955edfd415

http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1

如果您使文件世界可写,则管理员用户将能够创建硬链接。

为了恢复到整个CentOS 6系统的行为,添加了新的内核参数。在/etc/sysctl.conf中设置以下内容:

fs.protected_hardlinks = 0
fs.protected_symlinks = 0

然后跑

sysctl -p

至于为什么您的程序选择使用链接而不是复制文件,为什么仅在创建指向原始块的条目时创建需要使用的文件的精确副本?这样可以节省磁盘空间,并且在CPU和I / O方面的操作成本较低。新的硬链接是相同的文件,只是具有不同的元数据/索引节点。如果要在创建硬链接后删除原始文件,则不会影响链接。只有删除了所有链接后,才会“删除”文件。


谢谢。今天稍后,我将介绍这些链接。(在此期间,请进行投票!)我了解硬链接和副本之间的区别。但是,我继承的程序正在创建从源文件到“下载”区域的链接(通过Web应用程序前端)。我认为磁盘空间不是问题,因为它只是一个文本文件。而且,仅按照“下载”的一般含义,我不了解链接的适用范围:从语义上讲,复制似乎更有意义。(我担心程序中还有一些其他行为依赖链接。我必须检查一下。)
Mario

1
“我了解硬链接和副本之间的区别。” 顿,我只是在为广大读者写我的答案时,供将来的用户仔细阅读可能不知道的内容。
肖恩

我全心全意为广大读者撰写文章:-)我将在周一研究针对该应用程序的最佳解决方案。值得庆幸的是,我还有很多余地。(我唯一的约束是“您打破它;您购买它”!)我将您的标记为可接受的答案。再次感谢!
马里奥(Mario)

PS:我猜想CentOS的人默认选择了受保护的链接。(我从您提供的链接中发现,这是一个有争议的问题。)
Mario 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.