uname이 깨졌습니다 : 현재 실행중인 커널을 어떻게 확인합니까?


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

/ boot에는 3 개의 * .vmlinuz-linux 파일이 있습니다. 현재 실행중인 커널을 어떻게 확인합니까?

최소한의 셸로 제한된 환경에서 실행되고 있습니다. 나는 또한 시도했다 :

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

이견있는 사람?


재부팅하십시오. GRUB이 설치된 경우 문제를 해결하기위한 옵션이있을 수 있습니다. 또는 라이브 CD 또는 USB를 사용하여 ...
jcm69

2
궁금해서 어떻게 부팅 했습니까? 그리고 이것은 무엇입니까? 일부 핵심 정보가 누락 된 것 같습니다. 이것은 구조용 껍질입니까? 더 자세한 정보를 제공 할 수 있습니까?
Lizardx

크롬을 설치했다면 다음을 참조하십시오 :chrome://system/
GAD3R

그렇습니다, 그것은 구조 포탄입니다. glibc를 포함한 많은 패키지를 업그레이드하고있었습니다. 복구 쉘을 실행하는 데몬은 여전히 ​​살아 있고 포트에서 수신 대기 중이므로 거기에 들어갈 수있었습니다.
William Pursell

1
기기가 다시 시작 (예 : 누군가 버튼을 눌렀 음) 된 것으로 보이며 이는 학문적 문제가되었습니다. 그것은 흥미로운 상태였으며, 무엇을 찾아야할지에 대한 하드 데이터를 좋아했을 것입니다. 그러나 glibc를 업그레이드하기 전에 커널을 업그레이드하고 재부팅하는 것이 좋습니다.
William Pursell

답변:


19

libc (가장 기본적인 시스템 라이브러리)를 업그레이드했으며 이제 프로그램이 작동하지 않습니다. 정확하게 말하면 동적으로 연결된 프로그램이 작동하지 않습니다.

특정 시나리오에서는 재부팅이 작동합니다. 현재 설치된 libc에는 최신 커널이 필요하며 재부팅하면 최신 커널을 가져와야합니다.

여전히 실행중인 쉘이있는 한 복구 할 수있는 방법이 있지만 계획하지 않은 경우 까다로울 수 있습니다. 쉘이 없다면 일반적으로 재부팅 이외의 해결책은 없습니다.

여기서는 재부팅하지 않고 복구 할 수 없지만 최소한 어떤 커널이 실행 중인지 쉽게 찾을 수 있습니다. /proc/version외부 명령이 필요없는 읽는 방법을 사용하십시오 .

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

여전히 오래된 libc 사본이 있으면 프로그램을 실행할 수 있습니다. 예를 들어, 이전 libc가 있고이 이전 libc /old/lib와 작동하는 실행 파일이있는 /old/bin경우 다음을 실행할 수 있습니다.

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

정적으로 링크 된 바이너리가있는 경우 여전히 작동합니다. 이런 종류의 문제에 대해 통계적으로 연결된 시스템 유틸리티를 설치하는 것이 좋습니다 (그러나 문제가 시작되기 전에해야합니다). 예를 들어, Debian / Ubuntu / Mint /…에서 busybox-static (쉘을 포함한 기본 Linux 명령 행 도구 모음), sash (일부 내장 쉘), zsh-static ( 쉘만 있지만 몇 가지 편리한 도구가 내장되어 있습니다).

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

재부팅하면 최신 커널을 얻게됩니다. 또는 훨씬 더 가능성이있는 검은 색 화면
cat

LD_LIBRARY_PATH를 할당하는 것이 좋습니다. 불행히도, 구조 쉘은 내부 읽기가없고, 리디렉션을 허용하지 않으며, 환경 변수의 할당조차 허용하지 않습니다! 쉘에 env 할당을 얻기 위해 버그를 제기하고 있습니다.
윌리엄 퍼셀

6

라이브러리가 지원하도록 컴파일 된 것보다 오래된 커널에서 실행중인 경우 glibc가 발생하는 오류 인 것 같습니다. 오류 메시지는 DL_SYSDEP_OSCHECK(FATAL)매크로에 있습니다.sysdeps/unix/sysv/linux/dl-osinfo.h

이것에 대한 컴파일 시간 옵션 이 있습니다 :

--enable-kernel=version
이 옵션은 현재 GNU / Linux 시스템에서만 유용합니다. version 매개 변수는 XYZ 형식이어야하며 생성 된 라이브러리가 지원할 것으로 예상되는 가장 작은 Linux 커널 버전을 설명합니다. 버전 번호가 높을수록 호환성 코드가 추가되지 않으며 코드가 더 빨라집니다.

따라서 어떤 이유로 이전 커널을 사용하지만 이전 커널을 더 이상 지원하지 않는 glibc가 설치된 시스템을 실행하는 것 같습니다. 어떤 시스템인지에 대한 정보 없이는 알기가 어렵지만 라이브러리가 업데이트되었지만 커널이 업데이트되지 않은 경우 발생할 수 있다고 가정 할 수 있습니다.

file 실행 파일이나 라이브러리에 필요한 최소 버전을 표시하는 것 같습니다 (물론 실행하려면 라이브러리가 필요합니다).

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

반 현재 데비안 시스템에서 필요한 커널 버전은 2.6.32내가 확인한 모든 바이너리에서 위와 같으므로 커널 버전에 문제가 발생하지 않을 것입니다.


5

이것으로 시도하십시오 :

cat /proc/version

> cat /proc/version FATAL: kernel too old
William Pursell

이것은 좋은 생각이지만 호환되지 않는 glibc와 함께 cat사용할 수 없습니다.
William Pursell

많이 두려워했지만 시도해 볼만한 가치가있었습니다.
Sven

고양이를 사용할 수 없기 때문입니까? 그렇다면 vim 또는 nano / proc / version은 어떻습니까?
jesse_b

어떻습니까 : head /proc/version|| tail /proc/version|| sed '1q;d' /proc/version
jesse_b

0

strings명령을 사용 하여 vmlinuz파일 에서 인쇄 가능한 정보를 추출 하십시오.

strings vmlinuz | grep version

샘플 출력 :

4.9.0-6-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516
(Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.