> 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
어떤 아이디어가 있나요?
답변1
libc(가장 기본적인 시스템 라이브러리)를 업그레이드했는데 이제 어떤 프로그램도 실행할 수 없습니다. 정확하게 말하면 프로그램은 동적 연결 없이 작동할 수 있습니다.
특정 경우에는 다시 시작하면 작동합니다. 이제 설치된 libc에는 최신 커널이 필요하며, 재부팅하면 얻을 수 있습니다.
실행 중인 셸이 있는 한 일반적으로 복구할 수 있는 방법이 있지만 준비가 되어 있지 않으면 복구가 까다로울 수 있습니다. 쉘이 없으면 일반적으로 재부팅 외에는 해결책이 없습니다.
재부팅하지 않고는 여기에서 복구할 수 없을 수도 있지만 최소한 어떤 커널이 실행되고 있는지 쉽게 확인할 수 있습니다. /proc/version
외부 명령이 필요하지 않은 읽기 방법을 사용하십시오 .
read v </proc/version; echo $v
echo $(</proc/version) # in zsh/bash/ksh
이전 libc의 복사본이 아직 있다면 이를 사용하여 프로그램을 실행할 수 있습니다. 예를 들어, 이전 libc가 있고 /old/lib
이전 libc와 함께 사용할 수 있는 실행 파일이 있는 경우 /old/bin
다음을 실행할 수 있습니다.
LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname
정적으로 연결된 바이너리가 있는 경우에도 여전히 작동합니다. 이와 같은 문제에 대해서는 통계 연결 시스템 유틸리티를 설치하는 것이 좋습니다(단, 문제가 시작되기 전에 설치해야 합니다). 예를 들어 Debian/Ubuntu/Mint/...에서는 하나 이상을 설치합니다.busybox-static(셸을 포함한 기본 Linux 명령줄 도구 모음)허리띠(몇 가지 추가 내장 기능이 있는 쉘),zsh-정적(그냥 쉘이지만 편리한 도구가 많이 내장되어 있습니다).
busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
답변2
이는 라이브러리가 지원하도록 컴파일된 커널보다 오래된 커널에서 실행 중인 경우 glibc에서 발생하는 오류인 것으로 보입니다. DL_SYSDEP_OSCHECK(FATAL)
매크로 의 오류 메시지sysdeps/unix/sysv/linux/dl-osinfo.h
가지다컴파일 타임 옵션이를 위해:
--enable-kernel=version
이 옵션은 현재 GNU/Linux 시스템에서만 사용할 수 있습니다. 버전 매개변수는 생성된 라이브러리가 지원할 것으로 예상되는 Linux 커널의 최소 버전을 설명하는 XYZ 형식이어야 합니다. 버전 번호가 높을수록 호환성 코드가 덜 추가되고 코드를 더 빨리 얻을 수 있습니다.
따라서 어떤 이유에서든 이전 커널을 사용하는 시스템을 실행하고 있는 것 같지만 설치된 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
내 최신 Debian 시스템에서는 2.6.32
내가 확인한 모든 바이너리에 필요한 커널 버전이 동일하므로 커널 버전에 문제가 발생할 가능성이 거의 없습니다.
답변3
이것을 사용해 보세요:
cat /proc/version
답변4
명령을 사용하여 strings
파일에서 인쇄 가능한 정보를 추출합니다 vmlinuz
.
strings vmlinuz | grep version
예제 출력:
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)