GNU/Linux >> Linux Esercitazione >  >> Linux

uname è rotto:come posso determinare il kernel attualmente in esecuzione?

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

Linux
  1. Linux:come determinare quale modulo contamina il kernel?

  2. Come ottenere il Tty in cui è in esecuzione Bash?

  3. Come visualizzare i processi in esecuzione di qualsiasi utente in SSH?

  4. In che modo il kernel Linux determina l'ordine delle chiamate __init?

  5. Come controllare HZ nel terminale?

Come il kernel Linux gestisce gli interrupt

Come compilare un kernel Linux nel 21° secolo

Come controllare la versione del kernel in Linux

Come scoprire la versione del kernel Linux in esecuzione sul tuo PC

Come controllare tutti i servizi in esecuzione in Linux

Come devo determinare l'attuale utilizzo della rete?