Linux น้อยที่สุดที่มีเคอร์เนลและ BusyBox: / etc / inittab จะถูกละเว้นจะดำเนินการ / init เท่านั้น


12

ฉันจัดการเพื่อสร้างซีดีลินุกซ์สดขนาดเล็กและใช้งานได้เต็มรูปแบบซึ่งมีเคอร์เนลเท่านั้น (คอมไพล์ด้วยตัวเลือกเริ่มต้น) และ BusyBox (คอมไพล์ด้วยตัวเลือกเริ่มต้น + สแตติกแอปเพล็ตทั้งหมดที่มีอยู่/sbin/init) ผมมีปัญหาใด ๆ ในการสร้างinitrdและเติม/dev, /procและ/sysและข้าพเจ้ายังมีปัญหาที่ไม่ทั้งหมดของฉันกับ/initเชลล์สคริปต์

เมื่อเร็ว ๆ นี้ฉันอ่านว่า BusyBox รองรับ/etc/inittabการกำหนดค่า (อย่างน้อยถึงระดับหนึ่ง) และฉันต้องการทำอย่างใดอย่างหนึ่งต่อไปนี้:

  • ลืม/initเชลล์สคริปต์ของฉันและพึ่งพา/etc/inittabการกำหนดค่าทั้งหมด
  • ใช้ทั้ง/initเชลล์สคริปต์และ/etc/inittabการกำหนดค่า

ตอนนี้ปัญหาที่เกิดขึ้นจริง - ดูเหมือนว่า/etc/inittabจะถูกละเว้นอย่างสมบูรณ์เมื่อ distro บูตของฉัน อาการคือ:

  • เมื่อฉันลบ/initและปล่อยให้/etc/inittabฉันจบลงด้วยความตื่นตระหนกเคอร์เนล สมมติฐานของฉันคือว่าเมล็ดไม่ได้ดำเนินการ/sbin/initเลยหรือว่า/sbin/initไม่พบ /etc/inittab(หรืออ่าน)
  • ผมอ่านที่ BusyBox /etc/inittabควรปรับการทำงานได้โดยไม่ต้อง ดังนั้นฉันออกทั้งสอง/initและ/etc/inittabและคาดเดาสิ่งที่ - ตื่น kernel อีกครั้ง
  • ผมพยายามที่จะดำเนินการ/sbin/initจากเปลือกของฉันและหลังจากที่หลายคาดเดาซึ่งรวมถึงexec /sbin/init, setsid /sbin/initและexec setsid /sbin/initฉันจบลงด้วยความตื่นตระหนกเคอร์เนล ทั้งที่มีและไม่มี / etc / inittab อยู่ในระบบไฟล์

นี่คือเนื้อหาของ/initสคริปต์เชลล์ของฉัน:

#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh

ณ จุดนี้ฉันไม่สนใจสิ่งที่เนื้อหาของ/etc/inittabจะเป็นตราบใดที่ฉันมีวิธีที่จะรู้ว่าการตั้งค่ามีการใช้งานจริง ฉันพยายามหลาย/etc/inittabกำหนดค่าทั้งหมดขึ้นอยู่กับข้อมูลที่ผมพบว่าที่นี่

ในฐานะขั้นต่ำสุดของฉัน / etc / inittab มีเพียงหนึ่งบรรทัดนี้:

::sysinit:/bin/sh

อีกครั้ง - ฉันสิ้นสุดลงด้วยความตื่นตระหนกเคอร์เนลและดูเหมือนว่า/etc/inittabจะถูกละเว้น

ข้อเสนอแนะใด ๆ วิธีการบังคับ distro สดเล็ก ๆ ของฉันให้ทำงานได้ดีกับ BusyBox /etc/inittabได้รับการชื่นชมอย่างมาก!

ปรับปรุง:

  • เพียงเพื่อให้ชัดเจน - ฉันไม่ได้มีเคอร์เนลตื่นตระหนกกับปัญหาปัจจุบันของฉันเชลล์สคริปต์ทั้งที่มีและไม่มี/init /etc/inittabทุกอย่างทำงานได้ดี/bin/ashคอนโซลของฉันใช้งานได้ดีและฉันไม่พบปัญหาใด ๆ ที่ไม่คาดคิด ปัญหาเดียวคือว่า/etc/inittabจะถูกละเว้นอย่างสมบูรณ์ตามที่ฉันอธิบายไว้ข้างต้น
  • ฉันตรวจสอบการกระจายลีนุกซ์สด 3 แบบ: Slax, Finnix และ SysResCD ทั้งหมดของพวกเขามีและไม่มีพวกเขามี/init /etc/inittabนอกจากนี้บทความ Wiki นี้ยังสรุปข้อสงสัยของฉันที่/sbin/initไม่ได้เรียกใช้เลย

ถ้าคุณมาที่นี่ลองดูMinimal Linux Liveซึ่งดูเหมือนว่าจะทำในสิ่งที่ต้องการและใช้งานได้: github.com/ivandavidov/minimal
Ciro Santilli 冠状病毒病毒审查六四事件法轮功

อ่า OP เขียน Minimal Linux Live! ผู้ชายที่คุณร็อค
Ciro Santilli 21 病毒审查六四事件法轮功

คำตอบ:


11

ตกลงฉันได้ทำการวิจัยมากมายและฉันพบว่ามีอะไรผิดปกติ เริ่มกันทีละ:

  • เมื่อเราใช้initramfsรูปแบบการบูทกระบวนการแรกที่เคอร์เนลเรียกใช้คือ/initสคริปต์ เคอร์เนลจะไม่พยายามดำเนินการ/sbin/initโดยตรง
  • /init ถูกกำหนดตัวระบุกระบวนการ 1. สิ่งนี้สำคัญมาก!
  • ปัญหาในตอนนี้คือ/sbin/initสามารถเริ่มได้PID 1แต่เรากำลังใช้/initPID 1 อยู่แล้ว
  • การแก้ปัญหาคือการดำเนินการบรรทัดคำสั่งในขณะที่เรายังคงอยู่ภายในexec /sbin/init /initด้วยวิธีนี้กระบวนการใหม่ (ซึ่งก็คือ/sbin/init) จะสืบทอด PID จากพาเรนต์ ( /initด้วย PID 1) และนั่นคือทั้งหมดที่เราต้องทำ

ปัญหาที่ฉันประสบกับการกำหนดค่าเริ่มต้นของฉัน (ดูคำถาม) เกิดจากข้อเท็จจริงที่ว่าสิ่งสุดท้ายที่/initสคริปต์ของฉันทำคือการวางไข่/bin/shกระบวนการใหม่ซึ่งกำหนด PID ใหม่ จากจุดนี้มันเป็นไปไม่ได้ที่จะเรียกใช้/sbin/initโดยตรงจากคอนโซลแบบโต้ตอบเพราะแม้เมื่อเราเรียกใช้งานบรรทัดคำสั่งexec /sbin/initสิ่งที่ดีที่สุดที่เราทำได้คือการกำหนด PID เดียวกันซึ่งได้รับมอบหมายให้กับเชลล์แล้วและ PID นี้ไม่ใช่ PID 1 แน่นอน

เรื่องสั้นสั้น - รันบรรทัดคำสั่งexec /sbin/initโดยตรงจาก/initและนั่นคือทั้งหมด

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