เหตุใดไฟล์อุปกรณ์พิเศษจึงมีไอโหนด


11

ไฟล์อุปกรณ์ไม่ใช่ไฟล์ต่อไฟล์ เป็นอินเทอร์เฟซ I / O เพื่อใช้อุปกรณ์ในระบบปฏิบัติการยูนิกซ์ พวกเขาไม่ใช้พื้นที่บนดิสก์อย่างไรก็ตามพวกเขายังคงใช้ inode ตามที่รายงานโดยstatคำสั่ง:

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

ไฟล์อุปกรณ์ใช้ฟิสิคัล inodes ในระบบไฟล์หรือไม่และทำไมพวกเขาต้องการมันเลย?


2
inode และ data เป็นไฟล์ หากไม่มี inode คุณจะไม่มีไฟล์ (ไฟล์อุปกรณ์ไม่มีข้อมูลใด ๆ )
user253751

คำตอบ:


16

คำตอบสั้น ๆ ก็คือมันจะทำได้ก็ต่อเมื่อคุณมีระบบไฟล์สำรองทางกายภาพ/dev(และถ้าคุณใช้ distro Linux ที่ทันสมัย

คำตอบยาวดังนี้:

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

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

บนระบบ Linux ที่ทันสมัย ​​(และฉันเชื่อว่า FreeBSD และ Solaris รุ่นล่าสุด) /devเป็นระบบแฟ้มในหน่วยความจำชั่วคราวที่มีเคอร์เนล (หรือ udev ถ้าคุณใช้ Systemd เพราะพวกเขาไม่เชื่อว่าเคอร์เนลจะทำอะไรเกือบทุกอย่าง) . สิ่งนี้จะช่วยประหยัดพื้นที่ดิสก์บางส่วนในราคาหน่วยความจำบางส่วน (โดยปกติจะน้อยกว่าไม่กี่ MB) และค่าใช้จ่ายในการประมวลผลที่น้อยมาก นอกจากนี้ยังมีข้อดีอื่น ๆ อีกมากมายโดยหนึ่งในสิ่งที่ยิ่งใหญ่ที่สุดคือการตรวจจับฮาร์ดแวร์ hot-plugged ได้ง่ายขึ้น /devนี้โดยทั่วไปจะเรียกว่ามีแบบไดนามิก

ในทั้งสองกรณีแม้ว่าโหนดอุปกรณ์จะถูกเข้าถึงผ่านเลเยอร์ VFS ปกติซึ่งตามคำจำกัดความหมายความว่าพวกเขาจะต้องมี inode (แม้ว่ามันจะเป็น virtual virtual ที่เพิ่งมีอยู่ดังนั้นสิ่งที่ชอบstat()ทำงานเหมือนที่มันควรจะเป็นจากมุมมองที่เป็นประโยชน์ สิ่งนี้มีผลกระทบเป็นศูนย์ในระบบที่ใช้ไดนามิก/devเพราะพวกเขาเพียงเก็บ inodes ในหน่วยความจำหรือสร้างพวกเขาตามต้องการและใกล้ศูนย์ผลกระทบที่/devเป็นแบบคงที่เพราะ inodes ใช้พื้นที่ใกล้ศูนย์บนดิสก์และระบบไฟล์ส่วนใหญ่ไม่มีขีด จำกัด บน พวกเขาหรือวิธีการจัดหามากกว่าใครมีแนวโน้มที่จะต้องการ


3
ยกมืออย่างระมัดระวัง ฉันอยู่ในโครงการที่มีเซิร์ฟเวอร์หมด inodes ในที่สุดมันก็เป็นวิกฤติที่ทีมของเราจำเป็นต้องโน้มน้าวให้ฝ่ายบริหารลงทุนในการเปลี่ยนระบบ back-end นั้นซึ่งได้รับการออกแบบ (ไม่ดีอย่างที่คุณอาจจินตนาการ!) ก่อนที่พวกเราจะไปถึงที่นั่น
KRyan

@Kyan มันสามารถเกิดขึ้นได้ แต่วันนี้มันหายากเว้นแต่ผู้ดูแลระบบลดจำนวนลงอย่างชัดเจนในการสร้างระบบไฟล์ ระบบไฟล์ที่ทันสมัยหลายแห่ง (อย่างน้อย NTFS, BTRFS และ ZFS ฉันคิดว่า XFS ก็เช่นกัน) จริง ๆ แล้วการจัดสรร inodes แบบไดนามิกดังนั้นในระบบใหม่ ๆ มันเป็นไปไม่ได้ที่จะหมดไป
Austin Hemmelgarn

@Kyan ฉันก็มีปัญหานั้นเช่นกัน และมันก็เป็นจริงเป็นระบบที่ออกแบบดีถ้าบิตลงวันที่และนำตัวไป extreams (แต่ละรายการต้องเข้าสู่ระบบอิสระที่ถูกเก็บไว้บนดิสก์ในที่สุดมันก็เต็มไปด้วย inodes เล็ก ๆ น้อย)
coteyr

1
Od และนักเทียบท่าเป็นประเภทที่มีชื่อเสียงในการก่อให้เกิดปัญหา inode นี้
coteyr

@AustinHemmelgarn ตระกูล ext ค่อนข้างน่าอับอายสำหรับการมีinode จำนวนคงที่ (และจะหมดลงในภายหลัง) นอกจากนี้ยังเป็นระบบไฟล์ Linux ที่ใช้มากที่สุดโดยอาจมีขนาดใหญ่มาก (สถานการณ์ที่เก็บข้อมูลจำนวนมากใน XFS ไว้ด้วยโดย ZFS และ BTRFS ค่อนข้างใหม่) และเป็นค่าเริ่มต้นสำหรับ distros ส่วนใหญ่ แน่นอนว่าในระบบที่ทันสมัยค่าสูงสุดของไอโหนดเริ่มต้นคือจำนวนคำสั่งที่ใหญ่กว่าจำนวนไฟล์อุปกรณ์ที่คุณจะมี
บ๊อบ

15

ไฟล์อุปกรณ์มีสิทธิ์เช่นกันและไฟล์เหล่านั้นจะถูกเก็บไว้ในไอโหนด


จุดสุดยอดที่ฉันลืมพูดถึง
Austin Hemmelgarn

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

12

ไดเรกทอรีเป็นเพียงการแมปจากชื่อไฟล์ไปยัง inodes ดังนั้นทุกอย่างเกี่ยวกับสิ่งที่ชื่อนั้นอ้างถึง (ไฟล์, symlink, อุปกรณ์, FIFO, ซ็อกเก็ต) จะต้องอยู่ใน inode ไม่มีที่อื่นที่จะวาง

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

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


0

หากไม่มี inode คุณจะมีชื่อไฟล์เพื่อเก็บข้อมูลทั้งหมดเกี่ยวกับอุปกรณ์ดังกล่าว ซึ่งหมายความว่า "ความสุข" ชื่ออุปกรณ์เหมือน/dev/sdaจะออกจากคำถาม: /dev/ohci/sdaคุณจะต้องมีชื่อที่อาจจะเชื่อมโยงกับโปรแกรมควบคุมเฉพาะเช่น

ยิ่งสำคัญเครื่องมือทั้งหมดที่พึ่งพา inodes (เช่นstat, lsและอื่น ๆ ) จะต้องมีการปรับเปลี่ยนเส้นทางการรักษาภายใต้การ/devในลักษณะพิเศษ นั่นจะเป็นงานที่ต้องห้ามจำนวนมากและไม่มีประโยชน์ชัดเจนเมื่อเทียบกับสถานะของสิ่งต่าง ๆ ในปัจจุบัน

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