Unix:“..”不指向父级——这怎么可能?

Unix:“..”不指向父级——这怎么可能?

我最近在 Solaris 11 系统上进行开发时遇到了以下问题:

不知何故,一些目录的父指针 ( ..) 指向与父目录不同的目录。

让我们调用父目录p,以及有问题的目录 d (即,d位于目录 中p。)

情况却并非d/..如此p。具体来说,这两个命令

ls -ild  p

ls -ild  p/d/..

显示不同的 i 节点号。事实上,第二个命令给出了相同的 i 节点作为不同的子目录pp/x

而且,不d不是符号链接。 (这是我检查的第一件事。)

这怎么可能?我认为内核会阻止它发生。

我确实知道其他人正在移动目录并重命名它们,尽管我不确切知道他们做了什么。然而,我认为他们不知道如何进行系统黑客攻击。

答案1

让我对最初的问题给出一个真正的答案,并解释如何创建这种状态:

mkfile 100m ufs
lofiadm -a /path/to/ufs
newfs /dev/rlofi/1
newfs: Neues Dateisystem /dev/rlofi/1 erstellen: (y/n)? y
/dev/rlofi/1:   204600 Sektoren in 341 Zylindern von 1 Spuren, 600 Sektoren
        99,9MB in 22 Zylindergruppen (16 c/g, 4,69MB/g, 2240 i/g)
Superblock Backups (für fsck -F ufs -o b=#) bei:
 32, 9632, 19232, 28832, 38432, 48032, 57632, 67232, 76832, 86432,
 115232, 124832, 134432, 144032, 153632, 163232, 172832, 182432, 192032, 201632

mount /dev/lofi/1 /mnt
cd /mnt
mkdir -p a/b/c d

ls -lid a/b/ a/b/c a/b/c/..
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/
     6 drwxr-xr-x   2 root     root         512 Apr 20 17:05 a/b/c
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/c/..

link a/b/c/ d/hlink
ls -lid a/b/ a/b/c a/b/c/.. d/ d/hlink/ d/hlink/..
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/
     6 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/c
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 a/b/c/..
     7 drwxr-xr-x   2 root     root         512 Apr 20 17:08 d/
     6 drwxr-xr-x   3 root     root         512 Apr 20 17:05 d/hlink/
     5 drwxr-xr-x   3 root     root         512 Apr 20 17:05 d/hlink/..

这是创建一个测试超前文件中的文件系统,然后通过以下方式将其用作块设备lofi(7d)“环回文件驱动程序”(见fbk下面的注释)并安装在/mnt目录上。 ufs 文件系统(与 zfs 不同)还支持创建目录的硬链接,但仅限 root 用户。

如您所见,inode 编号为a/b/5,inode 编号of a/b/c/..也为 5。您还可以看到,目录 a/b/c 的链接计数因调用而增加了 1 link

创建新的硬链接目录后d/hlink,您会看到 的 inode 编号d/hlink/..不是 7(上面目录的 inode 编号),而是 5(该目录上面原始目录的 inode 编号)。

顺便说一句:loopback文件系统首次出现于 1987 年的 SunOS-4.0 中。它的目的是充当 VFS 间接层,允许在同一台计算机中第二次挂载文件系统树。我不确定这个 Linux 绑定挂载是否是环回文件系统思想的重新实现。

显而易见的是,fbk驱动程序(文件模拟块设备)是我于 1988 年 10 月发明的,已于 20 世纪 90 年代中期以不正确的名称在 Linux 上重新实现loopback

答案2

如果我们从最简单的可能性是最有可能的前提出发:

我确实知道其他人正在移动目录并重命名它们,尽管我不确切知道他们做了什么。

那么该场景应该相对容易重现。考虑这个示例,运行1$第一个终端的提示,并穿插2$第二个终端的提示

# Set up the scenario
1$ mkdir a a/b a/b/c d
1$ cd a/b/c

# Look at the parent inode
1$ ls -lid ..
143279 drwxr-xr-x 3 roaima roaima 4096 Apr 20 08:42 ..

# Second session changes the directory structure
2$ mv a/b/c d

# Look at the parent inode once more - notice it's changed
1$ ls -lid ..
142603 drwxr-xr-x 3 roaima roaima 4096 Apr 20 08:43

相关内容