เคอร์เนล Linux ต้องการระบบไฟล์เพื่อให้ทำงานได้หรือไม่?


19

ความคิดเห็นของฉันคือใช่มันเป็นเช่นนั้นเพราะการได้รับประโยชน์ที่มีประโยชน์ต่อโลกภายนอก (โหมดตัวประมวลผลที่ไม่มีสิทธิพิเศษ) จะต้องมีกระบวนการที่ทำงานในโลกภายนอกก่อน ที่จะต้องใช้ระบบไฟล์แม้ชั่วคราวในแรมระบบไฟล์

วิศวกรอีกคนไม่เห็นด้วยกับฉัน แต่ดูเหมือนว่าฉันจะไม่สามารถพิสูจน์เรื่องนี้ได้เลย

คำตอบสำหรับคำถามนี้ขึ้นอยู่กับคำจำกัดความของ 'การทำงาน' หรือไม่?


4
ฉันคิดว่าเคอร์เนลที่ใช้งานไม่ "ต้องการ"useful exposure to the outside world
jsotola

19
นึกถึงไฟร์วอลล์เก่าของLinux ที่หยุดชะงัก (ประมาณปี 2002)
Jeff Schaller

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

1
กำหนด "run" ...
Thorbjørn Ravn Andersen

คำตอบ:


27

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

ทุกวันนี้กระบวนการเริ่มต้นเป็นสิ่งที่ต้องการ systemd /sbin/initถ้าไม่ได้ระบุเป็นอย่างอื่นเคอร์เนลจะพยายามที่จะเรียกใช้โปรแกรมจากรายชื่อของสถานที่เริ่มต้นด้วย ดู init Param นี่http://man7.org/linux/man-pages/man7/bootparam.7.htmlinit=/bin/bashในกรณีฉุกเฉินคุณสามารถบูตลินุกซ์ด้วย แต่สังเกตว่าคุณระบุไฟล์ในระบบไฟล์ให้ทำงานอยู่ตลอดเวลาอย่างไร

ดังนั้นเคอร์เนลจะตื่นตระหนกหากมันเริ่มต้นและไม่มีระบบไฟล์เพราะไม่มีใครไม่มีวิธีโหลด init

ความสับสนบางอย่างอาจเกิดขึ้นเนื่องจากสถานการณ์ไก่และไข่ซึ่งเคอร์เนลต้องโหลดไดรเวอร์เพื่อเข้าถึงระบบไฟล์ ในการหลีกเลี่ยงปัญหานี้ ramdisk เริ่มต้นจะถูกโหลดจากภาพบนดิสก์ที่มีไดรเวอร์ที่สำคัญและสคริปต์การตั้งค่า สิ่งเหล่านี้จะถูกดำเนินการก่อนที่จะโหลดระบบไฟล์ แต่อย่าทำผิดพลาด ramdisk เริ่มต้นนั้นเป็นระบบไฟล์ ด้วย ramdisk เริ่มต้น/initเรียกว่า (ซึ่งถูกเก็บไว้ใน ramdisk เริ่มต้น) ในหลาย ๆ ดิสทริบิวเตอร์มันคือสิ่งที่เรียก/sbin/initว่า อีกครั้งหากไม่มีระบบไฟล์สิ่งนี้เป็นไปไม่ได้


ไม่มีเงื่อนไขที่เคอร์เนลเลิกพยายามเริ่มต้นฮาร์ดแวร์และโหลดระบบไฟล์ที่รู้จัก (ไม่ใช่ initrd ที่ส่งผ่านเคอร์เนลผ่าน init params) จากนั้นหยดลงในเชลล์ที่ จำกัด มาก (โดยไม่ต้อง init = / bin / bash)? นอกจากนี้เนื่องจากคุณแสดง / bin / bash เคอร์เนลจะมีระบบไฟล์ที่น้อยที่สุดเสมอแม้ว่ามันจะถูกสร้างขึ้นด้วยตัวเลือก. config อื่น ๆ ที่อาจกำจัดสิ่งนี้ได้?
ปีเตอร์แอล

1
@PeterL ขีด จำกัด เชลล์นั้นคือเชลล์บางตัวจาก initrd / initramfs / สิ่งที่เคอร์เนลบูทด้วย IIRC
muru

3
โปรดทราบว่าคุณสามารถสร้าง initramfs (ไฟล์เก็บถาวร CPIO ที่แยกลงในระบบไฟล์ ramfs หรือ tmpfs) ลงในเคอร์เนล หรือไม่นั้นนับว่าเป็นเคอร์เนล "ต้องการระบบไฟล์" ขึ้นอยู่กับคุณเพราะมันหมายความว่าคุณสามารถบูตเคอร์เนลและไม่มีอะไรนอกจากเคอร์เนลและมีระบบ (ถ้าบิต จำกัด ) โปรดทราบว่าแม้ว่าคุณจะแก้ไขเคอร์เนลให้ไม่ต้องใช้ init อีกต่อไปมันจะยังคงสร้างระบบแฟ้มเสมือนภายในที่ไม่เคยเปิดเผย
ป่า

@forest ระบบไม่จำเป็นต้อง "ถูก จำกัด " - คุณสามารถแพ็ค systemd และคำพังเพยใน initrd ของคุณ (พร้อมกับสิ่งที่เป็นประโยชน์จริง ๆ ;-)) หนึ่งในข้อ จำกัด ของ initramfs เป็น (ยังคงคืออะไร?) ว่ามันก็ไม่ได้สนับสนุนคุณสมบัติการขยาย - ฉันไม่ได้ทำงานรอบ ๆ มันเกี่ยวกับหุ่นยนต์โดยรวมทั้งภาพ ext4 ในเก็บ cpio initrd ซึ่งได้รับการติดตั้งแล้วเป็นอุปกรณ์ห่วงจากinit.$DEV.rcสคริปต์
ลุงบิลลี่

1
@IsmaelMiguel, nope, initramfs เช่นนี้เป็นไฟล์เก็บถาวร cpio Squashfs เป็นทางเลือกที่ดีสำหรับระบบไฟล์ที่ฝังตัวและหนึ่งสามารถทำให้ initrd (VS initramfs เป็นพิเศษ) ที่ใช้มัน (คำที่มักจะใช้แทนกันได้ แต่พวกเขาไม่ได้ค่อนข้างสิ่งเดียวกัน) แต่ก็ไม่ได้เป็นรูปแบบ unpacks ลินุกซ์เป็นของ initramfs (อันที่จริงภาพสควอชไม่จำเป็นต้องถูกแกะออกมาก่อนจึงจะสามารถใช้ได้เลย; มันถูกทำดัชนีอย่างเหมาะสม)
ชาร์ลส์ดัฟฟี่

16

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

  • การใช้งาน Linux โดยไม่ต้องใช้อุปกรณ์บล็อคใด ๆเป็นไปได้และมีประโยชน์สำหรับกรณีการใช้งานเฉพาะบางอย่าง
  • การรันลีนุกซ์โดยไม่มีระบบไฟล์ใด ๆจะต้องมีการเขียนใหม่บางส่วนของรหัสเคอร์เนลและไม่น่าจะเป็นประโยชน์
  • การใช้งานลีนุกซ์โดยไม่ใช้ไฟล์อธิบายใด ๆจะต้องใช้ความพยายามอย่างมาก ฉันค่อนข้างแน่ใจว่านั่นจะไม่คุ้มค่ากับความพยายาม

เหตุผลที่คุณต้องเขียนใหม่บางส่วนของรหัสเคอร์เนลเพื่อสร้างระบบการทำงานที่ไม่มีระบบไฟล์คือ:

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

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

ดังนั้นโปรแกรมโหมดผู้ใช้ที่ทำงานอยู่จะอยู่ในสถานะที่ไม่มีการแม็พหน่วยความจำที่สำรองข้อมูลโดยไฟล์และสามารถปิดไฟล์ descriptor ทั้งหมดที่สำรองข้อมูลด้วยไฟล์ มันไม่สามารถหยุดการมีไดเรกทอรีรากและไดเรกทอรีการทำงานปัจจุบัน แต่มันสามารถละเว้นได้

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

การตั้งค่าที่มีประโยชน์สำหรับกรณีการใช้งานเฉพาะบางอย่าง

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

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

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


1
คำถามคือถ้าเคอร์เนล Linux ในการกำหนดค่าใด ๆ ที่สร้างขึ้น (โดยไม่ต้องเขียนอะไรใหม่) สามารถ 'รัน' โดยไม่มีระบบไฟล์ใด ๆ ไม่ต้องทำอะไรที่เป็นประโยชน์หรือรักษาสถานะไว้ จากคำตอบทั้งหมดฉันเข้าใจว่ามีการจัดเรียงไฟล์บางไฟล์ไว้ภายในเคอร์เนลเองอย่างน้อยก็จนกว่าจะปิดเครื่อง แม้ '/' เป็นระบบไฟล์ ดังนั้นฉันคิดว่าการทำให้คำตอบง่ายขึ้นคือ 'ใช่'
ปีเตอร์แอล

2
@PeterL ใช่ถ้าคุณไม่ได้เขียนอะไรอีก Linux จะต้องมีระบบไฟล์ เมื่อผู้คนพูดถึงการใช้งานจริงสำหรับลีนุกซ์โดยไม่มีระบบไฟล์พวกเขามักจะอ้างถึงผู้ที่ได้รับการสนับสนุนจากอุปกรณ์บล็อกและคุณสามารถเรียกใช้ Linux โดยไม่ต้องใช้ระบบไฟล์ที่ได้รับการสนับสนุนจากอุปกรณ์บล็อก คุณยังคงมีระบบไฟล์บางประเภทอยู่
kasperd

3

ใน Linux อุปกรณ์เกือบทั้งหมดเป็นไฟล์ดังนั้นคุณต้องมีระบบไฟล์เพื่อเรียกใช้


8
แต่แน่นอนว่ามีไดรเวอร์อุปกรณ์อยู่ภายในเคอร์เนลโดยไม่คำนึงว่าไฟล์อุปกรณ์ชี้ไปที่พวกเขาหรือไม่
Philip Couling

6
ไม่ใช่ว่าทุกอุปกรณ์จะเป็นไฟล์ การเชื่อมต่อเครือข่าย ( eth0, wlan0ฯลฯ ) ไม่ได้ยกตัวอย่างเช่น
Ruslan

1
นี่คือความเข้าใจผิดที่พบบ่อย ในทางทฤษฎีทุกอย่างเป็นไฟล์ในระบบที่เหมือน UNIX และ UNIX มันเป็นความจริงอย่างสมบูรณ์สำหรับระบบที่มีความเชี่ยวชาญสูงเช่น Plan 9 (แม้ว่ามันจะเป็นจริงมากกว่าสำหรับ Windows) สำหรับ Linux มีบางสิ่งที่ไม่ใช่ไฟล์ สิ่งนี้กำลังได้รับความจริงมากขึ้นเรื่อย ๆ เนื่องจากไดรเวอร์หลายตัวเริ่มใช้ netlink มากกว่า ioctls บนอุปกรณ์ตัวอักษร (ซึ่งเป็นไฟล์)
forest

@forest Plan 9 ไม่ใช่ระบบ "ที่มีความเชี่ยวชาญสูง" - มันควรจะเป็นระบบที่ใช้งานทั่วไปเช่น Unix หรือ windows (ทำไมมันล้มเหลวในการแทนที่ Unix และยังคงเป็นระบบการวิจัยที่แตกต่างอย่างสิ้นเชิง) อย่างไรก็ตามเช่นเดียวกับ Linux, plan9 กำลังเปิดเผยอินเตอร์เฟสเสมือนกับฮาร์ดแวร์ของมัน (และไม่มี ioctls ใด ๆ - ฉันไม่เห็นวิธีการใช้ netlink vs ioctls ปัจจัยทั้งหมดนี้) แม้ว่ามันจะพยายามที่จะสอดคล้องกันมากขึ้น (เช่น อินเตอร์เฟซเครือข่ายสามารถเข้าถึงได้ผ่านระบบไฟล์) ด้วยการเปิดตัวของ namespaces, Linux เป็นเหมือน plan9 มากกว่ายูนิกซ์คลาสสิก
ลุงบิลลี่

1
อาร์กิวเมนต์ที่ดีมาก: อาจมี devfs ซึ่งเป็นระบบไฟล์ต่อการกำหนดหรือไม่มี devfs ซึ่งในกรณีนี้คุณต้องใช้ระบบไฟล์ไปยังโหนดอุปกรณ์โฮสต์ ...
pmf

-1

เคอร์เนลเป็นโปรแกรมเหมือนกับที่อื่น ๆ โดยค่าเริ่มต้นเคอร์เนล Linux พยายามเข้าถึงระบบไฟล์อย่างไรก็ตามพฤติกรรมนี้สามารถกำจัดได้เล็กน้อยโดยการปรับเปลี่ยนเคอร์เนล (อันที่จริงแล้วเป็นเพียงการเพิ่มฟังก์ชัน "arch_call_rest_init ()") ในการดำเนินการ "งานที่มีประโยชน์" เราคาดหวังว่านักพัฒนาอาจรวมถึงเคอร์เนลเธรด (kthreads), perhapos ในไดร์เวอร์ที่กำหนดเองเพื่อทำการเริ่มต้นและปริมาณงานประเภทแอปพลิเคชันที่ต้องการ เคอร์เนล Linux มี kthreads จำนวนมากอยู่แล้ว แต่โดยหลักแล้วเพื่อดำเนินงานเสริมให้กับเคอร์เนลหรือไดรเวอร์ API ที่พร้อมใช้งานภายในบริบทเคอร์เนลค่อนข้างแตกต่างจากที่มีอยู่ในพื้นที่ผู้ใช้ Linux ฟังก์ชันการเรียกใช้ระบบจำนวนมากจะไร้ประโยชน์ในสถานการณ์ที่ไม่มีระบบไฟล์

ใช่ลีนุกซ์คาดว่าจะเข้าถึงระบบไฟล์ได้ตามค่าเริ่มต้น ไม่ได้เคอร์เนลที่ได้รับการแก้ไขนั้นสามารถทำงานที่เป็นประโยชน์ได้โดยไม่มีระบบไฟล์ใด ๆ การใช้งานจริงของระบบไฟล์ Linux ที่ไม่มี IMO นั้นค่อนข้าง จำกัด แต่ก็ไม่มีข้อ จำกัด FWIW ในอดีตที่ผ่านมาเรียลไทม์หลายเมล็ดถูกสร้างขึ้นในชื่อพื้นที่และไบนารีเช่นเดียวกับการใช้งาน RT

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