如何取消链接(删除)特殊的硬链接“.”为文件夹创建?

如何取消链接(删除)特殊的硬链接“.”为文件夹创建?

在 Linux 上,当您创建文件夹时,它会自动创建两个硬链接到对应的inode。一个是您要求创建的文件夹,另一个是.此文件夹的特殊文件夹。

例子:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

正如你所看到的,folder.的内部folder都有相同的 inode 号(用-i选项显示)。

有没有办法删除这个特殊的.硬链接?

这仅用于实验和好奇心。 另外我想答案..也适用于特殊文件。

我试图研究rmman 但找不到任何方法。当我尝试删除.所有内容时,我得到的是:

R M: ”。”并且“..”不能被删除

我真的对这些事情的整个运作方式很好奇,所以不要克制自己在这个问题上非常冗长。

编辑:也许我不清楚我的帖子,但我想了解负责.文件的底层机制以及它们无法删除的原因。

我知道 POSIX 标准不允许硬链接少于 2 个的文件夹,但不明白为什么。我想知道是否有可能做到这一点。

答案1

从技术上来说是可以删除 的.,至少在 EXT4 文件系统上是这样。如果您在 中创建文件系统映像test.img,安装它并创建一个test文件夹,然后再次卸载它,您可以使用以下命令编辑它debugfs

debugfs -w test.img
cd test
unlink .

debugfs不会抱怨并尽职尽责地删除.文件系统中的目录条目。该test目录仍然可用,令人惊讶的是:

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

仅显示

..

所以.真的消失了。然而cd .,,,ls .还是pwd一如既往的表现!

我之前使用 完成了此测试rmdir .,但这会删除目录的 inode (巨大的谢谢红碗为了指出这一点),这留下了test一个悬空目录条目,并且是遇到问题的真正原因。在这种情况下,该test文件夹将变得不可用;安装映像后,运行ls会产生

ls: cannot access '/mnt/test': Structure needs cleaning

内核日志显示

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

e2fsck在这种情况下在映像上运行test会完全删除该目录(目录 inode 已消失,因此无需恢复)。

所有这些都表明它.作为 EXT4 文件系统中的特定实体存在。我从内核中的文件系统代码得到的印象是它期望...存在,并且如果不存在则发出警告(请参阅namei.c),但是通过unlink .基于 - 的测试我没有看到该警告。e2fsck不喜欢丢失的.目录条目,并提出修复它:

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

这将重新创建.目录条目。

答案2

无法删除此目录条目。该条.目的意思是“这个目录”,该条..目的意思是“这个目录的父目录”。它们实际上并不是硬链接,这只是目录结构的创建/表示方式。

答案3

如中所述Lion 对 Unix 6 源代码的注释早期的 Unix 有一个磁盘文件,其中文件和目录在磁盘上都由 inode 结构表示。有一个特殊位表明文件内容是一个目录。每个 inode 都有一个指向其所属 inode 的链接,该链接允许文件知道它所在的目录。例外的是拥有自身的“/”目录。还有一个内容链接。如果索引节点没有内容,则可以将其返回到空闲列表。由于目录只是一个受祝福的文件,即使是空目录也必须包含内容以防止其被垃圾收集。因此 .. 是 inode 到父 inode 的链接,而 ..是否表明该目录仍然可用。 rmdir(通过调用 unlink)可以删除 .如果没有其他内容,则该索引节点将在没有更多引用时移动到空闲列表。

答案4

作为“可能重复”帖子的回答说,POSIX 标准指定如果 rmdir 尝试删除当前目录,它将失败。

无论你建造什么,你都必须有一个基础。如果没有办法说“这里”,就很难定义相对路径。所以 '。'被定义为“这里”。

还有,你删除“点”和“点点”。编写您自己的操作系统,但不定义它们。尽管 Unix(以及 Mac OSX 的扩展)、Linux,甚至 MS DOS 和 Windows 都使用点和点。

TL;DR - “点”是操作系统的定义。

相关内容