it-swarm.com.de

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

Meine Meinung ist ja, das tut es, weil jede nützliche Exposition gegenüber der Außenwelt (nicht privilegierter Prozessormodus) zuerst einen Prozess erfordern würde, der in der Außenwelt ausgeführt wird. Dies würde ein Dateisystem erfordern, sogar ein temporäres In-RAM-Dateisystem.

Ein anderer Ingenieur ist mit mir nicht einverstanden, aber ich kann dies nicht über alle (mir unbekannten) Fälle hinaus beweisen.

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

20
Peter L.

Das ist eine seltsame Frage, da Sie den Kernel nicht wie 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 alleine 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, gerät er ebenfalls in Panik.

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

Der Kernel gerät also in Panik, wenn er gestartet wird und kein Dateisystem hat, da es ohne eines 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 Ramdisk 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 einer anfänglichen Ramdisk wird /init Aufgerufen (die auf der anfänglichen Ramdisk gespeichert ist). In vielen Distributionen ist es letztendlich das, was /sbin/init Aufruft. Auch dies ist ohne ein Dateisystem nicht möglich.

28
Philip Couling

Die Antwort hängt davon ab, ob Sie wörtlich ohne Dateisystem meinen oder ob die Frage ein wenig anders interpretiert werden soll als sie tatsächlich angegeben ist. Die Antworten für geringfügige Abweichungen bei der Interpretation der Frage lauten:

  • Das Ausführen von Linux ohne Blockgeräte ist für einige spezielle Anwendungsfälle durchaus machbar und nützlich.
  • Das Ausführen von Linux ohne Dateisystem erfordert das Umschreiben einiger Teile des Kernel-Codes und ist wahrscheinlich kein nützlicher Aufwand.
  • Das Ausführen von Linux ohne Verwendung von Dateideskriptoren erfordert viel Aufwand. 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 erstellen, sind:

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

Nachdem ein Programm mit execve gestartet wurde, kann es die Zuordnung der ausführbaren Datei aufheben, von der es gestartet wurde. Um dies jedoch ohne sofortigen Absturz zu tun, muss zunächst eine ausführbare Speicherzuordnung erstellt werden, die nicht ' Es wird von einer Datei unterstützt, und diese muss mit nützlichem Code initialisiert werden, bevor darauf gesprungen und die Zuordnung der ausführbaren Datei aufgehoben wird.

Somit kann ein laufendes Benutzermodusprogramm in einem Zustand existieren, in dem es keine durch Dateien gesicherten Speicherzuordnungen hat und alle durch Dateien gesicherten Dateideskriptoren schließen kann. Es kann nicht aufhören, ein Stammverzeichnis und ein aktuelles Arbeitsverzeichnis zu haben, aber es kann von diesen Abstand nehmen.

Obwohl Sie in diesem Zustand Kernel-Code implementieren könnten, um das Dateisystem unter dem Programm zu entfernen und es weiter laufen zu lassen, scheint es nicht nützlich zu sein. Und in diesen Endzustand zu gelangen, ohne einen Zwischenzustand der Verwendung eines Dateisystems zu durchlaufen, wird noch mehr Arbeit ohne nützlichen Nutzen bedeuten.

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 auch mit Inhalten aus einem cpio -Archiv füllen, bevor init ausgeführt wird. Auf diese Weise können Sie ein System vollständig von einem speicherbasierten Dateisystem aus ausführen, ohne dass ein Blockgerät vorhanden ist, um es zu sichern.

Dies kann für Systeme nützlich sein, bei denen Sie keinen Status beibehalten möchten und das System beim Neustart von einem sauberen Slate 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 ein Job für den Bootloader. Der Bootloader hätte diese von einem Blockgerät laden können, obwohl das endgültig ausgeführte System keine Blockgeräte verwendet. Es ist dem Bootloader aber auch möglich, das Kernel- und CPIO-Archiv abzurufen, ohne ein Blockgerät zu verwenden, beispielsweise durch Booten über das Netzwerk.

16
kasperd

Unter Linux ist fast jedes Gerät ist eine Datei , daher muss ein Dateisystem vorhanden sein, um es auszuführen.

3
K7AAY