अनाम टूट गया है: मैं वर्तमान में चल रहे कर्नेल का निर्धारण कैसे करूं?


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

3 * .vmlinuz-linux फाइलें / बूट में हैं। मैं यह कैसे निर्धारित करूं कि वर्तमान में कौन सा कर्नेल चल रहा है?

ध्यान दें कि मैं एक सीमित वातावरण में एक न्यूनतम शेल के साथ चल रहा हूं। मैंने भी कोशिश की है:

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

कोई विचार?


रिबूट। यदि GRUB स्थापित है तो शायद आपके पास अपनी समस्या को हल करने के लिए विकल्प हो सकते हैं। या एक लाइव-सीडी या यूएसबी का उपयोग करें ...
jcm69

2
मैं उत्सुक हूं, आपने बात को कैसे बूट किया? और वो क्या है? जानकारी के कुछ प्रमुख बिट्स गुम होने लगते हैं। क्या यह बचाव कवच है? क्या आप अधिक विवरण प्रदान कर सकते हैं?
छिपकली

यदि आपके पास क्रोमियम स्थापित है तो देखें:chrome://system/
GAD3R

हाँ, यह एक बचाव कवच है। मैं glibc सहित कई पैकेजों को अपग्रेड कर रहा था। बचाव शेल चलाने वाला डेमॉन अभी भी जीवित है और एक बंदरगाह पर सुन रहा है, इसलिए मैं वहां जाने में सक्षम था।
विलियम पर्ससेल

1
ऐसा प्रतीत होता है कि मशीन को हार्ड-रीस्टार्ट किया गया है (जैसे, किसी ने एक बटन दबाया) और यह एक अकादमिक प्रश्न बन गया है। यह एक दिलचस्प स्थिति थी, और मुझे कुछ कठिन डेटा पसंद आए थे, जो कि बाहर देखने के लिए थे, लेकिन मुझे लगता है कि टेकअवे है: कर्नेल को अपग्रेड करें और ग्लिबक को अपग्रेड करने से पहले रिबूट करें।
विलियम पर्ससेल

जवाबों:


19

आपने अपना libc (सबसे बुनियादी सिस्टम लाइब्रेरी) अपग्रेड किया है और अब कोई प्रोग्राम काम नहीं करता है। सटीक होने के लिए, कोई गतिशील रूप से जुड़ा हुआ कार्यक्रम काम नहीं करता है।

आपके विशेष परिदृश्य में, रिबूटिंग को काम करना चाहिए। अब स्थापित libc में एक नए कर्नेल की आवश्यकता होती है, और यदि आप रिबूट करते हैं, तो आपको उस नए कर्नेल को प्राप्त करना चाहिए।

जब तक आपके पास अभी भी एक शेल चल रहा है, तब तक अक्सर ठीक होने का एक तरीका है, लेकिन अगर आप इसके लिए योजना नहीं बनाते हैं तो यह मुश्किल हो सकता है। यदि आपके पास शेल नहीं है तो आमतौर पर रिबूट करने के अलावा कोई उपाय नहीं है।

यहां आप रिबूट किए बिना ठीक नहीं हो सकते हैं, लेकिन आप कम से कम आसानी से पता लगा सकते हैं कि कर्नेल क्या चल रहा है। बस पढ़ने के लिए एक ऐसे तरीके का उपयोग करें जिसमें /proc/versionबाहरी कमांड की आवश्यकता न हो।

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

यदि आपके पास अभी भी पुराने लिबास की एक प्रति है, तो आप इसके साथ कार्यक्रम चला सकते हैं। उदाहरण के लिए, यदि पुराना libc अंदर है /old/libऔर आपके पास निष्पादन योग्य हैं जो इस पुराने libc के साथ काम करते हैं /old/bin, तो आप चला सकते हैं

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

यदि आपके पास कुछ वैधानिक रूप से जुड़े बायनेरिज़ हैं, तो वे अभी भी काम करेंगे। मैं इस तरह की समस्या के लिए सांख्यिकीय रूप से जुड़े सिस्टम उपयोगिताओं को स्थापित करने की सलाह देता हूं (लेकिन समस्या शुरू होने से पहले आपको इसे करना होगा)। उदाहरण के लिए, डेबियन / उबंटू / मिंट /… पर, एक या एक से अधिक बिजीबॉक्स-स्टैटिक (शेल सहित बेसिक लिनक्स कमांड लाइन टूल्स का संग्रह), सैश (कुछ अतिरिक्त बिलिंस के साथ शेल), zsh-static (सिर्फ एक शेल लेकिन स्थापित करें) में निर्मित कुछ आसान उपकरण के साथ।

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

यदि आप रिबूट करते हैं, तो आपको उस नए कर्नेल को प्राप्त करना चाहिए। या एक काली स्क्रीन जो कहीं अधिक संभावना लगती है
बिल्ली

LD_LIBRARY_PATH को असाइन करना एक शानदार सुझाव है। दुर्भाग्य से, बचाव शेल में आंतरिक रीड नहीं है, पुनर्निर्देशन की अनुमति नहीं देता है, और पर्यावरण चर के असाइनमेंट की अनुमति भी नहीं देता है! मैं शेल में env असाइनमेंट प्राप्त करने के लिए एक बग फाइल कर रहा हूं।
विलियम पर्सेल

6

प्रतीत होता है कि त्रुटि glibc फेंकता है यदि यह एक कर्नेल पर चल रहा है जो लाइब्रेरी के समर्थन के लिए संकलित पुराने से अधिक है। त्रुटि संदेश DL_SYSDEP_OSCHECK(FATAL)मैक्रो में हैsysdeps/unix/sysv/linux/dl-osinfo.h

इसके लिए एक संकलन समय विकल्प है:

--enable-kernel=version
यह विकल्प वर्तमान में केवल GNU / Linux सिस्टम पर उपयोगी है। संस्करण पैरामीटर में फॉर्म XYZ होना चाहिए और लिनक्स कर्नेल के सबसे छोटे संस्करण का वर्णन करता है जो उत्पन्न लाइब्रेरी का समर्थन करने की उम्मीद है। संस्करण संख्या जितनी अधिक होगी, कम संगतता कोड जोड़ा जाता है, और कोड जितनी तेज़ी से प्राप्त होता है।

तो ऐसा लगता है कि किसी कारण से, आप एक पुराने कर्नेल के साथ एक सिस्टम चला रहे हैं, लेकिन एक स्थापित ग्लिबक जो पुराने कर्नेल का समर्थन नहीं करता है। आपको यह कैसे पता चलता है कि यह किस सिस्टम में है, इस बारे में जानकारी के बिना बताना मुश्किल है, लेकिन कोई यह मान सकता है कि लाइब्रेरी अपडेट होने पर ऐसा हो सकता है लेकिन कर्नेल नहीं है।

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
विलियम पर्सेल

यह एक अच्छा विचार है, लेकिन असंगत glibc के साथ, catउपलब्ध नहीं है।
विलियम पर्सेल

मुझे बहुत डर था, लेकिन यह एक कोशिश के लायक था ...
स्वेन

क्या सिर्फ इसलिए कि बिल्ली अनुपलब्ध है? फिर 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.