这一直令我困惑。为什么根目录包含对父目录的引用?
bob@bob:/$ ls -a 。构建 home lib32 mnt .rpmdb sys vmlinuz ..cdrom initrd.img lib64 opt sbin tmp vmlinuz.old bin dev initrd.img.old 丢失+找到 proc selinux usr 启动等 lib media root srv var
我了解文件系统中如何管理目录 - 每个目录都有 n+2 个指向自身的指针(n = 目录内的子目录数)。一个用于每个直接子目录,一个用于其父目录,一个用于其自身。
/
但是的父级是什么?
答案1
/..
指着/
:
$ ls -id /
2 /
$ ls -id /..
2 /..
两者具有相同的 inode 编号,在该系统上恰好为 2。 (确切的值并不重要。)
这样做是为了保持一致性。这样,当内核处理..
路径中的a 时,就不必在内核中添加代码来检查它当前所在的位置。你可以说cd ..
永远,但永远不会比根更深。
答案2
它之所以存在,是因为它是 Unix 做出的保证:每个目录都包含两个条目,.
一个指向自身,..
另一个指向父目录。
当前命名空间的根目录很特殊,它..
指向与 相同的东西.
,但没有那么特殊到破坏操作系统对程序的保证。当这些合同被打破时,事情就会出错,每个人都会互相指责。
在磁盘上的文件系统中,您看到的根目录实际上可能有一个不同的父目录。已安装命名空间中提供的文件系统视图是强制.. = .
执行/
.因此,如果你在chroot()
监狱里,你会看到,/.. = /
即使监狱外的人/path/to/jail/..
会看到/path/to
。