Aktualisieren des Linux-Kernels, während der Rest des Systems unverändert bleibt

25

Ich bin ein OpenBSD-Benutzer. In den OpenBSD-FAQ heißt es:

OpenBSD ist ein komplettes System, das synchron gehalten werden soll. Es ist kein Kernel-Plus-Dienstprogramm, das separat voneinander aktualisiert werden kann.

Wenn Sie ein System aktualisieren, geschieht dies auf einmal. Der Kernel und das Basissystem werden ersetzt. Dann aktualisieren Sie Ihre Pakete von Drittanbietern . Wenn Sie aus dem Quellcode kompilieren, kompilieren Sie den Kernel erneut und starten ihn neu. Anschließend erstellen Sie das Basissystem und anschließend die installierten Pakete neu. Wenn seit der letzten Neuerstellung mehr als ein paar Wochen / Monate vergangen sind, installieren Sie zuerst einen Snapshot und erstellen ihn von dort aus neu (wenn Sie dem aktuellsten CVS-Zweig folgen).

Wenn Kernel, Basissystem und / oder Pakete von Drittanbietern nicht synchron sind, kann dies zu Problemen führen und Sie mehr oder weniger davon abhalten, ernsthafte Hilfe von den offiziellen Mailinglisten zu erhalten.

Ich bin damit einverstanden. Tatsächlich ist dies einer der Gründe, warum ich OpenBSD benutze. Es macht das System zu einer konsistenten Einheit und es erleichtert mir, mir einen mentalen Überblick darüber zu verschaffen.

Wie ist es unter Linux? Die meisten mir bekannten Linuxe haben kein "Basissystem" im gleichen Sinne wie die BSDs, sondern eine Sammlung von Paketen, die vom Distributionsanbieter zusammengestellt wurden. Dazu kommt dann von einem lokalen Administrator weitere Software, so dass die Grenze zwischen dem, was von Anfang an da war und dem, was später hinzugefügt wurde, bestenfalls verschwommen ist.

Hat Linux (im Allgemeinen) keine starke Kernel-User-Space-Kopplung? Der Kernel wird, soweit ich weiß, wie jedes andere Softwarepaket aktualisiert, und es verwirrt mich ein wenig, dass dies überhaupt möglich ist. Hinzu kommt, dass einige sogar benutzerdefinierte Kernel kompilieren (was unter OpenBSD nicht empfohlen wird) und in ihren Bootmenüs eine Vielzahl verschiedener Kernelversionen aufgelistet sind.

Wer oder was garantiert, dass die verschiedenen Subsysteme eines Linux-Systems miteinander kooperieren können, obwohl sie unabhängig voneinander aktualisiert werden?

Der Grund, den ich frage, ist, dass ein anderer Benutzer auf dieser Site mich gefragt hat, ob das Ersetzen des Kernels in seinem Linux-System durch eine neuere Version "machbar" wäre. Von der OpenBSD-Seite her kann ich nicht sagen, dass dies das System garantiert nicht kaputt macht.


Ich benutze "Linux" oben als Abkürzung für "Linux Distribution", Kernel + Utilities.

Kusalananda
quelle
Es ist eine andere Art zu sagen, dass OpenBSD nur eine einzige Distribution hat. Die mehreren Grub-Menüeinträge auf einem normalen Linux-System dienen dazu, auf einen früheren Kernel zurückzugreifen, falls der (normalerweise) neueste aus irgendeinem Grund nicht booten kann.
Thorbjørn Ravn Andersen

Antworten:

29

Linus Torvalds ist sehr stark gegen Kerneländerungen, die zu Regressionen des Benutzerraums führen (Details finden Sie in der Frage " Der Linux-Kernel: Brechen des Benutzerraums ").

Die Schnittstelle zwischen Benutzerbereich und Kernel wird durch Systemaufrufe bereitgestellt. Neuere Kernel können mehr Systemaufrufe und Änderungen an bestehenden Kerneln haben, wenn diese Änderungen bestehende Anwendungen nicht beeinträchtigen. Wenn eine Systemaufrufschnittstelle einen Flag-Parameter aufweist, stellen neue Kernel häufig die neue Funktionalität mit einem neuen Bit-Flag zur Verfügung. Auf diese Weise behält der Kernel die Abwärtskompatibilität zu alten Anwendungen bei.

Wenn es nicht möglich war, die vorhandene Benutzeroberfläche zu ändern, ohne den Benutzerbereich zu unterbrechen, wurden zusätzliche Systemaufrufe hinzugefügt, die die erweiterte Funktionalität bieten. Aus diesem Grund gibt es drei Versionen dupund zwei Versionen des umountSystemaufrufs.

Die Richtlinie für einen stabilen Userspace ist der Grund, warum Kernel-Updates selten Probleme in Userspace-Anwendungen verursachen und Sie im Allgemeinen keine Probleme nach dem Upgrade des Kernels erwarten.

Für Kernel- Interfaces und andere Implementierungsdetails kann jedoch nicht die gleiche API-Stabilität garantiert werden . Sysfs (on /sys) und procsfs (on /proc/) legen Details zur Kernel-Implementierung in Bezug auf Laufzeitkonfiguration, Hardware, Netzwerk, Prozesse usw. offen , die von Anwendungen auf niedriger Ebene verwendet werden. Es ist möglich, dass sich diese Schnittstellen zwischen Kernelversionen inkompatibel ändern, wenn es einen guten Grund dafür gibt. Nach wie vor wird versucht, Inkompatibilitäten so gering wie möglich zu halten, und es gibt Regeln dafür, wie Anwendungen die Schnittstellen so nutzen können, dass Probleme mit der geringsten Wahrscheinlichkeit auftreten. Die Auswirkungen sind ebenfalls begrenzt, da nicht-Low-Level-Anwendungen diese Schnittstellen nicht verwenden sollten.

@PeterCordes wies darauf hin, dassSie möglicherweise ein Problem haben, wenn eine Änderung in procfs oder sysfs eine von Ihren Distributions-Init-Skripten verwendete Anwendung beschädigt .

Dies hängt in gewissem Maße davon ab, wie Ihre Distribution den Kernel aktualisiert (Langzeitunterstützung oder Mainline), und selbst dann sind die Probleme relativ selten, da Distributionen die aktualisierten Tools normalerweise zur gleichen Zeit versenden.

@StephenKitt fügte hinzu, dass für den aktualisierten Benutzerbereich möglicherweise eine neuere Version des Kernels erforderlich ist. In diesem Fall kann das System möglicherweise nicht mit dem alten Kernel booten, und in den Versionshinweisen der Distribution wird dies gegebenenfalls erwähnt.

sebasth
quelle
1
Es wäre auf lange Sicht nützlich, diese Erklärung um eine Zusammenfassung der Kernel-Benutzeroberfläche (auch bekannt als Systemaufrufe) zu erweitern, da hier der Mechanismus erläutert wird, mit dem unterschiedlich konfigurierte Kernel Anwendungen nicht beschädigen.
Wallyk
3
Sogar procfs ( /proc) und sysfs ( /sys) werden so stabil wie möglich gehalten, wobei dieselbe Richtlinie / Philosophie befolgt wird, wonach der Benutzerraum nicht verletzt wird. Auch ioctl()Codes auf Gerätedateien en.wikipedia.org/wiki/Ioctl . Es geht weit über die einfache ABI-Kompatibilität mit Systemaufrufen hinaus, aber wie Sie sagen, ändern sich die Dinge in /procund , wenn es einen guten Grund gibt /sys. Es wird die meisten Programme nicht direkt unterbrechen, aber wenn es ein Low-Level-User-Space-Programm unterbricht, das von den Init-Skripten Ihrer Distribution verwendet wird, könnten Sie ein Problem haben. Zum Glück ist das selten.
Peter Cordes
Tatsächlich haben einige Dateien wie der IIRC- rfkillSwitch bei einigen Kernel-Upgrades den Speicherort geändert. Also /procund /syssind viel weniger stabil als Syscall-Schnittstelle. Glücklicherweise enthalten Distributionen solche Kernel-Upgrades normalerweise nicht, es sei denn, es handelt sich um ein Major-Upgrade der Distributionsversion.
Ruslan
3
Hierbei sind zwei Aspekte zu berücksichtigen: das Aktualisieren des Kernels und das Aktualisieren des Benutzerbereichs. Dank der ABI-Stabilität des Kernels ist ein Upgrade des Kernels ziemlich sicher (selbst bei /procund bei /sysÄnderungen in der Regel - das Entfernen dauert Jahre). Für die Aktualisierung des Benutzerbereichs kann jedoch ein neuer Kernel erforderlich sein, und Sie können ein nicht bootfähiges System erhalten, wenn Sie nicht über einen ausreichend neuen Kernel verfügen. In den Versionshinweisen zu Distributionen wird dies gegebenenfalls erwähnt (aktualisieren Sie Distributionen nicht blind, lesen Sie die Versionshinweise).
Stephen Kitt
1
Es gibt Richtlinien für / proc- und / sys-Dateien und wie der Userspace sie lesen sollte, um das Hinzufügen weiterer Felder in neueren Kerneln zu ermöglichen. Zum Beispiel / proc / stat oder / proc / meminfo. Vom Benutzerbereich wird erwartet, dass er hinzugefügte Felder ignoriert.
Zan Lynx
11

Der Linux-Kernel und der User-Space einer Linux-Distribution, die in der Vergangenheit von User-Tools dominiert wurde, die vom GNU-Projekt entwickelt wurden, sind lose miteinander verbunden. Dies ist zum Teil beabsichtigt und zum Teil notwendig.

Im Gegensatz zu den BSDs, bei denen der Kernel und der Basis-User-Space zusammen entworfen und verwaltet werden, wurden der Linux-Kernel und sein User-Space von verschiedenen Personen entwickelt und verwaltet. Daher wäre es schwierig, sie eng zusammenzuhalten, selbst wenn die Community dies wünschte, was meiner Meinung nach nicht der Fall ist.

Und @sebasth weist auch darauf hin, dass eine wichtige Richtlinie des Linux-Kernel-Projekts darin besteht, dass der Benutzerraum nicht beschädigt werden darf. Was natürlich ein weiterer Faktor ist, der eine lose Kopplung erzwingt.

Es besteht jedoch immer noch ein gewisses Maß an Kopplung. Ein ausreichend alter Linux-Kernel wird mit modernen Distributionen nicht funktionieren.

Faheem Mitha
quelle
2
@Abigail Dies ist eine Fehlerkorrektur. Die Vorwärtskompatibilität kann jedoch bereitgestellt werden, wenn der Userspace entsprechende Fallbacks (auch herabgesetzte Fallbacks) für fehlende Kernelfunktionen implementiert. Zugegeben, es ist oft nicht wünschenswert oder sogar wert, aber manche Software macht dies ( glibczum Beispiel). (Aber ja, das ist kein Versprechen für den Kernel, es ist ein Versprechen für den Userspace.)
Stephen Kitt
7

Mein Verständnis ist , dass Linux ist der Kernel, und alles andere Neben ist. Sie können den Kernel definitiv unabhängig von (vielen) installierten Paketen aktualisieren, da diese in der Regel an Bibliotheken und nicht an den Kernel selbst gebunden sind . Sie werden im Allgemeinen nur eine solche Kopplung zwischen Kernelversionen und Hardwaretreibern (z. B. GPU-Treibern) sehen. Manche Software ist nur mit bestimmten Kernelversionen kompatibel, dies sollte jedoch in der jeweiligen Dokumentation der jeweiligen Programme angegeben werden.

Es ist eher üblich, zwei Kernel-Paketsuiten auf einem System zu installieren - das aktuell verwendete Paket und das zuvor installierte Paket. Wenn beim Upgrade sichergestellt ist, dass die neue Version ordnungsgemäß funktioniert, kann die älteste Version entfernt werden, und es besteht weiterhin ein bekanntermaßen sicherer Fallback. Red Hat (und seine Cousins) package-cleanup --oldkernels --count 2müssen dies beispielsweise automatisch tun.

DopeGhoti
quelle
Sogar etwas wie kmod , von dem Sie denken, dass es an die Kernel-Version gebunden sein müsste , hat ein wenig Spielraum, mit welchen Versionen es funktioniert.
Ignacio Vazquez-Abrams
4

Neben all den guten Argumenten hier möchte ich einige Punkte hinzufügen, die helfen werden.

Wir kennen die Kernel-Team-Richtlinien bereits und versuchen als Linux-Distributionen, den Kernel-Quellcode so rein wie möglich zu halten. Das bedeutet, dass wir das Kernel-Team informieren, wenn eine Sicherheitsanfälligkeit auftritt oder wenn ein Patch erforderlich ist, und versuchen, mit Patches zu helfen. Die endgültige Entscheidung liegt jedoch beim Kernel-Team.

Einige Distributionen fügen mehr zusätzliche Patches als andere hinzu, aber die Idee ist, diese beizubehalten, da sie von den Entwicklern stammen. Offensichtlich gibt es einige Programme, die eine spezielle Kernelkonfiguration erfordern, insbesondere Virtualisierung und Treiber von Drittanbietern. In der Regel werden beide Programme verwendet, um mit einer bestimmten Kernelversion oder zumindest einer nicht allzu alten Version zu arbeiten. Der Grund dafür ist, dass sie es versuchen Um mit den neuesten Kernel-Funktionen zu arbeiten, werden sie möglicherweise nicht ordnungsgemäß ausgeführt, wenn Sie versuchen, sie mit einem alten Kernel auszuführen.

Ein zusätzliches Element, das Sie berücksichtigen sollten, ist, dass alle Linux-Distributionen ein Betreuerteam haben, das dafür sorgt, dass die gesamte Software mit dem System kompatibel ist. Deshalb hat fast jede Distribution eine stabile und eine instabile Version. Entwickler arbeiten mit "instabiler" Software, und wenn alles getestet wurde, markieren sie diese als stabil. Erst dann kann ein normaler Benutzer das Paket aktualisieren. Wenn die Person, die Sie gefragt hat, also ein normaler Benutzer ist, ist 90% sicher, dass die Software gut getestet wurde .

Also, wer ist, die Community und was sollte der gemeinsame Ansatz sein? Wir brauchen Software, die zusammenarbeitet und nicht das System zerstört. Deshalb versuchen wir, einige Standards wie den Dateisystem-Hierarchie-Standard zu befolgen .

Christopher Díaz Riveros
quelle