Czy jądro Linux potrzebuje systemu plików do działania?

19

Moim zdaniem tak, ponieważ tak, ponieważ wszelka użyteczna ekspozycja na świat zewnętrzny (nieuprzywilejowany tryb procesora) wymagałaby najpierw procesu działającego w świecie zewnętrznym. Wymagałoby to systemu plików, nawet tymczasowego systemu plików w pamięci RAM.

Inny inżynier nie zgadza się ze mną, ale nie mogę tego udowodnić poza wszystkimi (nieznanymi mi) przypadkami.

Czy odpowiedź na to pytanie zależy od definicji „biegania”?

Peter L.
źródło
4
myślę, że działające jądro nie „wymaga”useful exposure to the outside world
jsotola
19
Przywodzi na myśl starą zaporę ogniową Linuksa (około 2002)
Jeff Schaller
1
Jeśli dodasz nowy kod do jądra, możesz zrobić wszystko. Jeśli nie możesz, zainicjuje się do momentu, w którym spróbuje uruchomić init(pierwszy proces przestrzeni użytkownika), a to się nie powiedzie.
user253751
1
Zdefiniuj „bieg” ...
Thorbjørn Ravn Andersen
Czytaj system operacyjny: trzy łatwe elementy
Basile Starynkevitch

Odpowiedzi:

27

To raczej dziwne pytanie, ponieważ nie uruchamiasz jądra tak, jak uruchamiasz program. Jądro jest platformą do uruchamiania programów. Oczywiście istnieje kod konfiguracji i zamykania systemu, ale nie jest możliwe samodzielne uruchomienie jądra. Zawsze musi istnieć główny proces „init”. Jądro wpadnie w panikę, jeśli go nie będzie. Jeśli init spróbuje wyjść z jądra, również wpadnie w panikę.

Obecnie proces inicjowania przypomina systemd. Jeśli nie podano inaczej, jądro spróbuje uruchomić program z listy lokalizacji zaczynającej się od /sbin/init. Zobacz init Param tutaj http://man7.org/linux/man-pages/man7/bootparam.7.html w sytuacji awaryjnej, z którą możesz uruchomić Linuksa init=/bin/bash. Zauważ jednak, że zawsze określasz plik w systemie plików, który chcesz uruchomić.

Jądro wpadnie w panikę, jeśli się uruchomi, i nie ma systemu plików, ponieważ bez niego nie ma sposobu na załadowanie init.

Pewne zamieszanie może wynikać z sytuacji kurczaka i jaja, w której jądro musi załadować sterowniki, aby uzyskać dostęp do swojego systemu plików. Aby obejść ten problem, początkowy ramdysk jest ładowany z obrazu na dysku zawierającym niezbędne sterowniki i skrypty instalacyjne. Są one wykonywane przed załadowaniem systemu plików. Ale nie pomylcie się, początkowy ramdysk sam jest systemem plików. Z początkowego ramdysku /initjest wywoływany (który jest przechowywany na początkowym ramdysku). W wielu dystrybucjach to właśnie wzywa /sbin/init. Ponownie bez systemu plików jest to niemożliwe.

Philip Couling
źródło
Czy nie istnieje warunek, w którym jądro rezygnuje z próby zainicjowania sprzętu i załadowania znanego systemu plików (nie initrd przekazany do jądra przez parametry init), a następnie spada do bardzo ograniczonej powłoki (bez init = / bin / bash)? Ponadto, skoro uruchamiasz / bin / bash, czy jądro zawsze ma dostępny minimalny system plików, nawet jeśli zostałby zbudowany z innymi opcjami .config, które potencjalnie mogłyby to wyeliminować?
Peter L.
1
@PeterL. tą powłoką graniczną jest jakaś powłoka z initrd / initramfs / cokolwiek, co jądro uruchomiło, IIRC.
muru
3
Zauważ, że możesz zbudować initramfs (archiwum CPIO, które jest rozpakowywane do systemu plików ramfs lub tmpfs) w jądrze. To, czy liczy się to, że jądro „potrzebuje systemu plików”, zależy od ciebie, ponieważ oznacza to, że możesz uruchomić jądro i tylko jądro i mieć funkcjonalny (choć nieco ograniczony) system. Zauważ też, że nawet jeśli załatałeś jądro, aby nie wymagało już init, nadal będzie tworzyć wewnętrzne wirtualne systemy plików, które nigdy nie zostaną ujawnione.
las
@forest System nie musi być „ograniczony” - możesz spakować systemd i gnome do swojego initrd (razem z rzeczami, które są naprawdę przydatne ;-)). Jednym z ograniczeń initramfs był (nadal jest?), Że nie było wspieranie rozszerzonych atrybutów - I zrobił to obejść na android poprzez włączenie obrazu ext4 w initrd archiwum cpio który następnie zamontowany jako urządzenie pętli ze init.$DEV.rcskryptu.
Wujek Billy
1
@ IsmaelMiguel, nie, initramfs jako takie jest archiwum CPIO. Squashfs jest dobrym wyborem dla osadzonych systemów plików i można zrobić initrd (w porównaniu z initramfs), który go używa (terminy są często używane zamiennie, ale to nie jest to samo), ale nie jest to format, w którym Linux rozpakowuje swoje pliki initramfs. (Rzeczywiście, obraz squashfs nie musi być rozpakowywany, zanim będzie mógł być w ogóle użyty; jest właściwie indeksowany).
Charles Duffy
16

Odpowiedź będzie zależeć od tego, czy masz na myśli dosłownie bez systemu plików, czy też pytanie ma być interpretowane nieco inaczej niż to, co zostało powiedziane. Odpowiedzi na niewielkie różnice w interpretacji pytania są następujące:

  • Uruchamianie Linuksa bez żadnych urządzeń blokowych jest całkowicie wykonalne i przydatne w niektórych wyspecjalizowanych przypadkach użycia.
  • Uruchamianie Linuksa bez systemu plików wymaga przepisania niektórych części kodu jądra i jest mało prawdopodobne, aby był to użyteczny wysiłek.
  • Uruchamianie Linuksa bez deskryptorów plików będzie wymagało dużego wysiłku. Jestem pewien, że to nie będzie warte wysiłku.

Powody, dla których musisz przepisać części kodu jądra, aby działający system bez systemu plików to:

  • Każdy wątek ma katalog główny i bieżący katalog roboczy, który musi wskazywać na jakiś system plików.
  • Programy są uruchamiane przez execvewywołanie systemowe, które wymaga pliku wykonywalnego z systemu plików.
  • Jądro tworzy system plików oparty na pamięci podczas procesu uruchamiania.

Po uruchomieniu programu execvemożliwe jest usunięcie mapowania pliku wykonywalnego, z którego został uruchomiony, ale aby to zrobić bez natychmiastowego awarii, najpierw należy utworzyć mapowanie pamięci wykonywalnej, które nie jest zabezpieczone przez plik, i musi zainicjować to pewnym użytecznym kodem przed przejściem do niego i odmapowaniem pliku wykonywalnego.

Tak więc działający program w trybie użytkownika może istnieć w stanie, w którym nie ma mapowań pamięci wspieranych przez pliki i może zamykać wszystkie deskryptory plików wspierane przez pliki. Nie może przestać mieć katalogu głównego i bieżącego katalogu roboczego, ale może się od nich powstrzymać.

Więc chociaż w tym stanie można zaimplementować kod jądra, aby zgrać system plików spod programu i nadal go uruchamiać, nie brzmi to tak, jakby było przydatne. A wejście w ten stan końcowy bez przechodzenia przez stan pośredni korzystania z systemu plików będzie jeszcze więcej pracy bez żadnej pożytecznej korzyści.

Przydatna konfiguracja dla niektórych specjalistycznych przypadków użycia

Przydatne może być unikanie korzystania z urządzeń blokowych. Podczas uruchamiania jądro tworzy system plików pamięci i może również zapełnić ten system plików zawartością cpioarchiwum przed uruchomieniem init. W ten sposób możesz uruchomić system w całości z systemu plików opartego na pamięci, bez żadnego urządzenia blokującego, które by go wspierało.

Może to być przydatne w systemach, w których nie chcesz zachować żadnego stanu i na przykład, gdy system uruchamia się z czystej listy po ponownym uruchomieniu.

Oczywiście jądro i archiwum cpio muszą jakoś istnieć w pamięci, zanim jądro przejmie kontrolę. Jak się tam dostali, jest zadanie dla modułu ładującego. Program ładujący mógł załadować je z urządzenia blokowego, nawet jeśli końcowy system nie używa urządzeń blokowych. Ale moduł ładujący może również uzyskać jądro i archiwum cpio bez użycia urządzenia blokowego, na przykład poprzez rozruch przez sieć.

kasperd
źródło
1
Pytanie brzmi, czy jądro Linuksa w dowolnej wbudowanej konfiguracji (bez ponownego zapisywania czegokolwiek) może „działać” bez żadnego systemu plików. Nie musi robić nic pożytecznego ani utrzymywać stanu. Ze wszystkich odpowiedzi rozumiem, że jakiś system plików jest zapewniony i przyjęty w samym jądrze, przynajmniej do momentu zamknięcia. Nawet „/” to system plików. Myślę więc, że upraszczając odpowiedź brzmi „tak”.
Peter L.
2
@PeterL. Tak, jeśli niczego nie przepisujesz, Linux będzie wymagał systemu plików. Gdy ludzie mówią o praktycznych zastosowaniach w systemie Linux bez systemu plików, zwykle odnoszą się do tych, które są wspierane przez urządzenie blokowe i można uruchomić system Linux bez systemu plików wspieranego przez urządzenie blokowe. Nadal miałbyś jakiś system plików.
kasperd
3

W Linuksie prawie każde urządzenie jest plikiem , więc musisz mieć system plików, aby go uruchomić.

K7AAY
źródło
8
Ale oczywiście sterowniki urządzeń istnieją w jądrze, niezależnie od tego, czy plik urządzenia wskazuje na nie.
Philip Couling
6
Nie każde urządzenie jest plikiem. Interfejsy sieciowe ( eth0, wlan0etc.) nie są, na przykład.
Ruslan
1
Jest to powszechne nieporozumienie. Choć teoretycznie wszystko jest plikiem w systemach UNIX i systemach podobnych do UNIX, jest to całkowicie prawdziwe tylko w przypadku wysoce wyspecjalizowanych systemów, takich jak Plan 9 (choć jest to o wiele bardziej prawdziwe niż w przypadku systemu Windows). W systemie Linux wiele rzeczy nie jest plikami. Staje się to coraz bardziej prawdziwe, ponieważ wiele sterowników zaczęło używać netlink zamiast ioctls na urządzeniach znakowych (które plikami).
las
@forest Plan 9 nie jest systemem „wysoce wyspecjalizowanym” - miał być systemem ogólnego przeznaczenia, takim jak Unix lub Windows (dlaczego nie udało się go zastąpić i pozostał systemem badawczym, to zupełnie inna historia). W każdym razie, podobnie jak Linux, plan9 udostępnia zwirtualizowane interfejsy sprzętowi (i nie ma żadnych ioctlów - nie rozumiem, w jaki sposób w tym wszystkim stosuje się netlink vs. ioctls), nawet jeśli stara się być bardziej spójny (np. interfejsy sieciowe są dostępne za pośrednictwem systemu plików). Wraz z wprowadzeniem przestrzeni nazw Linux jest już bardziej podobny do plan9 niż klasyczny unix.
Wujek Billy
1
Bardzo fajny argument: albo istnieje devfs, który jest systemem plików zgodnie z definicją, albo nie ma devfs, w którym to przypadku potrzebujesz systemu plików do hostowania węzłów urządzeń ...
pmf
-1

Jądro JEST programem, tak jak każdy inny. Domyślnie jądro Linux próbuje uzyskać dostęp do systemu plików, jednak zachowanie to można w trywialny sposób wyeliminować poprzez modyfikację jądra (w rzeczywistości jedynie dodanie funkcji „arch_call_rest_init ()”). W celu wykonania „użytecznej pracy” spodziewamy się, że programista może uwzględnić wątki jądra (kthreads), perhapos w niestandardowym sterowniku, aby wykonać pewne pożądane obciążenie związane z inicjalizacją i typem aplikacji. Jądro Linux zawiera już wiele wątków, ale przede wszystkim do wykonywania prac pomocniczych w stosunku do jądra lub sterowników. Interfejsy API dostępne w kontekście jądra są zupełnie inne niż interfejsy dostępne w przestrzeni użytkownika systemu Linux. Duża część funkcji wywołań systemowych stałaby się bezużyteczna w scenariuszu braku systemu plików.

Tak, Linux domyślnie oczekuje dostępu do systemów plików. Nie, zmodyfikowane jądro z pewnością mogłoby zostać wykonane w celu wykonywania użytecznej pracy bez jakiegokolwiek systemu plików. Praktyczne wykorzystanie systemu plików Linux bez systemu IMO jest dość ograniczone, ale nie ma go wcale. FWIW, w przeszłości wiele jąder czasu rzeczywistego było wbudowanych w tę samą przestrzeń nazw i pliki binarne, co aplikacje RT.

Stevea
źródło