Em qualquer sistema POSIX, a interface entre aplicativos e o kernel são algumas chamadas de função: open
, read
, write
, close
, etc. Um aplicativo como cat
chama essas funções; não importa como as funções são implementadas sob o capô.
Em sistemas Unix, essas funções são, na verdade, chamadas do sistema : o aplicativo chama o kernel . Dentro do kernel, uma arquitetura típica é ter uma camada VFS , que lida com tarefas que são independentes do formato do sistema de arquivos (como como localizar o sistema de arquivos apropriado, permissões, bloqueio, etc.). Depois de determinar em qual sistema de arquivos o arquivo está localizado, a camada VFS passa a operação para o driver específico do sistema de arquivos.
Você pode observar a interface entre os aplicativos e o kernel com uma ferramenta como strace no Linux ou seu equivalente em outros Unix plataformas ( trace
, truss
,…). Exemplo (omitindo a parte do rastreio correspondente à inicialização e a limpeza final de cat
):
$ strace cat foo
…
open("foo", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8b9ea14000
read(3, "hello\n", 131072) = 6
write(1, "hello\n", 6hello
) = 6
read(3, "", 131072) = 0
munmap(0x7f8b9ea14000, 139264) = 0
close(3) = 0
…
Você pode ver cat
chamando open
, read
e close
no arquivo. Ele também chama fstat
e fadvise64
, acho que apenas para otimizações de desempenho.
A interface entre o VFS e o driver do sistema de arquivos não pode ser espionada tão facilmente.
Programas como mkfs
e fsck
não passam pela interface de sistema de arquivos do kernel, porque eles não funcionam em arquivos, eles trabalham em áreas de armazenamento. Eles acessam o dispositivo de bloco que contém o sistema de arquivos diretamente.
Se você quiser adicionar suporte para um novo sistema de arquivos, você precisa escrever um driver para ele. Existem duas maneiras de fazer isso.
- Você pode escrever um driver que seja executado no kernel; Isso proporciona a você o melhor desempenho e é a única maneira de implementar algum recurso (por exemplo, controle de acesso refinado). Mas também é mais difícil de depurar (se o seu driver tiver um bug, você provavelmente precisará reinicializar; se tiver sorte, poderá visualizar um rastreamento de erro e talvez até atrasar a reinicialização até salvar seus dados - melhor fazer isso em uma máquina virtual). Procure a documentação do kernel da sua variante Unix para ver qual interface você precisa implementar.
- Como alternativa, você pode usar o FUSE , que é um driver de sistema de arquivos que encaminha todos os pedidos de volta para fora do kernel, então Cada driver do sistema de arquivos é implementado como um processo. Se o sistema de arquivos estiver com problemas, apenas mate o processo do driver do sistema de arquivos e o resto do sistema operacional sobreviverá. Para aprender como escrever um sistema de arquivos FUSE, veja os exemplos e leia tutoriais como Sumit Singh's .