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

Fan*_*ude 29 linux filesystems hard-link rm

在 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 ..
Run Code Online (Sandbox Code Playgroud)

如您所见,folder.的内部folder具有相同的 inode 编号(显示为-i选项)。

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

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

我试图调查rm男人,但找不到任何方法来做到这一点。当我尝试删除.所有内容时,我得到的是:

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

我真的很好奇这些事情的整个运作方式,所以不要在这个主题上过于冗长。

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

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

Ste*_*itt 46

技术上可以删除.,至少在 EXT4 文件系统上。如果您在 中创建文件系统映像test.img,挂载它并创建一个test文件夹,然后再次卸载它,您可以使用debugfs以下命令对其进行编辑:

debugfs -w test.img
cd test
unlink .
Run Code Online (Sandbox Code Playgroud)

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

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls
Run Code Online (Sandbox Code Playgroud)

只显示

..
Run Code Online (Sandbox Code Playgroud)

所以.真的没了。然而cd ., ls .,pwd仍照常行事!

我以前也做过使用这个测试rmdir .,但会删除该目录的索引节点(巨大的感谢BowlOfRed指出这点),剩下test一个叼着目录项,是遇到的问题的真正原因。在这种情况下,该test文件夹将变得不可用;安装图像后,运行ls产生

ls: cannot access '/mnt/test': Structure needs cleaning
Run Code Online (Sandbox Code Playgroud)

并且内核日志显示

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913
Run Code Online (Sandbox Code Playgroud)

e2fsck在这种情况下在图像上运行会删除test完全目录(目录 inode 消失了,因此没有任何可恢复的内容)。

所有这些都表明它.作为 EXT4 文件系统中的特定实体存在。我从内核中的文件系统代码中得到了它期望...存在的印象,并在它们不存在时发出警告(请参阅参考资料namei.c),但是在unlink .基于 -based 的测试中,我没有看到该警告。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>?
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以尝试将“rmdir”(实际上删除inode)更改为“unlink”(仅删除目录条目)。它似乎留下了一个主要功能目录(在 `mount` 或 `ls` 上没有错误)。我还没有看到是否出现其他问题。 (3认同)

Joh*_*ohn 5

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

  • &gt; 它们实际上不是硬链接,这只是创建/表示目录结构的方式。另外,重复。http://unix.stackexchange.com/questions/289385/why-cant-i-remove-the-directory?rq=1 (3认同)