Уніме зламано: як визначити поточне ядро, що працює?


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
Мені цікаво, як ти завантажив річ? А що це? Здається, відсутні деякі ключові шматочки інформації. Це рятувальний снаряд? Чи можете ви надати більше деталей?
Лізардкс

Якщо у вас встановлений хром, дивіться: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 /… встановіть один або декілька зайнятих-статичних (колекція основних інструментів командного рядка Linux, включаючи оболонку), sash (оболонку з деякими додатковими вбудованими версіями), zsh-статичні (просто оболонка, але із вбудованим досить багато зручних інструментів).

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. Параметр версії повинен мати вигляд 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такою ж, як і в усіх бінарних файлах, які я перевірив, що зробило б малоймовірним виникнення проблеми з версією ядра.


5

Спробуйте з цим:

cat /proc/version

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

Це гарна думка, але з несумісним glibc catнедоступний.
William Pursell

Я так само побоювався, але варто спробувати ...
Свен,

Це тільки тому, що кішка недоступна? Чому б тоді не 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.