/etc/init.d 在 CentOS 上是硬链接的吗?

/etc/init.d 在 CentOS 上是硬链接的吗?

我理解为什么目录上的硬链接是危险的(循环,由于父目录链接而导致 rmdir 的问题),并且已经阅读了有关该主题的其他问题。所以我假设除了 和 之外的目录上的硬链接...被使用。但我在 CentOS 5 和 6 上看到以下内容:

# ls -id /etc/init.d/
459259 /etc/init.d/
# ls -id /etc/rc.d/init.d/
459259 /etc/rc.d/init.d/
# ls -id /etc/init.d/../
458798 /etc/init.d/../
# ls -id /etc/rc.d/
458798 /etc/rc.d/
# ls -id /etc/
425985 /etc/

换句话说,指向同一 inode 的目录的 2 个不同路径以及指向/etc/init.d//etc/rc.d/不是/etc/.这真的是硬链接目录的情况吗?如果不是,那是什么?如果是,为什么红帽要这么做?

编辑:我很抱歉问了一个愚蠢的问题,我应该能够看到它是一个符号链接。今天的咖啡好像不够。

答案1

这是软链接,不是硬链接。符号链接指向其他文件。打开符号链接将打开该链接指向的文件。使用 rm 删除符号链接将删除符号链接本身,但不会删除实际文件。

这由权限开头的字母 l 表示

lrwxrwxrwx. 1 root root 11 Aug 10 2016 init.d -> rc.d/init.d

此外,所有 rc0.d 到 rc6.d 都是 rc.d/rc0.d 的符号链接

答案2

在 RHEL、Fedora 和 CentOS 上,/etc/init.d符号链接/etc/rc.d/init.d。不涉及硬链接。

即使红帽愿意,在所使用的文件系统上也是不可能的。

答案3

这篇文章有点旧了,但我觉得 OP 所看到的行为还没有得到解释。正如其他人所说,/etc/init.d是 的符号链接/etc/rc.d/init.d。缺少的部分是上面使用的两个路径返回相同 inode 的原因,这是由于使用了尾部正斜杠。当路径以正斜杠结尾时,它告诉内核和其他工具该目录是目标目录。当预期目标应该是实际不存在的目录时,它可以保护 mv/cp 命令免于重命名文件。它还会导致 ls 使用的 lstat(2) 系统调用取消引用符号链接,并返回它指向的目录(如果它不指向现有目录,则抛出错误)。尝试这个例子来看看区别:

$ ls -id .
927578 .
$ ls -id ./parent
927641 ./parent
$ ls -id ./parent/
927641 ./parent/
$ ls -id ./parent/child
927643 ./parent/child
$ ls -id ./parent/child/
927643 ./parent/child/
$ ls -id ./child
927645 ./child
$ ls -id ./child/
927643 ./child/
$ ls -idL ./child
927643 ./child
$ ls -id ./child/..
927641 ./child/..
$ ls -id ./child/../..
927578 ./child/../..

您可以看到尾部斜杠的存在仅对符号链接情况重要,但确实隐藏了链接的索引节点。此外,ls 的 -L 选项也执行类似的操作,尽管适用于任何文件类型。

相关内容