uname está quebrado: como determino o kernel atualmente em execução?

13
> uname -r
FATAL: kernel too old
> cat /proc/cmdline
FATAL: kernel too old

Existem 3 * arquivos .vmlinuz-linux em / boot. Como determino qual kernel está sendo executado atualmente?

Observe que estou executando em um ambiente limitado com um shell mínimo. Eu também tentei:

> sh -c 'read l < /proc/version; echo $l'
FATAL: kernel too old
> dd if=/proc/version
FATAL: kernel too old

Alguma ideia?

William Pursell
fonte
reiniciar. Se o GRUB estiver instalado, talvez você tenha opções para resolver seu problema. Ou usar um CD ao vivo ou usb ...
jcm69
2
Estou curioso, como você começou a coisa? E o que é isso? Parece estar faltando alguns bits-chave de informação. Isso é uma concha de resgate? Você pode fornecer mais detalhes?
Lizardx
Se você possui o cromo instalado, consulte:chrome://system/
GAD3R
Sim, é uma concha de resgate. Eu estava atualizando muitos pacotes, incluindo o glibc. O daemon executando o shell de resgate ainda está vivo e escutando em uma porta, então eu pude entrar lá.
William Pursell
1
Parece que a máquina foi reiniciada com força (por exemplo, alguém pressionou um botão) e isso se tornou uma questão acadêmica. Era um estado interessante, e eu gostaria de ter alguns dados concretos sobre o que procurar, mas suponho que o principal é: atualizar o kernel e reiniciar antes de atualizar o glibc.
William Pursell

Respostas:

19

Você atualizou sua libc (a biblioteca mais básica do sistema) e agora nenhum programa funciona. Para ser preciso, nenhum programa vinculado dinamicamente funciona.

No seu cenário específico, a reinicialização deve funcionar. A libc agora instalada requer um kernel mais recente e, se você reiniciar, deverá obter esse kernel mais recente.

Contanto que você ainda tenha um shell em execução, geralmente há uma maneira de se recuperar, mas pode ser complicado se você não planejou. Se você não possui um shell, normalmente não há outra solução além da reinicialização.

Aqui você pode não conseguir se recuperar sem reiniciar, mas pode pelo menos facilmente descobrir qual kernel está executando. Basta usar uma maneira de ler /proc/versionque não requer um comando externo.

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

Se você ainda tiver uma cópia da libc antiga, poderá executar programas com ela. Por exemplo, se a libc antiga estiver dentro /old/libe você tiver executáveis ​​que funcionam com essa libc antiga /old/bin, você poderá executar

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

Se você tiver alguns binários vinculados estaticamente, eles ainda funcionarão. Eu recomendo instalar utilitários de sistema vinculados estatisticamente para esse tipo de problema (mas você precisa fazer isso antes que o problema comece). Por exemplo, no Debian / Ubuntu / Mint /…, instale um ou mais do busybox-static (coleção de ferramentas básicas de linha de comando do Linux, incluindo um shell), sash (shell com alguns recursos adicionais) e zsh-static (apenas um shell, mas com algumas ferramentas úteis integradas).

busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
Gilles 'SO- parar de ser mau'
fonte
se você reiniciar, deverá obter o kernel mais recente. ou uma tela preta que parece muito mais provável #
cat
Atribuir LD_LIBRARY_PATH é uma ótima sugestão. Infelizmente, o shell de resgate não possui uma leitura interna, não permite redirecionamentos e nem permite a atribuição de variáveis ​​de ambiente! Estou registrando um bug para obter a atribuição de env no shell.
precisa
6

Esse parece ser o erro que o glibc lança se estiver sendo executado em um kernel mais antigo do que o suportado pela biblioteca. A mensagem de erro está na DL_SYSDEP_OSCHECK(FATAL)macro emsysdeps/unix/sysv/linux/dl-osinfo.h

uma opção de tempo de compilação para isso:

--enable-kernel=version
Atualmente, esta opção é útil apenas em sistemas GNU / Linux. O parâmetro version deve ter o formato XYZ e descreve a versão menor do kernel Linux que a biblioteca gerada deve suportar. Quanto maior o número da versão, menos código de compatibilidade é adicionado e mais rápido o código fica.

Parece que, por alguma razão, você está executando um sistema com um kernel antigo, mas com uma glibc instalada que não suporta mais o kernel antigo. É difícil dizer como você conseguiu a informação sem informações sobre qual sistema é, mas pode-se supor que isso poderia acontecer se a biblioteca for atualizada, mas o kernel não.

file parece mostrar a versão mínima exigida por um executável ou uma biblioteca (mas é claro que você precisa de uma biblioteca de trabalho para executá-lo):

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

Nos meus sistemas Debian semi-atuais, a versão requerida do kernel é 2.6.32como acima em todos os binários que verifiquei, o que tornaria bastante improvável que ocorresse um problema com a versão do kernel.

ilkkachu
fonte
5

Tente com isto:

cat /proc/version
Sven
fonte
> cat /proc/version FATAL: kernel too old
William Pursell
Este é um bom pensamento, mas com o glibc incompatível, catnão está disponível.
William Pursell
Eu temia tanto, mas valia a pena tentar ...
Sven
É apenas porque o gato não está disponível? Por que não vim ou nano / proc / version então?
21417 jesse_b
Que tal: head /proc/version|| tail /proc/version|| sed '1q;d' /proc/version
Jesson #
0

Use o stringscomando para extrair as informações imprimíveis do vmlinuzarquivo.

strings vmlinuz | grep version

Saída de amostra:

4.9.0-6-amd64 ([email protected]) (gcc version 6.3.0 20170516
(Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02)
GAD3R
fonte