我理解为什么目录上的硬链接是危险的(循环,由于父目录链接而导致 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 选项也执行类似的操作,尽管适用于任何文件类型。