Jak zaimplementować sterownik systemu plików w systemie Linux? [Zamknięte]

15

Załóżmy, że wynalazłem nowy system plików, a teraz chcę dla niego utworzyć sterownik systemu plików.

Jak mam zaimplementować ten sterownik systemu plików, czy jest to wykonywane przy użyciu modułu jądra?

I w jaki sposób sterownik systemu plików może uzyskać dostęp do dysku twardego, czy sterownik systemu plików powinien zawierać kod dostępu do dysku twardego, czy też Linux zawiera sterownik urządzenia umożliwiający dostęp do dysku twardego, z którego korzystają wszystkie sterowniki systemu plików?

użytkownik343344
źródło

Odpowiedzi:

24

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.

telcoM
źródło
1
Jest to dość dobra odpowiedź, aby w pełni odpowiedzieć na pytanie, jak powiedziano, należy również powiedzieć trochę o funkcjonalności warstwy urządzeń blokowych, na której opiera się warstwa systemu plików.
kasperd
Nawiązałem do tego trochę z bitem „tutaj jest wskaźnik do standardowego urządzenia blokowego”, ale dobra uwaga; Rozszerzyłem to.
telcoM
Ta odpowiedź, w szczególności opis tego, co dzieje się w jakiej kolejności, jest boska. Czy jest jakaś książka / strona, którą mógłbym przeczytać, która zawiera takie opisy dla wszystkich „jak działa Linux”?
Adam Barnes
Być może zainteresują Cię jądra systemu Linux lub sterowniki urządzeń Linux, wydanie trzecie . I oczywiście istnieje opcja odczytu rzeczywistego kodu źródłowego.
telcoM
0

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 .

Erik
źródło
0

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.

ctrl-alt-delor
źródło
FUSE ma poważne wady inne niż wydajność: ciężko go używać do głównego systemu plików. (Być może jest to możliwe przy initrd, ale plik binarny FUSE nie mógł zostać zwolniony po uruchomieniu, ponieważ nadal byłby uruchamiany z ramdysku.)
Peter Cordes
1
@PeterCordes Nie można go uwolnić , ale to nie znaczy, że nie można go odłączyć. Jeśli nadal istnieje odwołanie do niego, będzie ono przechowywane w pamięci niezależnie od tego, czy opuściłeś initramfs i usunąłeś plik binarny.
las
@forest: racja, dlatego nie można odmontować initrd po pivot_root, ponieważ nadal są zajęte i-węzły w initramfs.
Peter Cordes,
Normalne /inituruchamiane z initramfs będzie (myślę) /initdział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.
Peter Cordes,