uname bozuk: şu anda çalışan çekirdeği nasıl belirlerim?


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

/ Boot içinde 3 * .vmlinuz-linux dosyası vardır. Şu anda hangi çekirdeğin çalıştığını nasıl belirleyebilirim?

Minimum bir kabuk ile sınırlı bir ortamda çalışıyorum unutmayın. Ayrıca denedim:

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

Düşüncesi olan var mı?


reboot. GRUB yüklüyse, sorununuzu çözmek için seçenekleriniz olabilir. Veya bir canlı cd veya usb kullanın ...
jcm69

2
Merak ediyorum, şeyi nasıl başlattın? Ve o ne? Bazı temel bilgi parçalarının eksik olduğu anlaşılıyor. Bu bir kurtarma mermisi mi? Daha fazla ayrıntı verebilir misiniz?
Lizardx

Takılı krom varsa bkz:chrome://system/
GAD3R

Evet, bir kurtarma kabuğu. Glibc dahil birçok paketi yükseltiyordum. Kurtarma kabuğunu çalıştıran arka plan hala canlı ve bir limanda dinliyor, bu yüzden oraya girebildim.
William Pursell

1
Görünüşe göre makine yeniden başlatıldı (örneğin, birisi bir düğmeye bastı) ve bu akademik bir soru haline geldi. Bu ilginç bir durumdu ve neye dikkat etmeniz gerektiğine dair bazı sert veriler isterdim, ancak paketin şu olduğunu varsayalım: glibc'yi yükseltmeden önce çekirdeği yükseltin ve yeniden başlatın.
William Pursell

Yanıtlar:


19

Libc'nizi (en temel sistem kütüphanesi) yükselttiniz ve şimdi hiçbir program çalışmıyor. Kesin olarak, dinamik olarak bağlı hiçbir program çalışmaz.

Özel senaryoda, yeniden başlatmanın çalışması gerekir. Yüklü olan libc için daha yeni bir çekirdek gerekir ve yeniden başlatırsanız, daha yeni bir çekirdek almanız gerekir.

Hala koşan bir kabuğunuz olduğu sürece, genellikle iyileşmenin bir yolu vardır, ancak bunun için plan yapmadıysanız zor olabilir. Bir kabuğunuz yoksa, genellikle yeniden başlatmanın dışında bir çözüm yoktur.

Burada yeniden başlatmadan kurtaramayabilirsiniz, ancak en azından hangi çekirdeğin çalıştığını kolayca bulabilirsiniz. /proc/versionHarici bir komut gerektirmeyen bir okuma yolu kullanın.

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

Hala eski libc'nin bir kopyasına sahipseniz, onunla programları çalıştırabilirsiniz. Örneğin, eski libc içerideyse /old/libve bu eski libc ile çalışan yürütülebilir dosyalarınız /old/binvarsa,

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

Statik olarak bağlı bazı ikili dosyalarınız varsa, yine de çalışırlar. Bu tür bir sorun için istatistiksel olarak bağlı sistem yardımcı programlarını yüklemenizi öneririm (ancak sorun başlamadan önce yapmanız gerekir). Örneğin, Debian / Ubuntu / Mint /… üzerinde, bir veya daha fazla busybox-static (kabuk dahil temel Linux komut satırı araçlarının koleksiyonu), kanat (bazı ekstra yerleşiklerle kabuk), zsh-static (sadece bir kabuk ama yerleşik birkaç kullanışlı araç ile).

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

yeniden başlatırsanız, daha yeni bir çekirdek almalısınız. ya da çok daha muhtemel görünüyor siyah bir ekran
kedi

LD_LIBRARY_PATH atamak harika bir öneri. Ne yazık ki, kurtarma kabuğunun dahili bir okuması yoktur, yönlendirmelere izin vermez ve hatta ortam değişkenlerinin atanmasına bile izin vermez! Kabuğa env ataması almak için bir hata veriyorum.
William Pursell

6

Bu, kütüphanenin desteklemek için derlendiğinden daha eski bir çekirdeğe çalışıyorsa glibc'nin attığı hata gibi görünüyor. Hata mesajı içindeki DL_SYSDEP_OSCHECK(FATAL)makrodasysdeps/unix/sysv/linux/dl-osinfo.h

Bunun için bir derleme zamanı seçeneği var :

--enable-kernel=version
Bu seçenek şu anda yalnızca GNU / Linux sistemlerinde kullanışlıdır. Version parametresi XYZ biçiminde olmalıdır ve oluşturulan kitaplığın desteklemesi beklenen Linux çekirdeğinin en küçük sürümünü tanımlar. Sürüm numarası ne kadar yüksek olursa uyumluluk kodu o kadar az eklenir ve kod o kadar hızlı olur.

Öyle görünüyor ki, bir nedenden dolayı, eski çekirdeği olan ancak eski çekirdeği artık desteklemeyen kurulu bir glibc içeren bir sistem çalıştırıyorsunuz. Nasıl var, hangi sistem hakkında bilgi olmadan söylemek zor, ama bir kütüphane güncellenmiş ancak çekirdek değil, bunun olabileceğini varsayabiliriz.

file yürütülebilir dosya veya kütüphane için gereken minimum sürümü gösteriyor gibi görünüyor (ancak elbette çalıştırmak için çalışan bir kütüphaneye ihtiyacınız var):

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

Yarı akım Debian sistemlerimde, gerekli çekirdek sürümü, 2.6.32kontrol ettiğim tüm ikili dosyalarda yukarıdaki gibidir;


5

Şunu deneyin:

cat /proc/version

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

Bu iyi bir düşünce, ancak uyumsuz glibc ile catmevcut değil.
William Pursell

Çok korktum, ama denemeye değerdi ...
Sven

Sadece kedi kullanılamıyor olması mı? Neden vim veya nano / proc / sürüm olmasın?
jesse_b

Nasıl olur: head /proc/version|| tail /proc/version|| sed '1q;d' /proc/version
jesse_b

0

stringsYazdırılabilir bilgileri vmlinuzdosyadan ayıklamak için command komutunu kullanın .

strings vmlinuz | grep version

Örnek çıktı:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.