จะเกิดอะไรขึ้นหาก init ถูกลบ


22

เป็นเพียงคำถามเชิงทฤษฎี ...

แต่จะเกิดอะไรขึ้นหากinit(ใน/sbin/init) ลบออก?


อย่าลอง ln -L- มันใช้ไม่ได้ cp /proc/fd/1/exe /sbin/init && chmod 755 /sbin/initทำงานได้แม้ว่า การใช้ APT เพื่อติดตั้งการพุ่งพรวดครั้งใหม่นั้นไม่ชัดเจนเท่าที่dpkgควรเนื่องจากไม่ทราบว่าเป็นค่าเริ่มต้น "แพ็คเกจพุ่งพรวดเป็นรุ่นปัจจุบันแล้ว" คุณสามารถdpkg --force-depends --force-remove-essential -r upstartก่อน
Joshua

1
apt-get install --reinstall upstart. นอกจากนี้ฉันไม่มี/proc/fdไดเรกทอรี และฉันเพิ่งตรวจสอบln -L /proc/1/exe /tmp/initทำงานกับ/sbin/initเปลี่ยนชื่อเป็น/sbin/init.bakฉันสามารถอ่านได้โดยไม่มีปัญหา/tmp/initหลังจากนี้
Ruslan

@muru ตกลง ฉันจะเพิ่มคำพ้องความหมายของแท็กแล้ว
Kaz Wolfe

คำตอบ:


31

บูตโหลดเดอร์จะโหลดเคอร์เนลเคอร์เนลจะพยายามเรียกใช้ init ไม่พบมันและตื่นตระหนก

ทางออกคือการรีบูตแก้ไขพารามิเตอร์การบู๊ตเพิ่มinit=/bin/bashและบู๊ตด้วยวิธีนั้น เคอร์เนลจะใช้ bash เป็น init สิ่งนี้จะให้โอกาสคุณในการรันคำสั่งและแก้ไขระบบ

การแก้ไข
เห็นได้ชัดว่าเคอร์เนล (ไฟล์init / main.c ) ทำ:

if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
        return 0;

panic("No working init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");

ดังนั้นมันจะหา / bin / sh (ซึ่งเป็นลิงค์ไปยังเส้นประ) และนั่นจะให้เชลล์และโอกาสในการแก้ไขโดยไม่ต้องใช้init=/bin/bashพารามิเตอร์การบูต


คำตอบที่ดี ไม่รู้ว่าเคอร์เนลค้นหาอะไรมากกว่า/sbin/initนั้น
Ruslan

และถ้าไม่มี/bin/shไฟล์ล่ะ หรือ/bin/bashหรือ/bin/dashอื่น ๆ ? ไม่แน่ใจว่าคุณสามารถลบสิ่งเหล่านี้ทั้งหมดได้ในเวลาเดียวกัน แต่จะเกิดอะไรขึ้นในทางทฤษฎี
trysis

ดีแล้วคุณจะเห็นความหวาดกลัวเคอร์เนลเป็นส่วนหนึ่งของคำตอบดังกล่าวข้างต้นที่แก้ไขบรรทัด แต่อย่าทำอย่างนั้นในระบบที่คุณต้องการ อย่างจริงจังไม่ หากคุณต้องการทดลอง (และเป็นแบบฝึกหัดที่ดี) ให้สร้าง Virtualbox VM ทำลายมันและลองแก้ไข BTW คำตอบโดย 200_success ก็ไม่เลวเช่นกัน
sмurf

12

ไม่มีอะไรเกิดขึ้นจนกว่าคุณจะพยายามรีบูต ตราบใดที่ระบบยังทำงานอยู่และคุณไม่พยายามเปลี่ยน runlevels ด้วยการรัน/sbin/init nคุณจะไม่รู้สึกเลยว่ามันหายไป

ที่จริงแล้วการลบ/sbin/initนั้นไม่สามารถยกเลิกได้หากคุณตระหนักถึงความผิดพลาดในช่วงต้นและสงบสติอารมณ์ ผู้ดูแลระบบมีกู้คืนจาก "lobotomies" ที่น่ารังเกียจกว่ามากในขณะที่ทำให้ระบบปฏิบัติการยังคงทำงานอยู่

วิธีหนึ่งในการกู้คืนจากการลบ/sbin/initคือการติดตั้งupstartแพคเกจใหม่โดยใช้ APT

วิธีกู้คืน Macho คือการใช้ทรัพยากรบนเครื่องเท่านั้น ปัจจัยหนึ่งในความโปรดปรานของคุณคือที่/sbin/initทำงานอยู่เสมอ ดังนั้นเมื่อคุณเรียกใช้rm /sbin/initไฟล์จะถูกยกเลิกการเชื่อมโยงจากระบบไฟล์เท่านั้น เนื้อหา inode และไฟล์ยังคงอยู่ในดิสก์และในหน่วยความจำจนกว่า PID 1 จะออก คุณเพียงแค่ต้องสร้างใหม่ /sbin/initจากไอโหนดที่เหมาะสม

วิธีที่ง่ายที่สุดที่จะประสบความสำเร็จที่เป็น:

# cp /proc/1/exe /sbin/init
# chmod 755 /sbin/init
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.