Benötigt der Linux-Kernel ein Dateisystem zum Ausführen?

19

Meiner Meinung nach ist dies der Fall, da für jede nützliche Exposition gegenüber der Außenwelt (nicht privilegierter Prozessormodus) zunächst ein Prozess erforderlich ist, der in der Außenwelt ausgeführt wird. Das würde ein Dateisystem erfordern, sogar ein temporäres In-RAM-Dateisystem.

Ein anderer Ingenieur ist nicht mit mir einverstanden, aber ich kann das scheinbar nicht in allen mir unbekannten Fällen beweisen.

Hängt die Antwort auf diese Frage von der Definition von "Laufen" ab?

Peter L.
quelle
4
Ich denke, dass ein laufender Kernel nicht "erfordert"useful exposure to the outside world
jsotola
19
Erinnert an die alte angehaltene Linux-Firewall (ca. 2002)
Jeff Schaller
1
Wenn Sie dem Kernel neuen Code hinzufügen, können Sie alles tun. Wenn Sie dies nicht können, wird es ordnungsgemäß bis zu dem Punkt initialisiert, an dem es versucht, ausgeführt zu werden init(der erste User-Space-Prozess), und das wird fehlschlagen.
user253751
1
Definieren Sie "run" ...
Thorbjørn Ravn Andersen
Lesen Sie das Betriebssystem: drei einfache Stücke
Basile Starynkevitch

Antworten:

27

Das ist eine seltsame Frage, weil Sie den Kernel nicht so ausführen, wie Sie ein Programm ausführen. Der Kernel ist eine Plattform, auf der Programme ausgeführt werden können. Natürlich gibt es Setup- und Shutdown-Code, aber es ist nicht möglich, den Kernel selbst auszuführen. Es muss immer einen Hauptprozess "init" geben. Und der Kernel wird in Panik geraten, wenn er nicht da ist. Wenn init versucht, den Kernel zu verlassen, kommt dies ebenfalls in Panik.

In diesen Tagen ist der Init-Prozess so etwas wie systemd. Wenn nicht anders angegeben, versucht der Kernel, ein Programm von einer Liste von Speicherorten aus auszuführen, die mit beginnen /sbin/init. Den Init-Parameter finden Sie hier: http://man7.org/linux/man-pages/man7/bootparam.7.html Im Notfall können Sie mit Linux booten init=/bin/bash. Beachten Sie jedoch, dass Sie immer eine Datei im Dateisystem angeben, die ausgeführt werden soll.

Der Kernel gerät in Panik, wenn er startet und kein Dateisystem hat, weil es ohne ein solches keine Möglichkeit gibt, init zu laden.

Einige Verwirrung kann aufgrund einer Henne-Ei-Situation entstehen, in der der Kernel Treiber laden muss, um auf sein Dateisystem zuzugreifen. Um dies zu umgehen, wird eine erste RAM-Disk von einem Image auf der Festplatte geladen, das wichtige Treiber und Setup-Skripte enthält. Diese werden ausgeführt, bevor das Dateisystem geladen wird. Aber machen Sie keinen Fehler, die ursprüngliche Ramdisk ist selbst ein Dateisystem. Mit wird eine initiale Ramdisk /initaufgerufen (die auf der initialen Ramdisk gespeichert ist). In vielen Distributionen ist es letztendlich das, was anruft /sbin/init. Auch dies ist ohne ein Dateisystem nicht möglich.

Philip Couling
quelle
Gibt es nicht einen Zustand, in dem der Kernel aufgibt, die Hardware zu initialisieren und ein bekanntes Dateisystem zu laden (nicht initrd über init-Parameter an den Kernel übergeben) und dann in eine sehr eingeschränkte Shell fällt (ohne init = / bin / bash)? Hätte der Kernel, seit Sie / bin / bash aufrufen, immer das minimale Dateisystem zur Verfügung, selbst wenn es mit anderen .config-Optionen erstellt wurde, die dies möglicherweise beseitigen könnten?
Peter L.
1
@PeterL. Diese Limit-Shell ist eine Shell von initrd / initramfs /, mit welcher auch immer der Kernel gebootet hat, IIRC.
muru
3
Beachten Sie, dass Sie die initramfs bauen kann (ein cpio - Archiv , das in ein ramfs oder tmpfs Dateisystem extrahiert wird) in den Kernel. Es liegt an Ihnen, ob der Kernel "ein Dateisystem benötigt" oder nicht, da dies bedeutet, dass Sie den Kernel und nur den Kernel booten und ein funktionsfähiges (wenn auch etwas eingeschränktes) System haben können. Beachten Sie auch, dass, selbst wenn Sie den Kernel so patchen, dass kein Init mehr erforderlich ist, interne virtuelle Dateisysteme erstellt werden, die niemals verfügbar gemacht werden.
Wald
@forest Das System muss nicht "beschränkt" sein - du kannst systemd und gnome in deine initrd packen (zusammen mit Dingen, die eigentlich nützlich sind ;-)). Eine Einschränkung von initramfs war (ist es immer noch?), Dass es keine erweiterten Attribute unterstützt. Ich habe es auf Android umgangen, indem ich ein ext4-Image in das initrd cpio-Archiv aufgenommen habe, das dann als Loop-Device aus dem init.$DEV.rcSkript bereitgestellt wurde.
Onkel Billy
1
@IsmaelMiguel, nein, ein initramfs als solches ist ein cpio-Archiv. Squashfs ist eine gute Wahl für eingebettete Dateisysteme, und man könnte eine initrd (im Gegensatz zu einer initramfs) erstellen, die es verwendet (die Begriffe werden oft synonym verwendet, aber sie sind nicht ganz dasselbe), aber es ist nicht das Format, in das Linux entpackt initramfs. (In der Tat muss ein Squashfs-Image nicht entpackt werden, bevor es überhaupt verwendet werden kann; es ist ordnungsgemäß indiziert).
Charles Duffy
16

Die Antwort wird davon abhängen, ob Sie wörtlich ohne Dateisystem meinen oder ob die Frage ein wenig anders interpretiert werden soll, als es tatsächlich heißt. Die Antworten für geringfügige Abweichungen in der Interpretation der Frage lauten:

  • Das Ausführen von Linux ohne Block-Geräte ist für einige spezielle Anwendungsfälle durchaus machbar und nützlich.
  • Wenn Sie Linux ohne Dateisystem ausführen, müssen Sie einige Teile des Kernel-Codes neu schreiben, und es ist unwahrscheinlich, dass dies eine sinnvolle Anstrengung ist.
  • Das Ausführen von Linux ohne Dateideskriptoren ist sehr aufwändig. Ich bin mir ziemlich sicher, dass sich die Mühe nicht lohnt.

Die Gründe, warum Sie Teile des Kernel-Codes neu schreiben müssten, um ein funktionierendes System ohne Dateisystem zu erhalten, sind:

  • Jeder Thread hat ein Stammverzeichnis und ein aktuelles Arbeitsverzeichnis, das auf ein Dateisystem verweisen muss.
  • Programme werden durch den execveSystemaufruf gestartet, der eine ausführbare Datei aus einem Dateisystem benötigt.
  • Der Kernel erstellt während des Startvorgangs ein speicherbasiertes Dateisystem.

Nachdem ein Programm gestartet wurde, execvekann es die Zuordnung der ausführbaren Datei aufheben, von der es gestartet wurde. Dazu muss jedoch ohne sofortigen Absturz eine ausführbare Speicherzuordnung erstellt werden, die nicht durch eine Datei gesichert ist. und es muss das mit etwas nützlichem Code initialisieren, bevor es dorthin springt und die ausführbare Datei abbildet.

Auf diese Weise kann ein laufendes Benutzermodusprogramm in einem Zustand existieren, in dem keine von Dateien gesicherten Speicherzuordnungen vorhanden sind, und es kann alle von Dateien gesicherten Dateideskriptoren schließen. Es kann nicht aufhören, ein Stammverzeichnis und ein aktuelles Arbeitsverzeichnis zu haben, aber es kann davon Abstand nehmen.

Obwohl Sie in diesem Zustand Kernel-Code implementieren könnten, um das Dateisystem aus dem Programm zu entfernen und es weiter laufen zu lassen, hört es sich nicht so an, als wäre es nützlich. Und in diesen Endzustand zu gelangen, ohne einen Zwischenzustand der Verwendung eines Dateisystems zu durchlaufen, wird noch mehr Arbeit bedeuten und keinen nützlichen Nutzen bringen.

Ein nützliches Setup für einige spezielle Anwendungsfälle

Das Vermeiden der Verwendung von Blockgeräten kann nützlich sein. Während des Startvorgangs erstellt der Kernel ein Speicherdateisystem und kann dieses Dateisystem cpiovor der Ausführung mit Inhalten aus einem Archiv füllen init. Auf diese Weise können Sie ein System vollständig von einem speicherbasierten Dateisystem ausführen, ohne dass ein Blockgerät für die Sicherung erforderlich ist.

Dies kann für Systeme nützlich sein, bei denen Sie keinen Status beibehalten möchten und das System beim Neustart von einem sauberen Stand aus starten soll.

Natürlich müssen der Kernel und das cpio-Archiv irgendwie im Speicher vorhanden sein, bevor der Kernel die Kontrolle erhält. Wie sie dorthin kamen, ist eine Aufgabe für den Bootloader. Der Bootloader könnte diese von einem Blockgerät geladen haben, obwohl das endgültig ausgeführte System keine Blockgeräte verwendet. Es ist aber auch möglich, dass der Bootloader das Kernel- und das cpio-Archiv ohne Verwendung eines Blockgeräts abruft, indem er beispielsweise über das Netzwerk bootet.

Kasperd
quelle
1
Die Frage ist, ob ein Linux-Kernel in einer beliebigen erstellten Konfiguration (ohne dass etwas neu geschrieben werden muss) ohne Dateisystem ausgeführt werden kann. Es muss nichts Nützliches tun oder einen Zustand bewahren. Aus all den Antworten geht hervor, dass im Kernel selbst eine Art Dateisystem bereitgestellt und angenommen wird, zumindest bis zum Herunterfahren. Sogar '/' ist ein Dateisystem. Ich denke also, um die Antwort zu vereinfachen: Ja.
Peter L.
2
@PeterL. Ja, wenn Sie nichts umschreiben, ist für Linux ein Dateisystem erforderlich. Wenn Leute über praktische Anwendungen für Linux ohne Dateisystem sprechen, beziehen sie sich normalerweise auf diejenigen, die von einem Blockgerät unterstützt werden, und Sie können Linux ohne ein Dateisystem ausführen, das von einem Blockgerät unterstützt wird. Sie würden immer noch eine Art Dateisystem haben.
Kasperd
3

In Linux ist fast jedes Gerät eine Datei . Sie müssen also über ein Dateisystem verfügen, um es ausführen zu können.

K7AAY
quelle
8
Natürlich sind die Gerätetreiber im Kernel vorhanden, unabhängig davon, ob eine Gerätedatei auf sie verweist oder nicht.
Philip
6
Nicht jedes Gerät ist eine Datei. Netzwerkschnittstellen ( eth0, wlan0etc.) sind zum Beispiel nicht.
Ruslan
1
Dies ist ein weit verbreitetes Missverständnis. Während in UNIX- und UNIX-ähnlichen Systemen theoretisch alles eine Datei ist, gilt dies nur für hochspezialisierte Systeme wie Plan 9 (obwohl dies weitaus mehr gilt als für Windows). Unter Linux sind viele Dinge keine Dateien. Dies wird immer wahrer, da viele Treiber begonnen haben, Netlink anstelle von Ioctls auf Zeichengeräten (bei denen es sich um Dateien handelt) zu verwenden.
Wald
@forest Plan 9 ist kein "hoch spezialisiertes" System - es sollte ein Allzwecksystem wie Unix oder Windows sein (warum es Unix nicht ersetzte und ein Forschungssystem blieb, ist eine ganz andere Geschichte). Wie auch immer, genau wie Linux macht plan9 virtualisierte Schnittstellen für seine Hardware verfügbar (und hat keine Ioctls - ich verstehe nicht, wie man den Faktor Netlink vs. Auf die Netzwerkschnittstellen kann über das Dateisystem zugegriffen werden. Mit der Einführung von Namespaces ähnelt Linux bereits eher Plan9 als klassischem Unix.
Onkel Billy
1
Sehr nettes Argument: Entweder gibt es devfs, ein Dateisystem per Definition, oder es gibt kein devfs. In diesem Fall benötigen Sie ein Dateisystem, um Geräteknoten zu hosten ...
pmf
-1

Ein Kernel IST ein Programm, genau wie jedes andere. Standardmäßig versucht der Linux-Kernel, auf das Dateisystem zuzugreifen. Dieses Verhalten kann jedoch durch eine Kernel-Änderung (eigentlich nur durch Hinzufügen einer Funktion "arch_call_rest_init ()") trivial beseitigt werden. Um "nützliche Arbeit" zu leisten, ist zu erwarten, dass der Entwickler Kernel-Threads (kthreads), perhapos, in einen benutzerdefinierten Treiber einbindet, um die gewünschte Initialisierungs- und Anwendungstyp-Arbeitslast auszuführen. Der Linux-Kernel enthält bereits viele kthreads, die jedoch in erster Linie für die Ausführung von Arbeiten neben dem Kernel oder den Treibern vorgesehen sind. Die im Kernel-Kontext verfügbaren APIs unterscheiden sich erheblich von denen im Linux-User-Space. Ein großer Teil der Funktionen für Systemaufrufe würde in einem Szenario ohne Dateisystem unbrauchbar werden.

Ja, Linux erwartet standardmäßig Zugriff auf Dateisysteme. Nein, ein modifizierter Kernel könnte sicherlich dazu gebracht werden, ohne Dateisystem nützliche Arbeit zu leisten. Die praktische Verwendung von Linux ohne Dateisystem ist IMO recht begrenzt, aber nicht gleich Null. FWIW, in der Vergangenheit wurden viele Echtzeit-Kernel in denselben Namensraum und Binärcode wie die RT-Anwendungen eingebaut.

Stevea
quelle