Isso sempre me intrigou. Por que o diretório raiz contém uma referência a um diretório pai?
bob @ bob:/$ ls -a . build home lib32 mnt .rpmdb sys vmlinuz .. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old bin dev initrd.img.old perdido + encontrado proc selinux usr boot etc lib media root srv var
Eu entendo como os diretórios são gerenciados no sistema de arquivos - cada diretório tem n + 2 ponteiros para si mesmo (n = número de subdiretórios dentro do diretório). Um para cada subdiretório imediato, um para seu pai e um para si mesmo.
Mas qual é o pai de /
?
/..
aponta para /
:
$ ls -id /
2 /
$ ls -id /..
2 /..
Ambos têm o mesmo número de inode, que por acaso é 2 neste sistema. (O valor exato não importa.)
É feito para consistência. Dessa forma, não é necessário haver código no kernel para verificar onde ele está atualmente quando processa um ..
em um caminho. Você pode dizer cd ..
para sempre, e nunca vá além da raiz.
Está lá porque é uma garantia feita pelo Unix: cada diretório contém duas entradas, .
Que se refere a si mesmo, e ..
Que se refere ao pai.
O diretório raiz do namespace atual é especial, pois ..
Aponta para a mesma coisa que .
, Mas não tão especial para quebrar a garantia feita pelo sistema operacional aos programas. Quando esses contratos são quebrados, as coisas dão errado e todos apontam o dedo.
O diretório raiz que você vê pode, no sistema de arquivos no disco, na verdade ter um diretório pai diferente. A visão dos sistemas de arquivos fornecidos no namespace montado é o que impõe a regra .. = .
Para /
. Portanto, se você estiver em uma chroot()
prisão, verá /.. = /
Mesmo que alguém de fora da prisão olhando para /path/to/jail/..
Verá /path/to
.