ฉันจะใช้ไดรเวอร์ระบบไฟล์ใน Linux ได้อย่างไร [ปิด]


15

สมมติว่าฉันได้คิดค้นระบบไฟล์ใหม่และตอนนี้ฉันต้องการสร้างโปรแกรมควบคุมระบบไฟล์สำหรับมัน

ฉันจะใช้โปรแกรมควบคุมระบบไฟล์นี้ทำได้อย่างไรโดยใช้เคอร์เนลโมดูล

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

คำตอบ:


24

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

ต่อไปนี้เป็นข้อมูลพื้นฐานเกี่ยวกับการใช้ระบบไฟล์ภายในพื้นที่เคอร์เนล มันค่อนข้างเก่า (จากปี 1996!) แต่อย่างน้อยก็ควรให้ความคิดพื้นฐานสำหรับสิ่งที่คุณต้องทำ

หากคุณเลือกที่จะไปที่เส้นทาง FUSE นี่คือ libfuse การใช้งานอ้างอิงของด้าน userspace ของอินเตอร์เฟส FUSE

ไดรเวอร์ระบบไฟล์เป็นโมดูลเคอร์เนล

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

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

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

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

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


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

ฉันพูดพาดพิงถึงเรื่องนี้ด้วยบิต "นี่คือตัวชี้ไปยังอุปกรณ์บล็อกมาตรฐาน" แต่เป็นจุดที่ดี ฉันขยายที่
telcoM

คำตอบนี้โดยเฉพาะคำอธิบายของสิ่งที่เกิดขึ้นในสิ่งที่สั่งเป็นเทพ มีหนังสือ / เว็บไซต์บางประเภทที่ฉันสามารถอ่านได้ซึ่งมีคำอธิบายเช่นนั้นสำหรับ "วิธีการทำงานของ linux" ทั้งหมดหรือไม่?
Adam Barnes

คุณอาจจะสนใจในLinux Kernel Internalsหรือไดรเวอร์ของอุปกรณ์ Linux, 3rd Edition และแน่นอนว่ามีตัวเลือกในการอ่านซอร์สโค้ดจริง
telcoM

5

ใช่เคอร์เนลไดรเวอร์สามารถจัดการระบบไฟล์ได้

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

Wikipedia => https://en.wikipedia.org/wiki/Filesystem_in_Userspace

แหล่งที่มา => https://github.com/libfuse/libfuse

a tutorial => https://developer.ibm.com/articles/l-fuse/


0

ใช่โดยทั่วไปจะทำได้โดยใช้เคอร์เนลไดรเวอร์ที่สามารถโหลดเป็นโมดูลเคอร์เนลหรือเรียบเรียงเป็นเคอร์เนล

คุณสามารถตรวจสอบโปรแกรมควบคุมระบบแฟ้มที่คล้ายกันและวิธีการทำงานที่นี่

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


0

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

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

และใช่เคอร์เนลมีไดรเวอร์สำหรับฮาร์ดแวร์อยู่แล้วคุณไม่ต้องใช้มันอีกครั้ง


มีข้อเสียที่สำคัญสำหรับ FUSE นอกเหนือจากประสิทธิภาพ: มันยากที่จะใช้สำหรับระบบไฟล์รูทของคุณ (อาจเป็นไปได้กับ initrd แต่ไบนารี FUSE ไม่สามารถเป็นอิสระหลังจากการบูทเพราะมันจะยังคงถูกเรียกใช้จาก ramdisk)
Peter Cordes

1
@PeterCordes มันไม่สามารถเป็นอิสระได้ แต่นั่นไม่ได้หมายความว่ามันไม่สามารถยกเลิกการเชื่อมโยงได้ หากยังคงมีการอ้างอิงถึงมันจะถูกเก็บไว้ในหน่วยความจำไม่ว่าคุณจะออกจาก initramfs หรือไม่และลบไบนารีพื้นฐาน
ป่า

@forest: ถูกต้องดังนั้นคุณไม่สามารถยกเลิกการต่อเชื่อมกับ initrd ได้pivot_rootเนื่องจากมี inodes ไม่ว่างใน initramfs
Peter Cordes

ปกติ/initเริ่มต้นจาก initramfs จะ (ฉันคิด) execve /initหลังจาก pivot_root เพื่อถ่ายโอนการควบคุมไป /initFS แต่ไบนารี FUSE ไม่สามารถแทนที่ตัวเองด้วย execve หากการเข้าถึงรูต FS ขึ้นอยู่กับกระบวนการ FUSE ที่ตอบสนองต่อเคอร์เนล อาจทำได้โดยการใส่หน้ากระดาษก่อน แต่ก็ไม่ได้น่าเชื่อถือ
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.