uname не работает: как определить работающее ядро?

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

В / boot есть 3 * .vmlinuz-linux файла. Как определить, какое ядро ​​работает в данный момент?

Обратите внимание, что я работаю в ограниченной среде с минимальной оболочкой. Я также попробовал:

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

Есть предположения?

Уильям Перселл
источник
перезагрузка. Если GRUB установлен, возможно, у вас есть варианты решения вашей проблемы. Или используйте live-cd или usb ...
jcm69
2
Мне интересно, как ты загрузил эту штуку? А что это такое? Кажется, не хватает некоторых ключевых битов информации. Это спасательная раковина? Можете ли вы предоставить более подробную информацию?
Lizardx
Если у вас установлен хром, смотрите:chrome://system/
GAD3R
Да, это спасательная раковина. Я обновлял много пакетов, включая glibc. Демон, запускающий спасательную оболочку, все еще жив и слушает порт, поэтому я смог туда попасть.
Уильям Перселл
1
Похоже, что машина была перезапущена (например, кто-то нажал кнопку), и это стало академическим вопросом. Это было интересное состояние, и мне хотелось бы получить некоторые точные данные о том, на что обращать внимание, но я полагаю, что главное - обновить ядро ​​и перезагрузиться перед обновлением glibc.
Уильям Перселл

Ответы:

19

Вы обновили свою libc (самую базовую системную библиотеку), и теперь ни одна программа не работает. Если быть точным, динамически связанная программа не работает.

В вашем конкретном случае перезагрузка должна работать. Для установленной сейчас libc требуется более новое ядро, и если вы перезагрузитесь, вы должны получить это более новое ядро.

Пока у вас есть работающая оболочка, часто есть способ ее восстановить, но это может быть сложно, если вы не планировали ее. Если у вас нет оболочки, то обычно нет иного решения, кроме перезагрузки.

Здесь вы не сможете восстановить без перезагрузки, но вы можете по крайней мере легко узнать, какое ядро ​​работает. Просто используйте способ чтения /proc/version, который не требует внешней команды.

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

Если у вас все еще есть копия старого libc, вы можете запускать программы с ним. Например, если старая библиотека libc включена /old/libи у вас есть исполняемые файлы, которые работают с этой старой библиотекой libc /old/bin, вы можете запустить

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

Если у вас есть статически связанные двоичные файлы, они все равно будут работать. Я рекомендую установить статистически связанные системные утилиты для такого рода проблем (но вы должны сделать это до того, как проблема начнется). Например, в Debian / Ubuntu / Mint /… установите один или несколько из busybox-static (набор базовых инструментов командной строки Linux, включая оболочку), sash (shell с некоторыми дополнительными встроенными функциями), zsh-static (просто оболочка, но с довольно много встроенных удобных инструментов).

busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
Жиль "ТАК - прекрати быть злым"
источник
если вы перезагрузитесь, вы должны получить это более новое ядро. или черный экран, который кажется гораздо более вероятным
кошка
Назначение LD_LIBRARY_PATH - отличное предложение. К сожалению, оболочка восстановления не имеет внутреннего чтения, не допускает перенаправлений и даже не позволяет присваивать переменные окружения! Я регистрирую ошибку, чтобы получить назначение env в оболочку.
Уильям Перселл
6

Это похоже на ошибку, которую выдает glibc, если он работает на ядре, которое старше, чем то, что библиотека скомпилирована для поддержки. Сообщение об ошибке находится в DL_SYSDEP_OSCHECK(FATAL)макросе вsysdeps/unix/sysv/linux/dl-osinfo.h

Для этого есть опция времени компиляции :

--enable-kernel=version
Эта опция в настоящее время полезна только в системах GNU / Linux. Параметр version должен иметь форму XYZ и описывает наименьшую версию ядра Linux, которую должна поддерживать сгенерированная библиотека. Чем выше номер версии, тем меньше добавляется код совместимости и тем быстрее получается код.

Таким образом, кажется, что по какой-то причине вы используете систему со старым ядром, но с установленным glibc, который больше не поддерживает старое ядро. Трудно сказать, как вы это получили, без информации о том, что это за система, но можно предположить, что это может произойти, если библиотека будет обновлена, а ядро ​​- нет.

file кажется, показывает минимальную версию, требуемую для исполняемого файла или библиотеки (но, конечно, вам нужна рабочая библиотека для ее запуска):

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

В моих полу-текущих системах Debian необходимая версия ядра такая же, 2.6.32как указано выше для всех двоичных файлов, которые я проверял, что исключало бы вероятность возникновения проблемы с версией ядра.

ilkkachu
источник
5

Попробуйте с этим:

cat /proc/version
Sven
источник
> cat /proc/version FATAL: kernel too old
Уильям Перселл
Это хорошая мысль, но с несовместимым glibc catнедоступна.
Уильям Перселл
Я так боялся, но это стоило попробовать ...
Свен
Это только потому, что кошка недоступна? Тогда почему не vim или nano / proc / version?
jesse_b
Как насчет: head /proc/version|| tail /proc/version|| sed '1q;d' /proc/version
jesse_b
0

Используйте stringsкоманду для извлечения информации для печати из vmlinuzфайла.

strings vmlinuz | grep version

Пример вывода:

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)
GAD3R
источник