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