আনম ভাঙা: আমি বর্তমানে চলমান কার্নেলটি কীভাবে নির্ধারণ করব?


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

/ বুটে 3 * .vmlinuz- লিনাক্স ফাইল রয়েছে। বর্তমানে কোন কার্নেলটি চলছে তা আমি কীভাবে নির্ধারণ করব?

মনে রাখবেন যে আমি একটি ন্যূনতম শেল নিয়ে সীমিত পরিবেশে চলেছি। আমি চেষ্টা করেছি:

> 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

হ্যাঁ, এটি একটি উদ্ধার শেল। আমি গ্লিবিসি সহ অনেকগুলি প্যাকেজ আপগ্রেড করছিলাম। উদ্ধার শেলটি চালাচ্ছে এই ডিমন এখনও বেঁচে আছে এবং একটি বন্দরে শুনছে, তাই আমি সেখানে ableুকতে পেরেছি।
উইলিয়াম পার্সেল

1
মনে হচ্ছে মেশিনটি হার্ড-পুনরায় চালু করা হয়েছে (যেমন, কেউ একটি বোতাম টিপেছিল) এবং এটি একাডেমিক প্রশ্নে পরিণত হয়েছে। এটি একটি আকর্ষণীয় অবস্থা ছিল এবং আমি কী সন্ধান করব সে সম্পর্কে কিছু হার্ড ডেটা পছন্দ করতাম তবে আমি মনে করি গ্রহণযোগ্যতাটি হ'ল: গ্লিবিকে আপগ্রেড করার আগে কার্নেলটি আপগ্রেড করুন এবং পুনরায় বুট করুন।
উইলিয়াম পার্সেল

উত্তর:


19

আপনি আপনার 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- / মিন্ট চালু / ..., এক বা একাধিক ইনস্টল , busybox স্ট্যাটিক (ক শেল সহ মৌলিক লিনাক্স কমান্ড লাইন টুলস সংগ্রহে), উত্তরীয় (কিছু অতিরিক্ত builtins সঙ্গে শেল), zsh স্ট্যাটিক (শুধু একটি শেল কিন্তু বেশ কয়েকটি হাতে তৈরি সরঞ্জাম সহ অন্তর্নির্মিত)।

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

আপনি যদি পুনরায় বুট করেন তবে আপনার সেই নতুন কার্নেলটি পাওয়া উচিত। বা একটি কালো পর্দা যা আরও বেশি সম্ভবত বলে মনে হচ্ছে
বিড়াল

এলডি_লিবিআরএইপিএটিএইচ নির্ধারণ করা দুর্দান্ত পরামর্শ is দুর্ভাগ্যক্রমে, উদ্ধার শেলের কোনও অভ্যন্তরীণ পঠন নেই, পুনর্নির্দেশগুলি মঞ্জুরি দেয় না এবং এমনকি পরিবেশের ভেরিয়েবলগুলির অ্যাসাইনমেন্টের অনুমতি দেয় না! শেলের মধ্যে এনভিনিশন অ্যাসাইনমেন্ট পেতে আমি একটি বাগ ফাইল করছি।
উইলিয়াম পার্সেল

6

লাইব্রেরিটি সমর্থন করার জন্য যা সংকলিত হয়েছে তার চেয়ে পুরনো কোনও কার্নেলটিতে এটি চলমান থাকলে ত্রুটিটি গ্লিবসি নিক্ষেপ করে বলে মনে হয়। ত্রুটি বার্তাটি DL_SYSDEP_OSCHECK(FATAL)ম্যাক্রো ইনsysdeps/unix/sysv/linux/dl-osinfo.h

এর জন্য একটি সংকলন সময় বিকল্প রয়েছে :

--enable-kernel=version
এই বিকল্পটি বর্তমানে কেবল জিএনইউ / লিনাক্স সিস্টেমে কার্যকর। সংস্করণ প্যারামিটারে 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
উইলিয়াম পার্সেল

এটি একটি ভাল চিন্তা, তবে বেমানান গ্লিবসি সহ catপাওয়া যায় না।
উইলিয়াম পার্সেল

আমি যতটা ভয়, কিন্তু এটা ব্যবহার করে দেখুন মূল্য ছিল ...
সেভেন

বিড়াল অনুপলব্ধ কারণ এটি কি? কেন তখন ভিএম বা ন্যানো / প্রোক / সংস্করণ নয়?
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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.