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)
这将重新创建.目录条目。
无法删除此目录条目。该.录入装置“在此目录”中,..录入装置“这个目录的父目录”。它们实际上不是硬链接,这只是创建/表示目录结构的方式。