uname ist kaputt: wie bestimme ich den aktuell laufenden kernel?

13
> uname -r
FATAL: kernel too old
> cat /proc/cmdline
FATAL: kernel too old

In / boot befinden sich 3 * .vmlinuz-linux-Dateien. Wie bestimme ich, welcher Kernel gerade läuft?

Beachten Sie, dass ich in einer eingeschränkten Umgebung mit einer minimalen Shell arbeite. Ich habe auch versucht:

> sh -c 'read l < /proc/version; echo $l'
FATAL: kernel too old
> dd if=/proc/version
FATAL: kernel too old

Irgendwelche Gedanken?

William Pursell
quelle
neustarten. Wenn GRUB installiert ist, haben Sie möglicherweise Optionen, um Ihr Problem zu lösen. Oder verwenden Sie eine Live-CD oder USB ...
Jcm69
2
Ich bin neugierig, wie hast du das Ding gebootet? Und was ist das? Anscheinend fehlen einige wichtige Informationen. Ist das eine Rettungshülle? Können Sie weitere Details angeben?
Lizardx
Wenn Sie Chrom installiert haben, siehe:chrome://system/
GAD3R
Ja, es ist eine Rettungshülle. Ich habe viele Pakete aktualisiert, einschließlich glibc. Der Dämon, der die Rettungsshell ausführt, ist noch am Leben und überwacht einen Port, sodass ich dort hineinkommen konnte.
William Pursell
1
Es scheint, dass die Maschine hart neu gestartet wurde (z. B. durch Drücken einer Taste) und dies eine akademische Frage geworden ist. Es war ein interessanter Zustand, und ich hätte gerne einige harte Daten darüber, worauf zu achten ist, erhalten, aber ich nehme an, dass der Kernel aktualisiert und neu gestartet wird, bevor glibc aktualisiert wird.
William Pursell

Antworten:

19

Sie haben Ihre libc (die grundlegendste Systembibliothek) aktualisiert und jetzt funktioniert kein Programm mehr. Um genau zu sein, funktioniert kein dynamisch verknüpftes Programm.

In Ihrem speziellen Szenario sollte ein Neustart funktionieren. Die jetzt installierte libc erfordert einen neueren Kernel. Wenn Sie neu starten, sollten Sie diesen neueren Kernel erwerben.

Solange Sie noch eine laufende Shell haben, gibt es oft eine Möglichkeit, sich zu erholen, aber es kann schwierig sein, wenn Sie es nicht geplant haben. Wenn Sie keine Shell haben, gibt es normalerweise keine andere Lösung als einen Neustart.

Hier können Sie möglicherweise nicht ohne Neustart wiederherstellen, aber Sie können zumindest leicht herausfinden, welcher Kernel ausgeführt wird. Verwenden Sie einfach eine Lesemethode /proc/version, die keinen externen Befehl erfordert.

read v </proc/version; echo $v
echo $(</proc/version)               # in zsh/bash/ksh

Wenn Sie noch eine Kopie der alten libc haben, können Sie Programme damit ausführen. Wenn sich die alte libc beispielsweise in befindet /old/libund Sie ausführbare Dateien haben, die mit dieser alten libc in funktionieren /old/bin, können Sie sie ausführen

LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname

Wenn Sie über statisch verknüpfte Binärdateien verfügen, funktionieren diese weiterhin. Ich empfehle, statistisch verknüpfte Systemdienstprogramme für diese Art von Problem zu installieren (aber Sie müssen dies tun, bevor das Problem beginnt). Zum Beispiel auf Debian / Ubuntu / Mint / ..., installieren Sie eine oder mehrere der busybox-static (Sammlung von grundlegenden Linux - Kommandozeilen - Tools, die eine Shell), Schärpe (Schale mit einigen zusätzlichen builtins), zsh-static (nur eine Hülle , aber mit einigen handlichen Werkzeugen).

busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
Gilles 'SO - hör auf böse zu sein'
quelle
Wenn Sie neu starten, sollten Sie den neueren Kernel erhalten. oder ein schwarzer Bildschirm, der viel wahrscheinlicher erscheint
Katze
Das Zuweisen von LD_LIBRARY_PATH ist ein großartiger Vorschlag. Leider verfügt die Rettungsshell nicht über einen internen Lesezugriff, lässt keine Weiterleitungen zu und erlaubt nicht einmal die Zuweisung von Umgebungsvariablen! Ich melde einen Fehler an, um env-Zuweisung in die Shell zu bekommen.
William Pursell
6

Dies scheint der Fehler zu sein, den glibc auslöst, wenn es auf einem Kernel läuft, der älter ist als das, wofür die Bibliothek kompiliert wurde. Die Fehlermeldung ist im DL_SYSDEP_OSCHECK(FATAL)Makro insysdeps/unix/sysv/linux/dl-osinfo.h

Hierfür gibt es eine Kompilierungszeitoption :

--enable-kernel=version
Diese Option ist derzeit nur auf GNU / Linux-Systemen nützlich. Der version-Parameter sollte die Form XYZ haben und die kleinste Version des Linux-Kernels beschreiben, die die generierte Bibliothek voraussichtlich unterstützen wird. Je höher die Versionsnummer ist, desto weniger Kompatibilitätscode wird hinzugefügt und desto schneller wird der Code.

Es scheint also, dass Sie aus irgendeinem Grund ein System mit einem alten Kernel ausführen, aber einer installierten glibc, die den alten Kernel nicht mehr unterstützt. Es ist schwer zu sagen, wie Sie darauf gekommen sind, ohne Informationen darüber zu haben, um welches System es sich handelt. Man kann jedoch davon ausgehen, dass dies passieren kann, wenn die Bibliothek aktualisiert wird, der Kernel jedoch nicht.

file Anscheinend wird die Mindestversion angezeigt, die von einer ausführbaren Datei oder einer Bibliothek benötigt wird (aber Sie benötigen natürlich eine funktionierende Bibliothek, um sie auszuführen):

/lib/x86_64-linux-gnu/libc-2.23.so: ELF 64-bit LSB shared object, x86-64, ..., for GNU/Linux 2.6.32, stripped

Auf meinen halb-aktuellen Debian-Systemen ist die erforderliche Kernel-Version 2.6.32wie oben auf allen Binärdateien, die ich überprüft habe, was es ziemlich unwahrscheinlich macht, dass ein Problem mit der Kernel-Version auftritt.

ilkkachu
quelle
5

Versuchen Sie es mit diesem:

cat /proc/version
Sven
quelle
> cat /proc/version FATAL: kernel too old
William Pursell
Dies ist ein guter Gedanke, aber mit dem inkompatiblen glibc, catist nicht verfügbar.
William Pursell
Das habe ich befürchtet, aber es war einen Versuch wert ...
Sven
Liegt es nur daran, dass die Katze nicht verfügbar ist? Warum dann nicht vim oder nano / proc / version?
Jesse_b
Wie wäre es mit: head /proc/version|| tail /proc/version|| sed '1q;d' /proc/version
Jesse_b
0

Verwenden Sie den stringsBefehl, um die druckbaren Informationen aus der vmlinuzDatei zu extrahieren .

strings vmlinuz | grep version

Beispielausgabe:

4.9.0-6-amd64 ([email protected]) (gcc version 6.3.0 20170516
(Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02)
GAD3R
quelle