我最近在 Solaris 11 系统上进行开发时遇到了以下问题:
不知何故,一些目录的父指针 ( ..
) 指向与父目录不同的目录。
让我们调用父目录p
,以及有问题的目录
d
(即,d
位于目录 中p
。)
情况却并非d/..
如此p
。具体来说,这两个命令
ls -ild p
ls -ild p/d/..
显示不同的 i 节点号。事实上,第二个命令给出了相同的 i 节点作为不同的子目录p
:p/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