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?
filesystems
linux-kernel
Peter L.
quelle
quelle
useful exposure to the outside world
init
(der erste User-Space-Prozess), und das wird fehlschlagen.Antworten:
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 booteninit=/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
/init
aufgerufen (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.quelle
init.$DEV.rc
Skript bereitgestellt wurde.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:
Die Gründe, warum Sie Teile des Kernel-Codes neu schreiben müssten, um ein funktionierendes System ohne Dateisystem zu erhalten, sind:
execve
Systemaufruf gestartet, der eine ausführbare Datei aus einem Dateisystem benötigt.Nachdem ein Programm gestartet wurde,
execve
kann 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
cpio
vor der Ausführung mit Inhalten aus einem Archiv fülleninit
. 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.
quelle
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.
quelle
eth0
,wlan0
etc.) sind zum Beispiel nicht.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.
quelle