Tak, systemy plików w systemie Linux mogą być implementowane jako moduły jądra. Ale istnieje również interfejs FUSE (system plików w USErspace), który może pozwolić zwykłemu procesowi przestrzeni użytkownika działać jako sterownik systemu plików. Jeśli prototypujesz nowy system plików, jego wdrożenie za pomocą interfejsu FUSE może ułatwić testowanie i rozwój. Gdy elementy wewnętrzne systemu plików zostaną opracowane w formie FUSE, możesz rozpocząć wdrażanie zoptymalizowanej pod kątem wydajności wersji modułu jądra.
Oto kilka podstawowych informacji na temat implementacji systemu plików w przestrzeni jądra. Jest raczej stary (od 1996 roku!), Ale powinien przynajmniej dać ci podstawowy pomysł na rzeczy, które musisz zrobić.
Jeśli zdecydujesz się przejść na trasę FUSE, oto libfuse, referencyjna implementacja strony przestrzeni użytkownika interfejsu FUSE.
Sterownik systemu plików jako moduł jądra
Zasadniczo funkcja inicjalizacji modułu sterownika systemu plików musi tylko wywołać register_filesystem()
funkcję i nadać jej jako parametr strukturę zawierającą wskaźnik funkcji, który identyfikuje funkcję w sterowniku systemu plików, która będzie używana jako pierwszy krok w identyfikacji systemu plików wpisz i zamontuj go. Na tym etapie nic więcej się nie dzieje.
Kiedy system plików jest montowany i albo typ systemu plików jest określony, aby pasował do sterownika, lub wykonywane jest automatyczne wykrywanie typu systemu plików, warstwa wirtualnego systemu plików jądra (w skrócie VFS) wywoła tę funkcję. Mówi w zasadzie: „Oto wskaźnik do reprezentacji standardowego urządzenia blokowego systemu Linux na poziomie jądra. Spójrz na to, sprawdź, czy możesz to obsłużyć, a następnie powiedz mi, co możesz z tym zrobić”.
W tym momencie sterownik powinien przeczytać wszystko, czego potrzebuje, aby sprawdzić, czy jest odpowiedni sterownik dla systemu plików, a następnie zwrócić strukturę zawierającą wskaźniki do dalszych funkcji, które sterownik może wykonywać w tym konkretnym systemie plików. Lub jeśli sterownik systemu plików nie rozpoznaje danych na dysku, powinien zwrócić odpowiedni wynik błędu, a następnie VFS zgłosi awarię do przestrzeni użytkownika lub - jeśli wykonywane jest automatyczne wykrywanie typu systemu plików - zapyta inny system plików sterownik, aby spróbować.
Pozostałe sterowniki w jądrze zapewnią standardowy interfejs urządzenia blokowego, więc sterownik systemu plików nie będzie musiał implementować obsługi sprzętowej. Zasadniczo sterownik systemu plików może odczytywać i zapisywać bloki dyskowe przy użyciu standardowych funkcji na poziomie jądra z podanym wskaźnikiem urządzenia.
Warstwa VFS oczekuje, że sterownik systemu plików udostępni szereg standardowych funkcji dla warstwy VFS; niektóre z nich są obowiązkowe, aby warstwa VFS mogła zrobić coś sensownego z systemem plików, inne są opcjonalne i możesz po prostu zwrócić NULL zamiast wskaźnika do takiej opcjonalnej funkcji.
Tak, sterownik jądra może zarządzać systemem plików.
Najlepszym rozwiązaniem do wykonania makiety, prototypowania systemu plików jest użycie FUSE. Po pomyśleniu o przekształceniu go w sterownik jądra.
Wikipedia => https://en.wikipedia.org/wiki/Filesystem_in_Userspace
Źródło => https://github.com/libfuse/libfuse
samouczek => https://developer.ibm.com/articles/l-fuse/
źródło
Tak, zwykle odbywa się to za pomocą sterownika jądra, który można załadować jako moduł jądra lub skompilować w jądrze.
Możesz sprawdzić podobnych sterowniki systemu plików i jak one działają tutaj .
Sterowniki te prawdopodobnie używają wewnętrznych funkcji jądra, aby uzyskać dostęp do urządzeń pamięci jako bloków bajtów, ale można również użyć urządzeń blokowych, które są widoczne dla sterowników w urządzeniach blokowych i folderach urządzeń znakowych .
źródło
Możesz użyć bezpiecznika, aby utworzyć system plików użytkownika lub napisać moduł jądra. Łatwiej jest to zrobić z bezpiecznikiem, ponieważ masz wybór języków i nie spowoduje awarii jądra (a zatem całego systemu).
Moduły jądra mogą być szybsze, ale pierwszą zasadą optymalizacji jest: Nie rób tego, dopóki nie przetestujesz działającego kodu. Drugi jest podobny: nie rób tego, dopóki nie masz dowodów, że jest zbyt wolny. I po trzecie: nie przechowuj go, chyba że masz dowody, że czyni to szybciej / mniejszym.
I tak, jądro ma już sterowniki sprzętu, nie wdrażasz ich ponownie.
źródło
pivot_root
, ponieważ nadal są zajęte i-węzły w initramfs./init
uruchamiane z initramfs będzie (myślę)/init
działać po proot_root, aby przenieść kontrolę do prawdziwych root FS/init
. Ale plik binarny FUSE nie może zastąpić się execve, jeśli dostęp do głównego systemu FS zależy od procesu FUSE odpowiadającego na jądro. Cóż, może najpierw przygotowując pamięć podręczną, ale to nie brzmi wiarygodnie.