Sim, os sistemas de arquivos no Linux podem ser implementados como módulos do kernel. Mas há também a interface FUSE (Filesystem in USErspace), que pode permitir que um processo regular do espaço do usuário atue como um driver do sistema de arquivos. Se você estiver criando um novo sistema de arquivos para prototipagem, implementá-lo primeiro usando a interface do FUSE pode facilitar o teste e o desenvolvimento. Depois de elaborar as partes internas do sistema de arquivos no formato FUSE, você poderá começar a implementar uma versão do módulo do kernel com desempenho otimizado.
Aqui estão algumas informações básicas sobre como implementar um sistema de arquivos no espaço do kernel. É bastante antigo (de 1996!), Mas isso deve fornecer pelo menos uma idéia básica para o tipo de coisa que você precisa fazer.
Se você optar por ir para a rota do FUSE, aqui está a libfuse, a implementação de referência do lado do espaço do usuário da interface do FUSE.
Driver do sistema de arquivos como um módulo do kernel
Basicamente, a função de inicialização do módulo do driver do sistema de arquivos precisa apenas chamar uma register_filesystem()
função e fornecer como parâmetro uma estrutura que inclua um ponteiro de função que identifique a função no driver do sistema de arquivos que será usada como a primeira etapa na identificação do sistema de arquivos tipo e montagem. Nada mais acontece nessa fase.
Quando um sistema de arquivos está sendo montado e o tipo de sistema de arquivos é especificado para corresponder ao seu driver ou a detecção automática do tipo de sistema de arquivos está sendo executada, a camada Virtual FileSystem (VFS para abreviado) do kernel chama essa função. Basicamente, diz "Aqui está um ponteiro para uma representação no nível do kernel de um dispositivo de bloco padrão do Linux. Dê uma olhada, veja se é algo que você pode manipular e depois me diga o que você pode fazer com ele".
Nesse ponto, seu driver deve ler o que for necessário para verificar se é o driver correto para o sistema de arquivos e, em seguida, retornar uma estrutura que inclua ponteiros para outras funções que seu driver pode fazer com esse sistema de arquivos específico. Ou, se o driver do sistema de arquivos não reconhecer os dados no disco, ele deve retornar um resultado de erro apropriado e o VFS relatará uma falha no espaço do usuário ou - se a detecção automática do tipo de sistema de arquivos estiver sendo executada - solicitará outro sistema de arquivos motorista para tentar.
Os outros drivers no kernel fornecerão a interface padrão do dispositivo de bloco, portanto o driver do sistema de arquivos não precisará implementar o suporte de hardware. Basicamente, o driver do sistema de arquivos pode ler e gravar blocos de disco usando funções padrão no nível do kernel com o ponteiro do dispositivo fornecido.
A camada VFS espera que o driver do sistema de arquivos disponibilize várias funções padrão para a camada VFS; alguns deles são obrigatórios para que a camada VFS faça algo significativo com o sistema de arquivos, outros são opcionais e você pode simplesmente retornar um NULL no lugar de um ponteiro para uma função opcional.
Sim, um driver de kernel pode gerenciar um sistema de arquivos.
A melhor solução para criar um protótipo de um sistema de arquivos é usar o FUSE. E depois que você puder pensar em transformá-lo em um driver de kernel.
Wikipedia => https://en.wikipedia.org/wiki/Filesystem_in_Userspace
Fonte => https://github.com/libfuse/libfuse
um tutorial => https://developer.ibm.com/articles/l-fuse/
fonte
Sim, isso normalmente seria feito usando um driver do kernel que pode ser carregado como um módulo do kernel ou compilado no kernel.
Você pode conferir drivers semelhantes do sistema de arquivos e como eles funcionam aqui .
Esses drivers provavelmente usam funções internas do kernel para acessar dispositivos de armazenamento como blocos de bytes, mas você também pode usar dispositivos de bloco expostos por drivers nas pastas de dispositivos de bloco e dispositivos de caracteres .
fonte
Você pode usar o fusível, para criar um sistema de arquivos do usuário ou gravar um módulo do kernel. É mais fácil fazer o fusível, pois você tem uma escolha de idiomas e não trava o kernel (e, portanto, todo o sistema).
Os módulos do kernel podem ser mais rápidos, mas a primeira regra de otimização é: Não faça isso até que você tenha testado o código de funcionamento. A segunda é a seguinte: não faça isso até ter provas de que é muito lento. E a terceira: não guarde, a menos que você tenha evidências de que o torna mais rápido / menor.
E sim, o kernel já possui drivers para o hardware, você não os implementa novamente.
fonte
pivot_root
, porque ainda existem inodes ocupados no initramfs./init
iniciado a partir de um initramfs (acho) será executado/init
após pivot_root, para transferir o controle para os FS raiz reais/init
. Mas um binário do FUSE não poderia se substituir pelo execve se o acesso ao FS raiz dependesse do processo do FUSE responder ao kernel. Bem, talvez preparando o pagecache primeiro, mas isso não parece confiável.