uname bị hỏng: làm cách nào để xác định kernel hiện đang chạy?


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

Có 3 * .vmlinuz-linux tệp trong / boot. Làm cách nào để xác định kernel nào đang chạy?

Lưu ý rằng tôi đang chạy trong một môi trường hạn chế với lớp vỏ tối thiểu. Tôi cũng đã thử:

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

Có suy nghĩ gì không?


khởi động lại. Nếu GRUB được cài đặt, có thể bạn có các tùy chọn để giải quyết vấn đề của mình. Hoặc sử dụng đĩa CD hoặc usb trực tiếp ...
jcm69

2
Tôi tò mò, làm thế nào bạn khởi động điều này? Và nó là gì? Có vẻ như thiếu một số thông tin quan trọng. Đây có phải là một vỏ cứu hộ? Bạn có thể cung cấp chi tiết hơn?
Lizardx

Nếu bạn đã cài đặt crom, hãy xem:chrome://system/
GAD3R

Vâng, đó là một vỏ cứu hộ. Tôi đã nâng cấp nhiều gói, bao gồm cả glibc. Các daemon chạy vỏ cứu hộ vẫn còn sống và lắng nghe trên một cổng, vì vậy tôi đã có thể vào trong đó.
William Pursell

1
Có vẻ như máy đã được khởi động lại khó khăn (ví dụ, ai đó đã nhấn nút) và điều này đã trở thành một câu hỏi học thuật. Đó là một trạng thái thú vị và tôi sẽ thích một số dữ liệu cứng về những gì cần chú ý, nhưng tôi cho rằng điều đáng nói là: nâng cấp kernel và khởi động lại trước khi nâng cấp glibc.
William Pursell

Câu trả lời:


19

Bạn đã nâng cấp libc của mình (thư viện hệ thống cơ bản nhất) và hiện tại không có chương trình nào hoạt động. Nói chính xác, không có chương trình liên kết động nào hoạt động.

Trong kịch bản cụ thể của bạn, khởi động lại sẽ hoạt động. Libc hiện được cài đặt yêu cầu kernel mới hơn và nếu bạn khởi động lại, bạn sẽ nhận được kernel mới hơn.

Miễn là bạn vẫn còn vỏ chạy, thường có cách để phục hồi, nhưng sẽ rất khó nếu bạn không lập kế hoạch cho nó. Nếu bạn không có shell thì thường không có giải pháp nào khác ngoài việc khởi động lại.

Ở đây bạn có thể không phục hồi được nếu không khởi động lại, nhưng ít nhất bạn có thể dễ dàng tìm ra kernel nào đang chạy. Chỉ cần sử dụng một cách để đọc /proc/versionmà không yêu cầu một lệnh bên ngoài.

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

Nếu bạn vẫn còn một bản sao của libc cũ, bạn có thể chạy các chương trình với nó. Ví dụ: nếu libc cũ nằm trong /old/libvà bạn có các tệp thực thi hoạt động với libc cũ này /old/bin, bạn có thể chạy

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

Nếu bạn có một số nhị phân được liên kết tĩnh, chúng sẽ vẫn hoạt động. Tôi khuyên bạn nên cài đặt các tiện ích hệ thống được liên kết thống kê cho loại vấn đề này (nhưng bạn phải làm điều đó trước khi vấn đề bắt đầu). Ví dụ: trên Debian / Ubuntu / Mint /, hãy cài đặt một hoặc nhiều busybox-static (bộ sưu tập các công cụ dòng lệnh Linux cơ bản bao gồm shell), sash (shell có thêm một số nội dung bổ sung), zsh-static (chỉ là một trình bao với khá nhiều công cụ tiện dụng được tích hợp sẵn).

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

nếu bạn khởi động lại, bạn sẽ nhận được kernel mới hơn. hoặc một màn hình đen dường như rất có thể
con mèo

Chỉ định LD_LIBRARY_PATH là một gợi ý tuyệt vời. Thật không may, shell cứu hộ không có đọc nội bộ, không cho phép chuyển hướng và thậm chí không cho phép gán biến môi trường! Tôi đang nộp một lỗi để nhận env gán vào shell.
William Pursell

6

Đó dường như là lỗi glibc ném nếu nó chạy trên kernel cũ hơn so với những gì thư viện được biên dịch để hỗ trợ. Thông báo lỗi nằm trong DL_SYSDEP_OSCHECK(FATAL)macro trongsysdeps/unix/sysv/linux/dl-osinfo.h

một tùy chọn thời gian biên dịch cho việc này:

--enable-kernel=version
Tùy chọn này hiện chỉ hữu ích trên các hệ thống GNU / Linux. Tham số phiên bản phải có dạng XYZ và mô tả phiên bản nhỏ nhất của nhân Linux mà thư viện được tạo dự kiến ​​sẽ hỗ trợ. Số phiên bản càng cao, mã tương thích càng được thêm ít và mã càng nhanh.

Vì vậy, có vẻ như vì một số lý do, bạn đang chạy một hệ thống với kernel cũ nhưng glibc đã cài đặt không hỗ trợ kernel cũ nữa. Làm thế nào bạn có được điều khó nói nếu không có thông tin về hệ thống đó là gì, nhưng người ta có thể cho rằng điều đó có thể xảy ra nếu thư viện được cập nhật nhưng kernel không có.

file dường như hiển thị phiên bản tối thiểu được yêu cầu bởi một thư viện thực thi hoặc thư viện (nhưng tất nhiên bạn cần một thư viện làm việc để chạy nó):

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

Trên các hệ thống Debian bán hiện tại của tôi, phiên bản kernel được yêu cầu 2.6.32như trên trên tất cả các tệp nhị phân mà tôi đã kiểm tra, điều này sẽ khiến nó không có khả năng gặp sự cố với phiên bản kernel.


5

Hãy thử với điều này:

cat /proc/version

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

Đây là một suy nghĩ tốt, nhưng với glibc không tương thích, catkhông có sẵn.
William Pursell

Tôi đã sợ rất nhiều, nhưng nó đáng để thử ...
Sven

Có phải chỉ vì mèo không có sẵn? Tại sao không phải là vim hoặc nano / Proc / phiên bản?
jesse_b

Làm thế nào về: head /proc/version|| tail /proc/version| | sed '1q;d' /proc/version
jesse_b

0

Sử dụng stringslệnh để trích xuất thông tin có thể in từ vmlinuztệp.

strings vmlinuz | grep version

Đầu ra mẫu:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.