อาร์กิวเมนต์เคอร์เนลทั้งหมดใช้โดยเคอร์เนลจริง ๆ หรือไม่


11

ทำไมลินุกซ์อนุญาตให้ 'init = / bin / bash'

ฉันอ่านสิ่งนี้คำตอบกำลังบอกว่ามันเป็น KERNEL ที่กำลังเรียกใช้โปรแกรมเริ่มต้นนี้

จากนั้นฉันก็เริ่มสงสัยว่า Linux มักจะมาพร้อมกับ initramfs ซึ่งในที่สุดจะเมานต์และ pivot_root กับระบบไฟล์รูทจริง initอาร์กิวเมนต์นี้หมายความว่าอย่างไร เส้นทางใน initramfs หรือไม่ หรืออย่างที่ฉันเดามันไม่ได้อ่านโดยเคอร์เนล แต่โดย init ของ initramfs เพื่อดำเนินการ init จริง

นอกจากนี้ยังมีroot=UUID=xxxxข้อโต้แย้งที่ว่าจะอ่านโดยเคอร์เนลหรือเพียงแค่เริ่มต้นของ initramfs เพื่อค้นหาระบบไฟล์รูทจริง?

ดูเหมือนว่าฉันสามารถส่งผ่านอาร์กิวเมนต์ใด ๆ ที่ฉันต้องการเป็นอาร์กิวเมนต์ของเคอร์เนลดังนั้นพวกเขาจึงอ่านทั้งหมดโดยเคอร์เนลหรืออย่างน้อยบางส่วนมีความหมายเฉพาะกับโปรแกรม userspace หรือไม่

คำตอบ:


18

พารามิเตอร์ที่ส่งผ่านบรรทัดคำสั่งเคอร์เนลไม่จำเป็นต้องมีความหมายสำหรับเคอร์เนล: เอกสารของพารามิเตอร์เคอร์เนลบอกว่า

เคอร์เนลแยกวิเคราะห์พารามิเตอร์จากบรรทัดคำสั่งเคอร์เนลจนถึง“ -”; หากไม่รู้จักพารามิเตอร์และไม่มี '.' พารามิเตอร์จะถูกส่งผ่านไปยัง init: พารามิเตอร์ที่มี '=' เข้าสู่สภาพแวดล้อมของ init ส่วนอื่น ๆ จะถูกส่งผ่านเป็นอาร์กิวเมนต์บรรทัดคำสั่งเพื่อเริ่มต้น ทุกอย่างหลังจาก“ -” ถูกส่งผ่านเป็นอาร์กิวเมนต์เพื่อเริ่มต้น

สิ่งนี้ใช้ไม่ได้initและrootสิ่งใดที่เป็นพารามิเตอร์ของเคอร์เนลและได้รับการจัดการโดยเคอร์เนล พวกเขายังสามารถดำเนินการใด ๆ /proc/cmdlineโดยผู้ใช้พื้นที่ตั้งแต่พวกเขาปรากฏใน (ตัวอย่างเช่น systemd ใช้quietพารามิเตอร์เคอร์เนลเข้าบัญชีเพื่อลดเอาต์พุต)

เมื่อเคอร์เนลถูกบูทด้วย initramfs rootพารามิเตอร์จะไม่ถูกใช้โดยเคอร์เนลโดยตรงและinitพารามิเตอร์จะถูกใช้หากrdinitล้มเหลวเท่านั้น initมีการจัดการเริ่มต้นในkernel_initซึ่งทำงานดังนี้:

  • หากมีคำสั่ง“ ramdisk execute” (ทั้งค่าที่กำหนดให้rdinitกับบรรทัดคำสั่งเคอร์เนลหรือ/init) ซึ่งสามารถเข้าถึงได้เคอร์เนลจะพยายามเรียกใช้งานนั้น
  • หากสิ่งนั้นล้มเหลวและมี“ รันคำสั่ง” (ค่าที่กำหนดให้initกับบรรทัดคำสั่งเคอร์เนล) เคอร์เนลพยายามเรียกใช้นั้นและตื่นตระหนกหากไม่สามารถทำได้
  • เป็นที่พึ่งสุดท้ายเคอร์เนลพยายามที่จะเรียก/sbin/init, /etc/init, /bin/initและ/bin/sh; ถ้าไม่มีผู้ที่สามารถทำงานก็ตื่นตกใจ

เมื่อมีการเริ่มต้นทั้งหมดนี้เกิดขึ้นที่นั่นและปริมาณเป้าหมายไม่ได้ถูกเมานท์โดยเคอร์เนล เกิดอะไรขึ้นหลังจากเคอร์เนลรันinitโปรแกรมแรก(โดยปกติแล้ว/initสคริปต์ใน initramfs) จะขึ้นอยู่กับโปรแกรมไม่ใช่เคอร์เนล อาร์กิวเมนต์ที่ไม่ถูกส่งไปinitยังจะยังคงใช้ได้/proc/cmdlineหาก/procระบบไฟล์ถูกเมาท์


ยังอยากรู้อยากเห็นอีกเล็กน้อยถ้า init-in-the-initramfs เป็นไฟล์ set-uid-non-root ไฟล์ที่ไม่มีบิตที่รันได้? มันจะถูกเรียกใช้เป็นรูตหรือไม่? เกิดอะไรขึ้นถ้ามันแตกเอลฟ์หรือไม่สามารถหาld-linux.soเอลฟ์หรือสคริปต์ซ้ำลึกเกินไปหรืออะไรก็ตามที่ไม่สามารถเอ็กซีคิ้วท์ได้?
炸鱼薯条德里克

3
ฉันค่อนข้างแน่ใจว่าเคอร์เนลไม่ได้โหลดโปรแกรมที่ระบุใน "init =" จาก initramfs มันเป็น initramfs ที่ใช้งานอยู่ดูเหมือนว่าจะทำงานได้ตามปกติก่อนที่จะมีการเรียกใช้โปรแกรม init ที่ผู้ใช้ระบุ (ไม่แน่ใจว่าเป็นเคอร์เนลที่ทำสิ่งนี้หรือรหัสใน initramfs)
plugwash

@ 炸鱼薯条德里克เพื่อระบุโปรแกรมอื่นแทน/initเมื่อทำการบูทจาก ramdisk คุณสามารถใช้rdinit=/path/toพารามิเตอร์บูทได้
pizdelect

3

การส่งค่าอาร์กิวเมนต์เคอร์เนลแบบกำหนดเองเป็นวิธีหนึ่งในการปรับแต่งระบบระหว่างการติดตั้ง KickStart ตัวอย่างเช่นเซิร์ฟเวอร์ PXE สามารถตั้งค่าได้:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

โดยที่labจะใช้ในการกำหนดค่า KickStart เพื่อทำสิ่งที่แตกต่างจากการสร้างระบบอื่น:

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

ที่นี่เพื่อตั้งค่าเค้าโครงระบบไฟล์ที่แตกต่างจากที่ใช้กับระบบประเภทอื่น หวังว่าจะใช้เลเบลที่แตกต่างกันสำหรับการปรับแต่งโลคัลมากกว่าที่ใช้โดยเคอร์เนลเนื่องจากมีเนมสเปซเดียวที่เกี่ยวข้อง

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