uname เสีย: ฉันจะตรวจสอบเคอร์เนลที่ใช้งานอยู่ในปัจจุบันได้อย่างไร?


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

มี 3 * .vmlinuz-linux ไฟล์ใน / boot ฉันจะตรวจสอบว่าเคอร์เนลใดกำลังทำงานอยู่ในปัจจุบัน?

โปรดทราบว่าฉันกำลังทำงานในสภาพแวดล้อมที่ จำกัด ด้วยกระสุนน้อยที่สุด ฉันยังลอง:

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

ความคิดใด ๆ


รีบูต หากมีการติดตั้งด้วงคุณอาจมีตัวเลือกในการแก้ปัญหาของคุณ หรือใช้ live-cd หรือ usb ...
jcm69

2
ฉันอยากรู้อยากเห็นคุณบูตสิ่งนั้นได้อย่างไร แล้วมันคืออะไร ดูเหมือนว่าจะขาดข้อมูลสำคัญบางอย่าง นี่เป็นเปลือกกู้ภัยหรือไม่? คุณสามารถให้รายละเอียดเพิ่มเติมได้หรือไม่?
Lizardx

หากคุณติดตั้งโครเมียมไว้ให้ดู:chrome://system/
GAD3R

ใช่มันเป็นเปลือกกู้ภัย ฉันกำลังอัพเกรดแพ็คเกจมากมายรวมถึง glibc ภูตที่ใช้เปลือกกู้ภัยยังคงมีชีวิตอยู่และกำลังฟังพอร์ตดังนั้นฉันจึงสามารถเข้าไปที่นั่นได้
วิลเลียม Pursell

1
ดูเหมือนว่าเครื่องได้รีสตาร์ทอย่างหนัก (เช่นมีคนกดปุ่ม) และนี่กลายเป็นคำถามเชิงวิชาการ มันเป็นสถานะที่น่าสนใจและฉันจะชอบข้อมูลที่ยากลำบากเกี่ยวกับสิ่งที่ต้องระวัง แต่ฉันคิดว่า Takeaway คืออัพเกรดเคอร์เนลและรีบูตก่อนอัพเกรด glibc
วิลเลียม Pursell

คำตอบ:


19

คุณได้อัพเกรด libc ของคุณ (ไลบรารี่ระบบพื้นฐานที่สุด) และตอนนี้ไม่มีโปรแกรมใดทำงานได้ เพื่อความแม่นยำไม่มีโปรแกรมที่เชื่อมโยงแบบไดนามิกทำงาน

ในสถานการณ์เฉพาะของคุณการรีบูตเครื่องควรทำงาน libc ที่ติดตั้งแล้วในตอนนี้ต้องการเคอร์เนลที่ใหม่กว่าและถ้าคุณรีบูทคุณควรจะได้เคอร์เนลที่ใหม่กว่านั้น

ตราบใดที่คุณยังมีเชลล์ที่ใช้งานอยู่มีวิธีการกู้คืนอยู่บ่อยครั้ง แต่มันอาจเป็นเรื่องยากหากคุณไม่ได้วางแผนไว้ หากคุณไม่มีเชลล์แล้วโดยทั่วไปจะไม่มีวิธีการอื่นนอกจากการรีบูต

ที่นี่คุณอาจไม่สามารถกู้คืนได้โดยไม่ต้องรีบูตเครื่อง แต่อย่างน้อยคุณสามารถค้นหาว่าเคอร์เนลใดทำงานอยู่ เพียงใช้วิธีการอ่าน/proc/versionที่ไม่ต้องใช้คำสั่งภายนอก

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

หากคุณยังมีสำเนาของ libc เก่าอยู่รอบ ๆ คุณสามารถเรียกใช้โปรแกรมด้วย ตัวอย่างเช่นหาก libc เก่าอยู่ใน/old/libและคุณมี executables ที่ทำงานกับ libc เก่านี้/old/binคุณสามารถเรียกใช้

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

หากคุณมีไบนารีที่เชื่อมโยงแบบคงที่จะยังคงใช้งานได้ ฉันขอแนะนำให้ติดตั้งโปรแกรมอรรถประโยชน์ระบบที่เชื่อมโยงทางสถิติสำหรับปัญหาประเภทนี้ (แต่คุณต้องทำก่อนที่ปัญหาจะเริ่มขึ้น) ตัวอย่างเช่นบน Debian / Ubuntu / Mint / …ให้ติดตั้งหนึ่งหรือมากกว่าหนึ่งของbusybox-static (ชุดเครื่องมือพื้นฐานบรรทัดคำสั่ง Linux รวมถึงเชลล์), sash (เชลล์ที่มี builtins พิเศษ), zsh-static (เพียงเชลล์ แต่ ด้วยเครื่องมือที่มีประโยชน์อยู่ในตัว)

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

หากคุณรีบูทคุณควรจะได้เคอร์เนลที่ใหม่กว่านี้ หรือหน้าจอสีดำซึ่งดูเหมือนว่ามีแนวโน้มมากขึ้น
แมว

การกำหนด LD_LIBRARY_PATH เป็นข้อเสนอแนะที่ยอดเยี่ยม น่าเสียดายที่เปลือกกู้ภัยไม่มีการอ่านภายในไม่อนุญาตการเปลี่ยนเส้นทางและไม่อนุญาตการกำหนดตัวแปรสภาพแวดล้อม! ฉันกำลังยื่นข้อบกพร่องเพื่อรับการมอบหมาย env ลงในเปลือก
วิลเลียม Pursell

6

ที่ดูเหมือนจะเป็นข้อผิดพลาด glibc พ่นถ้ามันทำงานบนเคอร์เนลที่เก่ากว่าสิ่งที่ห้องสมุดจะรวบรวมเพื่อสนับสนุน ข้อความแสดงข้อผิดพลาดอยู่ในDL_SYSDEP_OSCHECK(FATAL)มาโครsysdeps/unix/sysv/linux/dl-osinfo.h

มีตัวเลือกเวลารวบรวมสำหรับสิ่งนี้:

--enable-kernel=version
ขณะนี้ตัวเลือกนี้มีประโยชน์สำหรับระบบ GNU / Linux เท่านั้น พารามิเตอร์ version ควรมีรูปแบบ XYZ และอธิบายถึงเวอร์ชันที่เล็กที่สุดของเคอร์เนล Linux ที่คาดว่าจะสนับสนุนไลบรารีที่สร้างขึ้น หมายเลขรุ่นที่สูงกว่าจะมีการเพิ่มรหัสความเข้ากันได้น้อยลงและรหัสจะได้รับเร็วขึ้น

ดังนั้นดูเหมือนว่าด้วยเหตุผลบางอย่างคุณกำลังใช้ระบบที่มีเคอร์เนลเก่า แต่ติดตั้ง glibc ซึ่งไม่สนับสนุนเคอร์เนลเก่าอีกต่อไป วิธีที่คุณได้รับนั้นเป็นเรื่องยากที่จะบอกโดยไม่มีข้อมูลเกี่ยวกับระบบ แต่มันอาจจะคิดว่าอาจเกิดขึ้นได้หากห้องสมุดได้รับการปรับปรุง แต่เคอร์เนลไม่ใช่

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
วิลเลียม Pursell

นี่เป็นความคิดที่ดี แต่ด้วย glibc ที่เข้ากันไม่ได้catก็ไม่สามารถใช้ได้
วิลเลียม Pursell

ฉันกลัวเท่า แต่มันก็คุ้มค่าลอง ...
Sven

เป็นเพราะแมวใช้งานไม่ได้หรือ ทำไมไม่เป็นกลุ่มหรือนาโน / proc / รุ่น?
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.