16 Jun 2009

FUSE - Filesystem in USErspace

FUSE jest kompletnym frameworkiem pozwalającym na implementację logiki systemu plików w przestrzeni użytkownika. Projekt ten powstawał przy okazji implementacji systemu plików AVFS w jądrze Linux, ale w końcu stał się oddzielnym projektem. Do niedawna do jądra Linux istniały odpowiednie patche pozwalające dodać obsługę FUSE (zarówno w kernelach w wersji 2.4 i 2.6) niemniej jednak dzięki wysokiej jakości i stabilności projekt ten został włączony na stałe do jądra w wersji 2.6.14 i znajduje się tam do dzisiaj. W chwili obecnej FUSE zostało przeniesione także na inne systemy operacyjne np. FreeBSD, Mac OSX, Solaris, Windows. Biblioteka FUSE pozwala stworzyć reprezentację plikową niemalże dowolnego zagadnienia przykładem takiej reprezentacji może być system plików FlicrFS pozwalający na wysyłanie zdjęć do serwisu Flickr poprzez najprostsze przeniesienie plików z "jednego dysku na drugi".

Zalety FUSE

  • Proste w użyciu API dzięki callbackom
  • Łatwa instalacja (wbudowane w jądro Linuxa i Solarisa)
  • Bezpieczna implementacja – uruchamianie w userspace (błąd systemu plików nie jest krytyczny dla jądra i co najwyżej proces zostanie zakończony)
  • Szybkość i prostota tworzenia nowych systemów plików jest znacznie większa niż przy pisaniu modułów do jądra
  • Istnieje możliwość korzystania z nośników wymiennych przez użytkowników nie posiadających praw administratora – system plików działa z prawami użytkownika który go zamontował (istnieje osobne narzędzie do montowania)
  • Stworzona implementacja systemu plików nie jest w żaden sposób przypisana do konkretnego systemu operacyjnego czy wersji jądra
  • Dodanie obsługi nowego systemu plików nie wymaga rekompilacji jądra ani dodawania nowych modułów

Wady FUSE

  • zmniejszona wydajność w stosunku systemów plików pisanych jako moduły jądra (spadek wydajności jest spowodowany redundantnym kopiowaniem danych oraz ciągłym przełączaniem się z trybu jądra do trybu użytkownika)

Budowa FUSE

System plików FUSE (jako całość) składa się z dwóch części:
  • Modułu jądra który przekierowuje wywołania komend operujących na systemie plików do biblioteki FUSE – która już działa w tzw. userspace.
  • Biblioteki (dynamicznie łączonej) która jest używana przez twórców nowych systemów plików
FUSE jako framework pozwala na łatwe zaimplementowanie funkcji systemu plików poprzez mechanizm callbacków. Funkcje tak zaimplementowane są wywoływane z trybu użytkownika przez bibliotekę FUSE i służą do wykonania działań na bardzo niskim poziomie, pozwala to na zachowanie dużej kontroli nad sposobem zapisu danych na urządeniu zewnętrznym. Biblioteka FUSE dostarcza API dla języków wysokiego poziomu takich jak C, Python, Perl, Java oraz innych Co jest warte podkreślenia biblioteka FUSE jest identyczna dla wszystkich implementacji co pozwala to na łatwe przenoszenie obsługi systemów plików do innych systemów operacyjnych bez konieczności zmiany kodu samej aplikacji.

Jak działa FUSE?

** Obrazek pochodzi ze strony: http://fuse.sourceforge.net/ i pokazuje on przebieg wywołania systemowego "stat" w bibliotece FUSE. By zrozumieć schemat działania FUSE wypadało by poświęcić na jego zrozumienie chwilkę.

Opis działania

  • Moduł jądra FUSE rejestruje się w systemie VFS (Virtual FileSystem)
  • Aby aplikacja "udająca system plików" mogła komunikować się z modułem jądra dostarczanym przez FUSE, muszą być spełnione następujące warunki:
    • Musi istnieć punkt do montowania w obecnym drzewie katalogów dla nowego systemu plików
    • Aplikacja powinna udostępniać metody pozwalające na wykonanie podstawowych operacji na plikach i katalogach (tworzenie katalogu, odczyt zawartości katalogu, odczyt pliku, zapis pliku, itp.)
  • Biblioteka FUSE dostarcza abstrakcji dla systemu operacyjnego pozwalając zamontować nasz system plików, wykonywane jest to przez uruchomienie procedury systemowej montowania (system operacyjny "wie", że będzie montował system plików typu "fuse")
  • Każde wywołanie systemowe uruchomione w drzewie katalogów jest przekazywane do VFS, a następnie do modułu jądra FUSE - jeżeli zachodzi taka potrzeba
  • Moduł jądra FUSE wywołuje funkcje biblioteczną z biblioteki FUSE, która jest odpowiedzialna za uruchomienie odpowiedniej procedury w aplikacji implementującej konkretny system plików

Komunikacja jądra z przestrzenią użytkownika

Mechanizm FUSE opiera swoje działanie na przesyłaniu wywołań systemowych z modułu jądra do biblioteki FUSE, oraz danych z biblioteki z powrotem do modułu jądra. Do komunikacji pomiędzy elementami systemu wykorzystywany jest deskryptor (plik: /dev/fuse), który jest otwierany podczas montowania każdego systemu plików. Plik taki może być otwarty wielokrotnie, a uzyskany w ten sposób deskryptor jest przesyłany do wywołania systemowego "mount". Po pomyślnym ustawieniu deskryptora moduł jądra FUSE – rejestruje się jako urządzenie znakowe.
Biblioteka FUSE działająca w przestrzeni użytkownika wykonuje funkcję odczytu blokującego w module jądra FUSE Dla każdego przychodzącego wywołania systemowego z VFS\index{VFS}, moduł jądra wysyła dane do modułu FUSE tym samym odblokowując wątek odczytujący w ten sposób "przesyłając" wywołanie VFS dalej Biblioteka FUSE zwraca dane dostarczone przez implementację systemu plików użytkownika. Odbywa się to przez wykonanie zapisu w module jądra (na deskryptorze). Moduł jądra zwraca otrzymane dane do VFS Dane są dostarczane aplikacji.
Rozwiązanie takie jest nieefektywne, ponieważ dane są wielokrotnie kopiowane – ale do chwili obecnej nie udało się wyeliminować tego problemu.

Ciekawsze systemy plików w FUSE

FUSE dzięki swoim unikalnym możliwością implementacji systemów plików w przestrzeni użytkownika pozwala na tworzenie bardzo zaawansowanych rozwiązań przechowywania danych, jednym z nich jest wykorzystanie serwisów internetowych jako "urządzeń" do przechowywania danych (FlickrFS, GmailFS, PicasaFS).
Wartymi odnotowania są też systemy plików SSHFS i FTPFS, a także RepoFS. System plików RepoFS jest o tyle ciekawy, że pozwala na integrację dowolnego systemu wersjonowania (SVN, CVS, GIT) – udostępniając tym samym prosty w użyciu interfejs. System działa w ten sposób, że mapuje zasoby umieszczone w repozytorium do systemu plików pozwalając tym samym na użycie dowolnych narzędzi do modyfikacji/przeglądania zawartości plików, które nadal znajdują się tylko na zdalnym systemie. Wszystkie wywołania systemowe są odpowiednio tłumaczone na odpowiadające im funkcje w systemach kontroli wersji.

Bootowanie systemu za pomocą HTTP-FUSE

HTTP-FUSE jest internetowym systemem bootowania systemu wykorzystywanym przez dystrybucje Linuxa na konsolach Sony Playstation 3. Całość jest oparta o inteligentny system bootowania Kboot oraz dysk wirtualny "HTTP-FUSE Loop" który pozwala na pobranie jądra systemu operacyjnego oraz minimalnego środowiska (tzw. miniroot) wprost z serwera HTTP. Taka konfiguracja może być wykorzystana na dowolnym systemie komputerowym - wystarczy by była karta sieciowa obsługiwana przez Kboot. Dzięki temu do rozpoczęcia odzyskiwania danych użytkownik nie potrzebuje żadnego nośnika danych, a minimalny system ratunkowy może być uruchomiony "wprost z internetu" oraz może zostać rozpoczęte odtwarzanie danych. Jest to o tyle ciekawe rozwiązanie, że można przygotować wiele obrazów dysków (z różnymi narzędziami) z których można odtwarzać system.

Implementacja własnego systemu plików

Implementacja systemu plików z wykorzystaniem biblioteki FUSE sprowadza się do wykonania następujących czynności:
  • Najpierw należy stworzyć implementację dla każdej wymaganej przez system plików metody
  • Interfejs tych metod jest zdefiniowany w bibliotece FUSE (sygnatury metod)
  • Następnie należy "dołączyć" się ze swoją implementacją do biblioteki FUSE poprzez wywołanie funkcji głównej stanowiącej punkt rozpoczęcia, a także należy przypisać wskaźniki do zaimplementowanych funkcji/metod odpowiedzialnych za podstawowe funkcje systemu plików (ale czy tego nie zrobi sama funkcja?).

Dodatkowe informacje

No comments:

Post a Comment