La empresa Cisco ha presentado un nuevo sistema de archivos llamado PuzzleFS, implementado como un módulo para el núcleo de Linux, escrito en el lenguaje Rust. Este sistema de archivos está diseñado para alojar contenedores aislados y continúa desarrollando ideas propuestas en el sistema de archivos Atomfs. Actualmente, la implementación se encuentra en la fase de prototipo, es compatible con la rama de núcleo de Linux rust-next y está liberada bajo las licencias Apache 2.0 y MIT.
El proyecto tiene como objetivo superar las limitaciones que surgen al utilizar imágenes de contenedores en formato OCI (Open Container Initiative). PuzzleFS aborda problemas como el almacenamiento eficiente de datos duplicados, la posibilidad de montaje directo, la reconstrucción repetida de imágenes y un manejo seguro de la memoria.
Para la deduplicación de datos que se repiten en diferentes contenedores, se utiliza el algoritmo FastCDC (Fast Content-Defined Chunking), que opera dividiendo los datos en fragmentos de tamaño variable y manteniendo un índice con los hashes de los fragmentos procesados. Los fragmentos duplicados se almacenan una sola vez y se indexan conjuntamente para todas las capas del sistema de archivos, es decir, la deduplicación puede abarcar diferentes puntos de montaje (nueva capa del sistema de archivos puede lanzarse sobre la existente y utilizar los fragmentos de datos disponibles en ella durante la deduplicación).
La reconstrucción repetida de imágenes de contenedores se logra mediante la definición de una representación canónica del formato de imágenes de contenedores. El montaje directo (direct-mount) permite montar una imagen de contenedor en formato OCI desde un almacenamiento compartido global sin necesidad de descomprimirla previamente, utilizando como identificador el hash del contenido del manifiesto del contenedor. Para verificar la integridad de los datos en entornos que utilizan almacenamiento compartido, se puede emplear el mecanismo fs-verity, que al acceder a los archivos verifica la correspondencia de los hashes especificados en el índice binario con el contenido real.
El lenguaje Rust se elige por combinar un alto rendimiento del código resultante con capacidades para un manejo seguro de la memoria, lo que permite reducir el riesgo de vulnerabilidades causadas por problemas como el acceso a áreas de memoria después de su liberación y el desbordamiento de búfer. El uso de Rust para el módulo del núcleo también ha permitido compartir código entre el núcleo y los componentes que operan en el espacio de usuario, creando una implementación segura unificada.
Entre otros objetivos del proyecto: compilación y montaje de imágenes extremadamente rápidos, posibilidad de utilizar una etapa intermedia opcional para la transformación (canonicalización) de imágenes, no es obligatorio realizar recorridos completos por el árbol de FS al estilo mtree al utilizar una estructura multicapa, superposición de cambios al estilo casync y una arquitectura fácil de implementar.
Fuente: opennet.ru
