uname broken: bagaimana cara saya menentukan kernel yang sedang berjalan?

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

Ada 3 * file .vmlinuz-linux di / boot. Bagaimana cara saya menentukan kernel mana yang sedang berjalan?

Perhatikan bahwa saya menjalankan dalam lingkungan terbatas dengan shell minimal. Saya juga sudah mencoba:

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

Adakah pikiran?

William Pursell
sumber
reboot Jika GRUB diinstal mungkin Anda dapat memiliki opsi untuk menyelesaikan masalah Anda. Atau gunakan live-cd atau usb ...
jcm69
2
Saya ingin tahu, bagaimana Anda mem-boot-nya? Dan apa ini? Tampaknya ada beberapa informasi kunci yang hilang. Apakah ini shell penyelamat? Bisakah Anda memberikan rincian lebih lanjut?
Lizardx
Jika Anda memasang kromium, lihat:chrome://system/
GAD3R
Ya, itu adalah shell penyelamat. Saya memperbarui banyak paket, termasuk glibc. Daemon yang menjalankan shell penyelamat masih hidup dan mendengarkan di pelabuhan, jadi saya bisa masuk ke sana.
William Pursell
1
Tampaknya mesin telah dihidupkan ulang dengan susah payah (misalnya, seseorang menekan tombol) dan ini telah menjadi pertanyaan akademis. Itu adalah keadaan yang menarik, dan saya akan menyukai beberapa data keras tentang apa yang harus diwaspadai, tapi saya kira yang perlu diperhatikan adalah: tingkatkan kernel dan reboot sebelum memutakhirkan glibc.
William Pursell

Jawaban:

19

Anda telah meningkatkan libc Anda (pustaka sistem paling dasar) dan sekarang tidak ada program yang berfungsi. Lebih tepatnya, tidak ada program yang terhubung secara dinamis.

Dalam skenario khusus Anda, reboot harus bekerja. Libc yang sekarang diinstal membutuhkan kernel yang lebih baru, dan jika Anda reboot, Anda harus mendapatkan kernel yang lebih baru.

Selama Anda masih memiliki shell yang berjalan, seringkali ada cara untuk memulihkannya, tetapi ini bisa sulit jika Anda tidak merencanakannya. Jika Anda tidak memiliki shell maka biasanya tidak ada solusi selain me-reboot.

Di sini Anda mungkin tidak dapat memulihkan tanpa me-reboot, tetapi Anda setidaknya dapat dengan mudah mengetahui kernel apa yang sedang berjalan. Cukup gunakan cara membaca /proc/versionyang tidak memerlukan perintah eksternal.

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

Jika Anda masih memiliki salinan libc lama, Anda dapat menjalankan program dengannya. Misalnya, jika libc lama ada /old/libdan Anda memiliki file executable yang berfungsi dengan libc lama ini /old/bin, Anda bisa menjalankan

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

Jika Anda memiliki beberapa binari yang terhubung secara statis, mereka akan tetap berfungsi. Saya sarankan menginstal utilitas sistem yang terhubung secara statistik untuk masalah seperti ini (tetapi Anda harus melakukannya sebelum masalah dimulai). Misalnya, pada Debian / Ubuntu / Mint / ..., instal satu atau lebih busybox-static (kumpulan alat-alat baris perintah Linux dasar termasuk shell), sash (shell dengan beberapa builtin tambahan), zsh-static (hanya shell tetapi dengan beberapa alat praktis bawaan).

busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
jika Anda reboot, Anda harus mendapatkan kernel yang lebih baru. atau layar hitam yang tampaknya jauh lebih mungkin
kucing
Menetapkan LD_LIBRARY_PATH adalah saran yang bagus. Sayangnya, shell penyelamatan tidak memiliki pembacaan internal, tidak mengizinkan pengalihan, dan bahkan tidak memungkinkan penugasan variabel lingkungan! Saya mengajukan bug untuk mendapatkan tugas env ke shell.
William Pursell
6

Itu kelihatannya error glibc melempar jika itu berjalan pada kernel yang lebih tua dari apa perpustakaan dikompilasi untuk mendukung. Pesan kesalahan ada di DL_SYSDEP_OSCHECK(FATAL)makro disysdeps/unix/sysv/linux/dl-osinfo.h

Ada opsi waktu kompilasi untuk ini:

--enable-kernel=version
Opsi ini saat ini hanya berguna pada sistem GNU / Linux. Parameter versi harus memiliki bentuk XYZ dan menjelaskan versi terkecil dari kernel Linux yang diharapkan didukung oleh pustaka yang dihasilkan. Semakin tinggi nomor versinya, semakin sedikit kode kompatibilitas yang ditambahkan, dan semakin cepat pula kodenya.

Jadi sepertinya karena alasan tertentu, Anda menjalankan sistem dengan kernel lama tetapi glibc yang terinstal yang tidak mendukung kernel lama lagi. Bagaimana Anda mendapatkannya sulit untuk mengetahui tanpa informasi tentang sistem apa itu, tetapi orang mungkin berasumsi itu bisa terjadi jika perpustakaan diperbarui tetapi kernel tidak.

file tampaknya menunjukkan versi minimum yang diperlukan oleh executable atau perpustakaan (tapi tentu saja Anda membutuhkan perpustakaan yang berfungsi untuk menjalankannya):

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

Pada sistem Debian semi-lancar saya, versi kernel yang diperlukan adalah 2.6.32seperti di atas pada semua binari yang saya periksa, yang akan membuatnya sangat tidak mungkin mengenai masalah dengan versi kernel.

ilkkachu
sumber
5

Coba dengan ini:

cat /proc/version
Sven
sumber
> cat /proc/version FATAL: kernel too old
William Pursell
Ini adalah pemikiran yang bagus, tetapi dengan glibc yang tidak kompatibel, cattidak tersedia.
William Pursell
Saya sangat takut, tetapi patut dicoba ...
Sven
Apakah hanya karena kucing tidak tersedia? Mengapa tidak vim atau nano / proc / versi?
jesse_b
Bagaimana dengan: head /proc/version|| tail /proc/version|| sed '1q;d' /proc/version
jesse_b
0

Gunakan stringsperintah untuk mengekstrak informasi yang dapat dicetak dari vmlinuzfile.

strings vmlinuz | grep version

Output sampel:

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
sumber