Como os arquivos / dirs são ocultos de ls -a enquanto ainda estão acessíveis em um sistema compatível com POSIX?

7

Por exemplo, no ZFS no FreeBSD e no ZoL, há um diretório mágico .zfs dentro de cada ponto de montagem do zpool e você pode usar zfs set snapdir=visible para tornar esse .zfs dir visível.

O que me deixa curioso é: se essa configuração for "oculta", como o .zfs dir, na verdade, é ocultado da saída de um ls -a ou do preenchimento automático do caminho do shell , enquanto ainda está sendo acessível de outra forma (você ainda pode cd ou ligar para stat )?

Eu não consigo me preocupar com esse fato, porque de alguma forma eu acho que se algo está lá e acessível, ele deveria estar listado em ls -a - mesmo que seja apenas mágica / virtual por natureza.

Alguém pode explicar como isso funciona? Existe uma forma de conformidade POSIX para ter um diretório que está oculto de ls -a enquanto ainda está acessível? Como você faz isso?

    
por s1lv3r 22.12.2016 / 16:07

1 resposta

7

Bem, como fazer isso é bastante fácil: ls obtém sua lista de um syscall (ou, no Linux, da função libc) chamada readdir . A mudança para um diretório é feita com um syscall separado, chdir . stat também é um syscall diferente, assim como a maioria das outras operações de arquivo.

Em suma, "o que há nesse diretório?" e "acessar este diretório" são solicitações completamente separadas do kernel - para que possam ser programadas para funcionar de maneira diferente.

Portanto, para criar um diretório que não apareça em ls -a , basta o kernel omiti-lo dos resultados de readdir . Mas ainda funciona com chdir (etc.), porque é um syscall diferente.

Isto não é tão diferente de ter um diretório onde você tem +x permission, mas não -r : você pode acessar arquivos e diretórios dentro dele, cd nele, etc ., mas ls falhará. Acredito que outras coisas também usaram este arranjo - por exemplo (e isso é da memória fuzzy sem procurar) O AFS tinha uma espécie de namespace /afs global onde você poderia se conectar a qualquer servidor AFS essencialmente por cd 'ing em seu nome; no entanto, um ls on /afs não mostraria todos os servidores do mundo. Eu vi sistemas de arquivos FUSE fazer semelhante (por exemplo, cd para se conectar a um servidor FTP anônimo).

(Não tenho certeza se o acordo zfs está em conformidade com o POSIX).

    
por 22.12.2016 / 16:20