Wie kann ich überprüfen, ob der aktuell ausgeführte Linux-Kernel mit kexec geladen wurde?
7
Mit "Überprüfen" meine ich etwas ziemlich solides, dh der Versuch, die Konfiguration des Loaders oder die verfügbaren Kerneldateien zu analysieren und mit der Ausgabe von uname übereinzustimmen, ist keine Option.
Ich habe kein Kexec zur Verfügung, um es zu überprüfen. Bitten Sie daher, entweder dmesgoder zu überprüfen cat /proc/cmdline?
SHW
Viele POWER-basierte Systeme booten den "echten" Kernel mit kexeceinem Linux-basierten Bootloader.
Simon Richter
Antworten:
7
Im allgemeinen Fall ist dies nicht möglich, da nichts vom vorherigen Status als vertrauenswürdig eingestuft und nicht von einem regulären Neustart unterschieden werden kann.
Nehmen wir zum Beispiel an, Sie haben ein System, das den RAM beim Booten NICHT löscht (das Löschen des Speichers beim Booten ist für einige sichere Bootspezifikationen usw. erforderlich). Der anfängliche Startvorgang und jeder normale Neustart erfolgen im Allgemeinen mit denselben Offsets und löschen im Laufe der Zeit alles vom vorherigen Start. Der Kernel selbst wird fast immer an derselben Adresse geladen.
Betrachten Sie nun kexec anstelle eines normalen Neustarts und stellen Sie fest, dass alles mit denselben Offsets enden sollte und größtenteils nicht zu unterscheiden ist.
Gibt es Sonderfälle, in denen kexec erkannt werden kann? JA!
Kdump lädt den neuen Kernel explizit an eine andere Adresse und hofft, den Speicher des vorherigen Kernels für die Erfassung des Fehlerzustands zu erhalten.
Wenn BIOS und Kernel die Hardware unterschiedlich initialisieren, kann dies (offensichtlich) bemerkt werden, da sich bei jedem Start mit dem Schalter "usual / kexec" Änderungen ergeben würden.
Als spezielles Beispiel hierfür wird der EFI-Frame-Puffer beim Booten definitiv vom Kernel geändert und kehrt auf kexec nie in den ursprünglichen Zustand zurück.
Die Konsequenz daraus ist, dass es so gut wie keine Möglichkeit gibt, später zu entscheiden, ob es sich um einen echten Boot oder einen Kexec- Boot handelt, wenn Sie den Boot des kexec-Kernels nicht steuern und er die Hardware berührt .
Als Demo habe ich eine VM mit einem Kernel gebootet, dmesg erfasst, dann sofort einen harten Kexec ausgeführt und dmesg erneut erfasst. Hier ist der Unterschied zwischen den beiden Läufen von dmesg: https://gist.github.com/robbat2/7609be2715591eac8ace3f46e852c549
> Auf diese Weise können Sie nur den ERSTEN Neustart mit kexec erkennen - warum haben Sie FIRST hervorgehoben? Wenn Sie normal booten, kehrt der Status zum BIOS zurück und kann erkannt werden. Jedes Mal, wenn Sie wissen, ob es kein BIOS-Boot war. ;)
Poige
@poige Ich habe meine Antwort aktualisiert, weil dieses Kommentarfeld zu kurz war.
Robbat2
Immer noch unsicher warum. kexec sieht gleich aus, egal ob sie nur wenige in einer Reihe oder nur einzeln sind. Für den Fall, dass Sie ohne kexec dmesg booten, wäre das anders. Deshalb sehe ich keinen Grund in dieser Betonung
poige
2
Ich habe gerade die Antwort im Code gefunden und möchte sie teilen.
Überprüfen Sie Folgendes, um zu überprüfen, mit welchem Bootloader der laufende Kernel geladen wurde:
/proc/sys/kernel/bootloader_type
Man muss dann 4 Bits nach rechts verschieben, um den Bootloader-Typ zu erhalten, der in der folgenden Datei für x86 (im Kernelbaum) beschrieben wird: Documentation / x86 / boot.rst [0]
Der kexec-Loader würde nach der Verschiebung 0xD anzeigen (aus dem Code von kexec-tools können wir sehen, dass er als #define LOADER_TYPE_KEXEC 0x0D definiert ist).
Es ist leider nur ein x86-Trick !!! Ich hoffe es hilft.
Hier brauchen Sie sich nicht zu entschuldigen, es ist viel vernünftiger, Möglichkeiten zur Beantwortung eines Themas bereitzustellen, anstatt die Leute zu drängen, das Teilen ihrer Ergebnisse zu überspringen oder neue Instanzen derselben Fragen zu eröffnen. Ich habe dies persönlich im Apple-Forum gesehen, was mir teilweise aufgrund dieser Einschränkung (aber nicht nur) nicht gefällt.
cat /proc/cmdline
?dmesg
oder zu überprüfencat /proc/cmdline
?kexec
einem Linux-basierten Bootloader.Antworten:
Im allgemeinen Fall ist dies nicht möglich, da nichts vom vorherigen Status als vertrauenswürdig eingestuft und nicht von einem regulären Neustart unterschieden werden kann.
Nehmen wir zum Beispiel an, Sie haben ein System, das den RAM beim Booten NICHT löscht (das Löschen des Speichers beim Booten ist für einige sichere Bootspezifikationen usw. erforderlich). Der anfängliche Startvorgang und jeder normale Neustart erfolgen im Allgemeinen mit denselben Offsets und löschen im Laufe der Zeit alles vom vorherigen Start. Der Kernel selbst wird fast immer an derselben Adresse geladen.
Betrachten Sie nun kexec anstelle eines normalen Neustarts und stellen Sie fest, dass alles mit denselben Offsets enden sollte und größtenteils nicht zu unterscheiden ist.
Gibt es Sonderfälle, in denen kexec erkannt werden kann? JA!
Als Demo habe ich eine VM mit einem Kernel gebootet, dmesg erfasst, dann sofort einen harten Kexec ausgeführt und dmesg erneut erfasst. Hier ist der Unterschied zwischen den beiden Läufen von dmesg: https://gist.github.com/robbat2/7609be2715591eac8ace3f46e852c549
quelle
Ich habe gerade die Antwort im Code gefunden und möchte sie teilen.
Überprüfen Sie Folgendes, um zu überprüfen, mit welchem Bootloader der laufende Kernel geladen wurde:
Man muss dann 4 Bits nach rechts verschieben, um den Bootloader-Typ zu erhalten, der in der folgenden Datei für x86 (im Kernelbaum) beschrieben wird: Documentation / x86 / boot.rst [0]
Der kexec-Loader würde nach der Verschiebung 0xD anzeigen (aus dem Code von kexec-tools können wir sehen, dass er als #define LOADER_TYPE_KEXEC 0x0D definiert ist).
Es ist leider nur ein x86-Trick !!! Ich hoffe es hilft.
[0] www.kernel.org/doc/Documentation/x86/boot.rst
quelle