O sistema de arquivos EROFS, reconhecido por sua natureza open-source e suporte somente para leitura, deu um passo significativo com o início da reimplementação de seu código C na linguagem Rust. A mudança busca aumentar a segurança do código e, potencialmente, otimizar ainda mais o desempenho.
Embora o suporte do Linux para drivers de sistema de arquivos escritos em Rust ainda esteja em fase inicial, já houve algumas iniciativas notáveis, como a criação de um driver EXT2 em Rust. No entanto, nenhum sistema de arquivos virtual (VFS) escrito em Rust foi incorporado ao kernel principal até o momento, e grandes drivers ainda não fizeram a transição completa para Rust.
Patches iniciais e a abordagem de Yiyang Wu
Yiyang Wu lidera esse esforço, publicando recentemente patches que introduzem código Rust no EROFS. Embora essa nova implementação seja baseada no código C existente, ela ainda está em fase inicial. Wu comentou sobre a novidade:
“Aqui está um conjunto de patches para adicionar códigos esqueleto em Rust à implementação atual do EROFS. A implementação é fortemente inspirada pela versão em C e é baseada em um crate genérico chamado erofs_sys, criado por mim. O objetivo é, eventualmente, substituir partes do código em C e aproveitar os recursos de segurança do Rust, além de garantir melhor otimização.”
Wu também mencionou que muitas funcionalidades, como inodes de compressão, ainda dependem do código em C devido à falta de contrapartes em Rust e à limitação de tempo para desenvolvimento. No entanto, uma parte interessante do trabalho já é totalmente implementada em Rust: os atributos estendidos.
Desafios do uso de Rust em drivers de sistema de arquivos
A adoção inicial de Rust em drivers de sistemas de arquivos no Linux enfrenta alguns desafios. Como ainda não existe uma implementação madura do VFS em Rust integrada ao kernel, o código em Rust de Wu faz uso de ligações em C para garantir compatibilidade. Ele descreveu o processo:
“Atualmente, não há uma implementação robusta de VFS em Rust upstream. Por isso, esse conjunto de patches utiliza ligações em C internamente, e cada operação insegura é cuidadosamente examinada. Essa implementação oferece funções compatíveis com a ABI do C, expostas ao código original em C como hooks ou ponteiros de função.”
Outro ponto importante é que a reimplementação em Rust evita ao máximo o uso de bindings gerados automaticamente pelo bindgen. Isso reduz a dependência de APIs C externas, focando apenas nas necessárias para lidar com inode, dentry, file e dir_context.
O patch inicial de aproximadamente 3.000 linhas de código Rust está disponível para revisão e colaboração na lista de discussão do Rust para Linux. Para quem estiver interessado nos detalhes técnicos e nas próximas etapas, a RFC que introduz essa mudança está acessível aqui.