Firma Cisco wprowadziła nowy system plików PuzzleFS, zrealizowany jako moduł dla jądra Linux, napisany w języku Rust. System plików jest przeznaczony do użycia w izolowanych kontenerach i kontynuuje rozwijanie idei przedstawionych w systemie plików Atomfs. Realizacja jest obecnie na etapie prototypu, wspiera kompilację z gałęzi jądra Linux rust-next i jest udostępniona na licencjach Apache 2.0 i MIT.
Projekt ma na celu obejście ograniczeń związanych z używaniem obrazów kontenerów w formacie OCI (Open Container Initiative). PuzzleFS rozwiązuje takie problemy jak efektywne przechowywanie zduplikowanych danych, możliwość bezpośredniego montażu, powtarzalna kompilacja obrazów i bezpieczna praca z pamięcią.
Do deduplikacji powtarzających się danych w różnych kontenerach wykorzystany jest algorytm FastCDC (Fast Content-Defined Chunking), działający na podstawie podziału danych na fragmenty o dowolnym rozmiarze oraz prowadzenia indeksu z hashami przetworzonych fragmentów. Powtarzające się fragmenty są przechowywane tylko raz i wspólnie indeksowane dla wszystkich warstw systemu plików, tj. deduplikacja może obejmować różne punkty montowania (nowa warstwa systemu plików może być uruchomiona na podstawie istniejącej i wykorzystać zawarte w niej fragmenty danych przy deduplikacji).
Powtarzalna kompilacja obrazów kontenerów osiągana jest poprzez określenie kanonicznej reprezentacji formatu obrazów kontenerów. Bezpośredni montaż (direct-mount) pozwala na zamontowanie obrazu kontenera w formacie OCI z globalnego współdzielonego magazynu bez jego wcześniejszego rozpakowania, wykorzystując jako identyfikator hash zawartości z manifestu kontenera. Do weryfikacji integralności danych w warunkach korzystania z wspólnego magazynu może być stosowany mechanizm fs-verity, który przy dostępie do plików sprawdza zgodność wskazanych w binarnym indeksie hashy z rzeczywistą zawartością.
Język Rust został wybrany ze względu na wysoką wydajność generowanego kodu oraz możliwości bezpiecznej obsługi pamięci, co pozwala na zredukowanie ryzyka powstawania luk bezpieczeństwa, związanych z takimi problemami jak dostęp do obszaru pamięci po jego zwolnieniu oraz przekroczenie granic bufora. Zastosowanie Rust w module jądra umożliwiło również współdzielenie kodu w jądrze i komponentach działających w przestrzeni użytkownika, co pozwoliło na stworzenie jednolitej, zabezpieczonej implementacji.
Wśród innych celów projektu: bardzo szybka kompilacja i montowanie obrazów, możliwość użycia opcjonalnego etapu do przekształcania (kanonizacji) obrazów, brak konieczności pełnych przejść po drzewie systemu plików w stylu mtree przy użyciu struktury wielowarstwowej, nakładanie zmian w stylu casync oraz łatwa do wdrożenia architektura.
Źródło: opennet.ru
