Hai aggiornato la tua libc (la libreria di sistema più semplice) e ora nessun programma funziona. Per essere precisi, nessun programma collegato dinamicamente funziona.
Nel tuo scenario particolare, il riavvio dovrebbe funzionare. La libc ora installata richiede un kernel più recente e, se riavvii, dovresti ottenere quel kernel più recente.
Finché hai ancora una shell in esecuzione, spesso c'è un modo per recuperare, ma può essere complicato se non l'hai pianificato. Se non hai una shell, di solito non c'è altra soluzione che riavviare.
Qui potresti non essere in grado di ripristinare senza riavviare, ma puoi almeno scoprire facilmente quale kernel è in esecuzione. Basta usare un modo per leggere /proc/version
che non richiede un comando esterno.
read v </proc/version; echo $v
echo $(</proc/version) # in zsh/bash/ksh
Se hai ancora una copia della vecchia libc in giro, puoi eseguire programmi con essa. Ad esempio, se la vecchia libc è in /old/lib
e hai eseguibili che funzionano con questa vecchia libc in /old/bin
, puoi eseguire
LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname
Se hai alcuni binari collegati staticamente, funzioneranno comunque. Raccomando di installare utilità di sistema collegate statisticamente per questo tipo di problema (ma devi farlo prima che il problema inizi). Ad esempio, su Debian/Ubuntu/Mint/..., installa uno o più di busybox-static (raccolta di strumenti di base della riga di comando di Linux che include una shell), sash (shell con alcuni builtin aggiuntivi), zsh-static (solo una shell ma con alcuni utili strumenti integrati).
busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
Questo sembra essere l'errore generato da glibc se è in esecuzione su un kernel più vecchio di quello che la libreria è compilata per supportare. Il messaggio di errore è nel DL_SYSDEP_OSCHECK(FATAL)
macro in sysdeps/unix/sysv/linux/dl-osinfo.h
C'è un'opzione in fase di compilazione per questo:
--enable-kernel=version
Questa opzione è attualmente utile solo su sistemi GNU/Linux. Il parametro version deve avere il formato X.Y.Z e descrive la versione più piccola del kernel Linux che la libreria generata dovrebbe supportare. Più alto è il numero di versione, meno codice di compatibilità viene aggiunto e più veloce diventa il codice.
Quindi sembra che per qualche motivo tu stia eseguendo un sistema con un vecchio kernel ma una glibc installata che non supporta più il vecchio kernel. Come hai ottenuto è difficile da dire senza informazioni su quale sistema sia, ma si potrebbe presumere che ciò potrebbe accadere se la libreria viene aggiornata ma il kernel no.
file
sembra mostrare la versione minima richiesta da un eseguibile o da una libreria (ma ovviamente è necessaria una libreria funzionante per eseguirlo):
/lib/x86_64-linux-gnu/libc-2.23.so: ELF 64-bit LSB shared object, x86-64, ..., for GNU/Linux 2.6.32, stripped
Sui miei sistemi Debian semi-correnti, la versione del kernel richiesta è 2.6.32
come sopra su tutti i binari che ho controllato, il che renderebbe abbastanza improbabile riscontrare un problema con la versione del kernel.
Prova con questo:
cat /proc/version