uname jest zepsuty: jak określić aktualnie działające jądro?


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

W katalogu / boot znajdują się 3 pliki * .vmlinuz-linux. Jak ustalić, które jądro jest obecnie uruchomione?

Zauważ, że działam w ograniczonym środowisku z minimalną powłoką. Próbowałem też:

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

jakieś pomysły?


restart. Jeśli GRUB jest zainstalowany, być może możesz mieć opcje rozwiązania problemu. Lub użyj live-cd lub usb ...
jcm69

2
Jestem ciekawy, jak to uruchomiłeś? I co to jest? Wydaje się, że brakuje niektórych kluczowych informacji. Czy to skorupa ratunkowa? Czy możesz podać więcej szczegółów?
Lizardx

Jeśli masz zainstalowany chrom, zobacz:chrome://system/
GAD3R

Tak, to pocisk ratunkowy. Aktualizowałem wiele pakietów, w tym glibc. Demon uruchamiający powłokę ratunkową wciąż żyje i nasłuchuje na porcie, więc mogłem się tam dostać.
William Pursell

1
Wygląda na to, że maszyna została ponownie uruchomiona (np. Ktoś nacisnął przycisk) i stało się to pytaniem akademickim. To był ciekawy stan i chciałbym mieć trochę twardych danych na temat tego, na co należy uważać, ale podejrzewam, że na wynos jest: zaktualizuj jądro i uruchom ponownie przed aktualizacją glibc.
William Pursell

Odpowiedzi:


19

Zaktualizowałeś bibliotekę libc (najbardziej podstawową bibliotekę systemową) i teraz nie działa żaden program. Mówiąc ściślej, żaden dynamicznie powiązany program nie działa.

W twoim konkretnym scenariuszu ponowne uruchomienie powinno działać. Teraz zainstalowane libc wymaga nowszego jądra, a jeśli uruchomisz ponownie, powinieneś dostać to nowsze jądro.

Tak długo, jak nadal masz działającą powłokę, często istnieje sposób na odzyskanie, ale może to być trudne, jeśli nie planujesz tego. Jeśli nie masz powłoki, zwykle nie ma innego rozwiązania niż ponowne uruchomienie.

Tutaj możesz nie być w stanie odzyskać bez restartu, ale możesz przynajmniej łatwo dowiedzieć się, jakie jądro działa. Wystarczy użyć sposobu czytania /proc/version, który nie wymaga zewnętrznego polecenia.

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

Jeśli nadal masz kopię starej biblioteki libc, możesz z nią uruchamiać programy. Na przykład, jeśli stary libc jest włączony /old/libi masz pliki wykonywalne, które działają z tym starym libc w /old/bin, możesz uruchomić

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

Jeśli masz jakieś statycznie połączone pliki binarne, nadal będą działać. Polecam instalowanie statystycznie połączonych narzędzi systemowych dla tego rodzaju problemów (ale musisz to zrobić, zanim problem zacznie się). Na przykład, Debian / Ubuntu / Mint / ..., zainstalować jedną lub więcej z BusyBox-Static (zbieranie podstawowych narzędzi wiersza poleceń systemu Linux, w tym skorupy), skrzydło (powłoki z kilku dodatkowych poleceń wbudowanych), zsh-Static (tylko powłoka ale z kilkoma wbudowanymi przydatnymi narzędziami).

busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'

jeśli uruchomisz ponownie, powinieneś pobrać to nowsze jądro. lub czarny ekran, który wydaje się znacznie bardziej prawdopodobny
kot

Przypisanie LD_LIBRARY_PATH to świetna sugestia. Niestety powłoka ratunkowa nie ma wewnętrznego odczytu, nie pozwala na przekierowania, a nawet nie pozwala na przypisanie zmiennych środowiskowych! Zgłaszam błąd, aby uzyskać przypisanie env do powłoki.
William Pursell

6

Wydaje się, że jest to błąd zgłaszany przez glibc, jeśli działa na jądrze starszym niż skompilowana biblioteka do obsługi. Komunikat o błędzie znajduje się w DL_SYSDEP_OSCHECK(FATAL)makrze wsysdeps/unix/sysv/linux/dl-osinfo.h

Jest do tego opcja czasu kompilacji :

--enable-kernel=version
Ta opcja jest obecnie przydatna tylko w systemach GNU / Linux. Parametr wersji powinien mieć postać XYZ i opisuje najmniejszą wersję jądra systemu Linux, którą ma obsługiwać wygenerowana biblioteka. Im wyższy numer wersji, tym mniej kodu zgodności jest dodawany, tym szybciej kod jest dostępny.

Wygląda więc na to, że z jakiegoś powodu używasz systemu ze starym jądrem, ale z zainstalowanym glibc, który nie obsługuje już starego jądra. Trudno powiedzieć, jak to się stało, bez informacji o tym, jaki to system, ale można założyć, że tak się stanie, jeśli biblioteka zostanie zaktualizowana, ale jądro nie.

file wydaje się pokazywać minimalną wersję wymaganą przez plik wykonywalny lub bibliotekę (ale oczywiście potrzebujesz działającej biblioteki, aby ją uruchomić):

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

W moich półprądowych systemach Debian wymagana wersja jądra jest taka sama 2.6.32jak powyżej na wszystkich sprawdzonych przez mnie plikach binarnych, co sprawiłoby, że wystąpienie problemu z wersją jądra jest mało prawdopodobne.


5

Spróbuj tego:

cat /proc/version

> cat /proc/version FATAL: kernel too old
William Pursell

To dobra myśl, ale przy niekompatybilnym glibc catnie jest dostępna.
William Pursell

Tak samo się obawiałem, ale warto było spróbować ...
Sven

Czy to tylko dlatego, że kot jest niedostępny? Dlaczego więc nie vim lub nano / proc / version?
jesse_b

Co powiesz na: head /proc/version|| tail /proc/version|| sed '1q;d' /proc/version
jesse_b

0

Użyj stringspolecenia, aby wyodrębnić informacje do wydrukowania z vmlinuzpliku.

strings vmlinuz | grep version

Przykładowe dane wyjściowe:

4.9.0-6-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516
(Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.