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


29

在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编号(与-ioption一起显示)。

无论如何,有没有删除这个特殊的.硬链接?

仅用于实验和好奇心。 另外,我猜答案也可能适用于..特殊文件。

我试图调查rm人,但找不到任何方法。当我尝试删除.所有内容时:

R M: ”。” 和“ ..”可能无法删除

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

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

我知道POSIX标准不允许一个少于2个硬链接的文件夹,但是并没有真正了解为什么。我想知道是否有可能这样做。



@StephenKitt请看我的编辑。
Fantattitude

1
我撤回了我的投票,让我们看看投票结果如何...
Stephen Kitt

2
相对路径都需要两者。您为什么要删除这些内容(除了好奇心之外)?
HalosGhost

@HalosGhost我只是非常好奇哈哈,探索系统的局限性以及以这种方式设计它的方式和原因。
Fantattitude

Answers:


46

从技术上讲.,至少在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 .,但会删除该目录的索引节点(巨大的感谢BowlOfRed指出这点),剩下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 .基于-test的测试中,我没有看到该警告。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>?

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


很有意思!谢谢!因此,该.文件夹确实存在于FS中,并且工具希望它可以正常工作。
Fantattitude

真的很高兴,我对Linux及其FS的了解不足,无法自己找到此类信息,因此非常感谢您抽出
宝贵

3
您可以尝试将“ rmdir”(实际上删除索引节点)更改为“ unlink”(仅删除目录条目)吗?它似乎保留了功能最强大的目录(mount或上没有错误ls)。我还没有看到是否出现其他问题。
BowlOfRed

@BowlOfRed非常感谢,这是非常好的一点-所以我rmdir .实际上是在销毁test该目录并将其保留为悬空的目录条目,您可能会引起问题。我将检查unlink并更新我的答案!
史蒂芬·基特

1
@GiacomoCatenazzi不是直接的,权限和所有权存储在索引节点中,而不是目录条目中。
史蒂芬·基特

5

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


我知道这一点,我只是好奇是否有可能,因为它们似乎是硬链接。如果不是,为什么将它们加到inode的硬链接数上?
Fantattitude

3
>实际上,它们并不是硬链接,而仅仅是创建/表示目录结构的方式。另外,重复。unix.stackexchange.com/questions/289385/…–
Xalorous

@Xalorous那么,这些特殊文件究竟代表什么,如果它们不是硬链接,它们又是什么?它们存在,所以它们必须在某个地方,除非它们只是ls自动显示出来或对我来说似乎不切实际的其他工具。
Fantattitude

@Fantattitude是文件夹如何实现rmdir无法删除PWD的POSIX要求的方式。
Xalorous

1
在传统的Unix文件系统中,它们是真正的硬链接。它们是由其他文件系统的驱动程序动态合成的。
Barmar

2

Lion's Notes on Unix 6源代码中所述早期的Unix有一个磁盘文件,其中文件和目录都由inode结构表示在磁盘上。有一个特殊的地方指示文件内容是一个目录。每个索引节点都有一个指向其自身索引节点的链接,该链接使文件可以知道它所在的目录。例外是拥有自身的“ /”目录。还有一个指向内容的链接。如果一个索引节点没有内容,则可以将其返回到空闲列表。由于目录只是一个受祝福的文件,所以即使是空目录也必须具有内容,以防止被垃圾回收。因此..是inode到父inode和.in的链接。指示该目录仍然可用。rmdir(通过调用unlink)可以删除。


0

正如post答案的“可能重复”所示,POSIX标准指定如果rmdir尝试删除当前目录,它将失败。

建立任何东西都必须具有基础。如果没有办法说“这里”,就很难定义相对路径。所以 '。' 被定义为“这里”。

另外,您可以删除“点”和“点点”。编写自己的未定义操作系统。尽管Unix(以及Mac OSX的扩展名),Linux,甚至MS DOS和Windows都使用点和点。

TL; DR-操作系统的定义中包含“点”。


这个答案主要对TL; DR有用。
约书亚
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.