GNU/Linux >> Tutoriales Linux >  >> Linux

uname está roto:¿cómo determino el kernel que se está ejecutando actualmente?

Ha actualizado su libc (la biblioteca del sistema más básica) y ahora ningún programa funciona. Para ser precisos, ningún programa enlazado dinámicamente funciona.

En su escenario particular, el reinicio debería funcionar. La libc ahora instalada requiere un kernel más nuevo, y si reinicia, debería obtener ese kernel más nuevo.

Siempre que tenga un shell en ejecución, a menudo hay una manera de recuperarse, pero puede ser complicado si no lo planeó. Si no tiene un shell, generalmente no hay otra solución que reiniciar.

Aquí es posible que no pueda recuperarse sin reiniciar, pero al menos puede averiguar fácilmente qué kernel se está ejecutando. Solo usa una forma de leer /proc/version eso no requiere un comando externo.

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

Si todavía tiene una copia de la antigua libc, puede ejecutar programas con ella. Por ejemplo, si la antigua libc está en /old/lib y tiene ejecutables que funcionan con esta antigua libc en /old/bin , puede ejecutar

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

Si tiene algunos binarios vinculados estáticamente, seguirán funcionando. Recomiendo instalar utilidades del sistema vinculadas estadísticamente para este tipo de problema (pero debe hacerlo antes de que comience el problema). Por ejemplo, en Debian/Ubuntu/Mint/…, instale una o más de busybox-static (colección de herramientas básicas de línea de comandos de Linux que incluye un shell), sash (shell con algunos componentes adicionales), zsh-static (solo un shell pero con bastantes herramientas útiles integradas).

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

Ese parece ser el error que arroja glibc si se está ejecutando en un kernel que es más antiguo que el soporte compilado de la biblioteca. El mensaje de error está en el DL_SYSDEP_OSCHECK(FATAL) macro en sysdeps/unix/sysv/linux/dl-osinfo.h

Hay una opción de tiempo de compilación para esto:

--enable-kernel=version
Esta opción actualmente solo es útil en sistemas GNU/Linux. El parámetro de versión debe tener la forma X.Y.Z y describe la versión más pequeña del kernel de Linux que se espera que admita la biblioteca generada. Cuanto más alto es el número de versión, menos código de compatibilidad se agrega y más rápido se vuelve el código.

Así que parece que, por alguna razón, está ejecutando un sistema con un núcleo antiguo pero con una glibc instalada que ya no es compatible con el núcleo antiguo. Es difícil saber cómo lo obtuvo sin información sobre qué sistema es, pero uno podría suponer que eso podría suceder si la biblioteca está actualizada pero el kernel no.

file parece mostrar la versión mínima requerida por un ejecutable o una biblioteca (pero, por supuesto, necesita una biblioteca funcional para ejecutarlo):

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

En mis sistemas Debian semi-actuales, la versión del kernel requerida es 2.6.32 como se indicó anteriormente en todos los archivos binarios que verifiqué, lo que hace que sea muy poco probable que surja un problema con la versión del kernel.


Prueba con esto:

cat /proc/version

Linux
  1. Linux:¿cómo determinar qué módulo contamina el kernel?

  2. ¿Cómo ver los procesos en ejecución de cualquier usuario en SSH?

  3. ¿Cómo determina el kernel de Linux el orden de las llamadas __init?

  4. ¿Cómo verificar HZ en la terminal?

  5. Cómo verificar si el shell que se está ejecutando actualmente es BusyBox

Cómo el kernel de Linux maneja las interrupciones

Cómo compilar un kernel de Linux en el siglo XXI

Cómo verificar la versión del kernel en Linux

Cómo averiguar la versión del kernel de Linux que se ejecuta en su PC

Cómo verificar todos los servicios en ejecución en Linux

¿Cómo debo determinar la utilización actual de la red?