GNU/Linux >> Tutoriels Linux >  >> Linux

uname est cassé :comment déterminer le noyau en cours d'exécution ?

Vous avez mis à jour votre libc (la bibliothèque système la plus basique) et maintenant aucun programme ne fonctionne. Pour être précis, aucun programme lié dynamiquement ne fonctionne.

Dans votre scénario particulier, le redémarrage devrait fonctionner. La libc maintenant installée nécessite un noyau plus récent, et si vous redémarrez, vous devriez obtenir ce noyau plus récent.

Tant que vous avez toujours un shell en cours d'exécution, il existe souvent un moyen de récupérer, mais cela peut être délicat si vous ne l'avez pas prévu. Si vous n'avez pas de shell, il n'y a généralement pas d'autre solution que de redémarrer.

Ici, vous ne pourrez peut-être pas récupérer sans redémarrer, mais vous pouvez au moins savoir facilement quel noyau est en cours d'exécution. Utilisez simplement un moyen de lire /proc/version qui ne nécessite pas de commande externe.

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

Si vous avez encore une copie de l'ancienne libc, vous pouvez exécuter des programmes avec. Par exemple, si l'ancienne libc est en /old/lib et vous avez des exécutables qui fonctionnent avec cette ancienne libc en /old/bin , vous pouvez exécuter

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

Si vous avez des binaires liés statiquement, ils fonctionneront toujours. Je recommande d'installer des utilitaires système statistiquement liés pour ce type de problème (mais vous devez le faire avant que le problème ne commence). Par exemple, sur Debian/Ubuntu/Mint/…, installez un ou plusieurs de busybox-static (collection d'outils de ligne de commande Linux de base comprenant un shell), sash (shell avec quelques fonctions supplémentaires), zsh-static (juste un shell mais avec pas mal d'outils pratiques intégrés).

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

Cela semble être l'erreur générée par la glibc si elle s'exécute sur un noyau plus ancien que celui que la bibliothèque est compilée pour prendre en charge. Le message d'erreur est dans le DL_SYSDEP_OSCHECK(FATAL) macro en sysdeps/unix/sysv/linux/dl-osinfo.h

Il existe une option de compilation pour cela :

--enable-kernel=version
Cette option n'est actuellement utile que sur les systèmes GNU/Linux. Le paramètre de version doit avoir la forme X.Y.Z et décrit la plus petite version du noyau Linux que la bibliothèque générée est censée prendre en charge. Plus le numéro de version est élevé, moins le code de compatibilité est ajouté et plus le code est rapide.

Il semble donc que pour une raison quelconque, vous utilisez un système avec un ancien noyau mais une glibc installée qui ne prend plus en charge l'ancien noyau. Comment vous avez obtenu le est difficile à dire sans informations sur le système dont il s'agit, mais on pourrait supposer que cela pourrait arriver si la bibliothèque est mise à jour mais pas le noyau.

file semble afficher la version minimale requise par un exécutable ou une bibliothèque (mais bien sûr, vous avez besoin d'une bibliothèque de travail pour l'exécuter) :

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

Sur mes systèmes Debian semi-actuels, la version de noyau requise est 2.6.32 comme ci-dessus sur tous les binaires que j'ai vérifiés, ce qui rendrait très peu probable de rencontrer un problème avec la version du noyau.


Essayez avec ceci :

cat /proc/version

Linux
  1. Linux - Comment donner de la RAM au cache du système de fichiers ?

  2. Comment afficher une tâche cron en cours d'exécution ?

  3. Déterminez quel invité s'exécute sur XEN :invité HVM ou PV

  4. Comment un noyau monte-t-il la partition racine ?

  5. Comment savoir si j'utilise Linux 32 ou 64 bits ?

Comment le noyau Linux gère les interruptions

Comment compiler un noyau Linux au 21e siècle

Comment vérifier la version du noyau sous Linux

Comment trouver la version du noyau Linux en cours d'exécution sur votre PC

Comment vérifier tous les services en cours d'exécution sous Linux

Comment dois-je déterminer l'utilisation actuelle du réseau ?