Foi lançado o projeto LittleFS 2.10, que desenvolve um sistema de arquivos compacto para dispositivos embarcados e microcontroladores. Inicialmente, o sistema de arquivos foi criado pela ARM para o sistema operacional Mbed OS, mas depois foi separado em um projeto independente. O código do FS é escrito em linguagem C e distribuído sob licença BSD. A implementação de referência do LittleFS é fornecida como uma biblioteca C, a partir da qual foi criado um módulo FUSE e wrappers para várias linguagens de programação.
Características do LittleFS:
- Baixos requisitos de recursos e suporte para operação em condições de tamanho de RAM limitado. Na implementação do LittleFS, são utilizados apenas buffers definidos estaticamente (sem alocação dinâmica de memória) e não são feitas chamadas recursivas, o que garante que o tamanho da memória RAM consumida e das estruturas auxiliares do LittleFS no armazenamento permaneçam constantes, independentemente do que é gravado no FS e do tamanho do armazenamento.
- Mecanismos para nivelamento de desgaste de dispositivos Flash, permitindo minimizar a reutilização de blocos e distribuir uniformemente as operações de limpeza de blocos na memória Flash, cujo controlador não fornece uma solução para essa tarefa.
- Alta resistência a falhas — o FS considera a interrupção inesperada (término de operação devido à falta de energia) como uma situação normal e garante que o armazenamento no disco mantenha-se íntegro a qualquer momento. Para evitar a corrupção de dados, é utilizado um mecanismo de copy-on-write (COW), onde as alterações não sobrescrevem as informações, mas são salvas em um novo local.
- Atomicidade na realização de operações, como exclusão e renomeação, mesmo em caso de perda de energia durante sua execução. As alterações em um arquivo são gravadas no disco apenas após a chamada sync ou close. Descompassos causados por operações que não podem ser realizadas de forma atômica são resolvidos por um manipulador especial de deorphan, que percorre toda a árvore do FS após a carga.
- Suporte a funções semelhantes ao POSIX para trabalhar com arquivos e diretórios.
O conteúdo dos arquivos em LittleFS é apresentado como listas COW-CTZ, oferecendo um nível de complexidade O(1) ao adicionar e O(nlogn) ao ler. A alocação de blocos é feita por meio da varredura do sistema de arquivos em busca de blocos utilizados em uma área de tamanho fixo, armazenada como um vetor de bits. Para simplificar a varredura, todos os diretórios fazem parte de uma lista encadeada que abrange todo o sistema de arquivos. Se um erro for detectado ao gravar um bloco, um novo bloco é alocado e os dados são transferidos para ele.
Entre as mudanças na nova versão do LittleFS:
- O código de análise de caminhos de arquivos foi revisado, permitindo que o comportamento do sistema de arquivos se aproxime das expectativas dos usuários em sistemas POSIX em situações como a finalização de caminhos com barra, o tratamento de caminhos vazios e a navegação fora da raiz do sistema de arquivos.
- Foram adicionados dois novos exemplos de dispositivos de bloco, ramcrc32bd e ramrsbd, que implementam um mecanismo de correção de erros compatível com LittleFS. No estado atual, o próprio LittleFS não suporta a detecção e a correção de erros, e essas operações são transferidas para o nível dos dispositivos de bloco.
- A função lfs_mkdir agora suporta barras finais, ou seja, a chamada lfs_mkdir("a/") não gerará mais um erro.
- Nas funções lfs_stat e lfs_getattr, agora será gerado um erro ao usar barras finais se o caminho existente no sistema de arquivos não for um diretório.
- A tentativa de abrir um arquivo com barra final no nome usando a função lfs_file_open agora resultará no erro LFS_ERR_NOTDIR, se o arquivo não for um diretório no sistema de arquivos, LFS_ERR_ISDIR, se o nome se referir a um diretório no sistema de arquivos, e LFS_O_CREAT, se o arquivo não existir.
- A tentativa de acessar fora da raiz do sistema de arquivos, por exemplo, lfs_stat("/../a"), agora resultará na exibição de um erro.
- Especificar um caminho vazio não é mais um sinônimo de acessar o diretório raiz, ou seja, a chamada lfs_stat("") resultará na exibição de um erro.
Fonte: opennet.ru
