ทุกสิ่งที่คุณอยากรู้เกี่ยวกับ inodes บน Linux

ระบบไฟล์ Linux อาศัย inodes ส่วนสำคัญของการทำงานภายในของระบบไฟล์เหล่านี้มักจะเข้าใจผิด มาดูกันว่าพวกเขาคืออะไรและทำอะไร

องค์ประกอบของระบบไฟล์

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

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

ขนาด Inodes และ File System

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

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

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

inodes ทั้งหมดจัดอยู่ในตารางเดียว ด้วยการใช้หมายเลขไอโหนดระบบไฟล์จะคำนวณออฟเซ็ตลงในตารางไอโหนดที่ไอโหนดนั้นอยู่ได้อย่างง่ายดาย คุณสามารถดูได้ว่าเหตุใด“ i” ในไอโหนดจึงหมายถึงดัชนี

ตัวแปรที่มีหมายเลขไอโหนดจะถูกประกาศในซอร์สโค้ดเป็นจำนวนเต็มแบบยาว 32 บิตที่ไม่มีเครื่องหมาย ซึ่งหมายความว่าหมายเลขไอโหนดเป็นค่าจำนวนเต็มที่มีขนาดสูงสุดคือ 2 ^ 32 ซึ่งคำนวณได้ถึง 4,294,967,295 - มากกว่า 4 พันล้านไอโหนด

นั่นคือค่าสูงสุดตามทฤษฎี ในทางปฏิบัติจำนวน inodes ในระบบไฟล์ ext4 จะถูกกำหนดเมื่อระบบไฟล์ถูกสร้างขึ้นที่อัตราส่วนดีฟอลต์คือหนึ่งไอโหนดต่อ 16 KB ของความจุระบบไฟล์ โครงสร้างไดเร็กทอรีถูกสร้างขึ้นทันทีเมื่อระบบไฟล์ถูกใช้งานเนื่องจากไฟล์และไดเร็กทอรีถูกสร้างขึ้นภายในระบบไฟล์

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

เราจะดูระบบไฟล์ในพาร์ติชันแรกของฮาร์ดไดรฟ์ตัวแรกดังนั้นเราจึงพิมพ์สิ่งต่อไปนี้:

df -i / dev / sda1

ผลลัพธ์ทำให้เรา:

  • ระบบไฟล์ : ระบบไฟล์กำลังถูกรายงาน
  • Inodes : จำนวน inodes ทั้งหมดในระบบไฟล์นี้
  • IUsed : จำนวน inodes ที่ใช้งาน
  • IFree : จำนวน inodes ที่เหลือสำหรับการใช้งาน
  • IUse% : เปอร์เซ็นต์ของ inodes ที่ใช้
  • Mounted on : จุดเชื่อมต่อสำหรับระบบไฟล์นี้

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

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

หากต้องการดูขนาดของบล็อกดิสก์ในระบบไฟล์ของคุณคุณสามารถใช้blockdevคำสั่งกับ--getbszตัวเลือก (รับขนาดบล็อก):

sudo blockdev --getbsz / dev / sda

ขนาดบล็อกคือ 4096 ไบต์

มาใช้-Bตัวเลือก (ขนาดบล็อก) เพื่อระบุขนาดบล็อก 4096 ไบต์และตรวจสอบการใช้งานดิสก์ปกติ:

df -B 4096 / dev / sda1

ผลลัพธ์นี้แสดงให้เราเห็น:

  • ระบบไฟล์ : ระบบไฟล์ที่เรากำลังรายงาน
  • 4K-blocks : จำนวนบล็อกทั้งหมด 4 KB ในระบบไฟล์นี้
  • ใช้ : มีการใช้บล็อก 4K จำนวนเท่าใด
  • พร้อมใช้งาน : จำนวนบล็อก 4 KB ที่เหลือที่พร้อมใช้งาน
  • ใช้% : เปอร์เซ็นต์ของบล็อก 4 KB ที่ถูกใช้
  • Mounted on : จุดเชื่อมต่อสำหรับระบบไฟล์นี้

ในตัวอย่างของเราการจัดเก็บไฟล์ (และการจัดเก็บ inodes และโครงสร้างไดเร็กทอรี) ได้ใช้เนื้อที่ 28 เปอร์เซ็นต์ในระบบไฟล์นี้โดยมีค่าใช้จ่าย 10 เปอร์เซ็นต์ของ inodes ดังนั้นเราจึงอยู่ในเกณฑ์ดี

Inode Metadata

หากต้องการดูหมายเลขไอโหนดของไฟล์เราสามารถใช้lsกับ-iตัวเลือก (inode):

ls -i geek.txt

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

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

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

นี่คือลักษณะของคำสั่งตัวอย่างนี้:

sudo debugfs -R "stat" / dev / sda1

ดังที่แสดงด้านล่างdebugfsคำสั่งจะดึงข้อมูลจากไอโหนดและนำเสนอให้เราในless:

เราจะแสดงข้อมูลต่อไปนี้:

  • Inode : จำนวนไอโหนดที่เรากำลังดูอยู่
  • ประเภท : นี่เป็นไฟล์ปกติไม่ใช่ไดเร็กทอรีหรือลิงก์สัญลักษณ์
  • โหมด : สิทธิ์ของไฟล์ในรูปฐานแปด
  • ธง : ตัวบ่งชี้ที่แสดงถึงคุณลักษณะหรือฟังก์ชันการทำงานที่แตกต่างกัน 0x80000 คือแฟล็ก "ขอบเขต" (ดูเพิ่มเติมด้านล่างนี้)
  • การสร้าง : ระบบไฟล์เครือข่าย (NFS) ใช้สิ่งนี้เมื่อมีคนเข้าถึงระบบไฟล์ระยะไกลผ่านการเชื่อมต่อเครือข่ายราวกับว่าพวกเขาติดตั้งอยู่บนเครื่องโลคัล หมายเลขไอโหนดและหมายเลขรุ่นถูกใช้เป็นรูปแบบของตัวจัดการไฟล์
  • เวอร์ชัน : เวอร์ชัน inode
  • ผู้ใช้ : เจ้าของไฟล์
  • กลุ่ม : เจ้าของกลุ่มของไฟล์
  • โครงการ : ควรเป็นศูนย์เสมอ
  • ขนาด : ขนาดของไฟล์
  • ไฟล์ ACL : รายการควบคุมการเข้าถึงไฟล์ สิ่งเหล่านี้ออกแบบมาเพื่อให้คุณให้สิทธิ์การเข้าถึงแบบควบคุมแก่ผู้ที่ไม่ได้อยู่ในกลุ่มเจ้าของ
  • ลิงก์ : จำนวนฮาร์ดลิงก์ไปยังไฟล์
  • Blockcount : จำนวนเนื้อที่ฮาร์ดไดรฟ์ที่จัดสรรให้กับไฟล์นี้โดยกำหนดเป็นชิ้นขนาด 512 ไบต์ ไฟล์ของเราได้รับการจัดสรรแปดไฟล์ซึ่งมีขนาด 4,096 ไบต์ ดังนั้นไฟล์ 98 ไบต์ของเราจึงอยู่ในบล็อกดิสก์ 4,096 ไบต์เดียว
  • ส่วนย่อย : ไฟล์นี้ไม่แยกส่วน (นี่คือแฟล็กที่ล้าสมัย)
  • Ctime : เวลาที่สร้างไฟล์
  • Atime : เวลาที่เข้าถึงไฟล์นี้ครั้งล่าสุด
  • Mtime : เวลาที่แก้ไขไฟล์นี้ครั้งล่าสุด
  • Crtime : เวลาที่สร้างไฟล์
  • ขนาดของฟิลด์ไอโหนดพิเศษ : ระบบไฟล์ ext4 แนะนำความสามารถในการจัดสรรไอโหนดบนดิสก์ที่ใหญ่ขึ้นในเวลาฟอร์แมต ค่านี้คือจำนวนไบต์พิเศษที่ไอโหนดใช้อยู่ พื้นที่พิเศษนี้ยังสามารถใช้เพื่อรองรับความต้องการในอนาคตสำหรับเมล็ดพันธุ์ใหม่หรือเพื่อเก็บแอตทริบิวต์เพิ่มเติม
  • Inode checksum : การตรวจสอบสำหรับไอโหนดนี้ซึ่งทำให้สามารถตรวจจับได้ว่าไอโหนดเสียหายหรือไม่
  • Extents : หากมีการใช้ Extents (ใน ext4 ซึ่งเป็นค่าเริ่มต้น) ข้อมูลเมตาเกี่ยวกับการใช้ดิสก์บล็อกของไฟล์จะมีตัวเลขสองตัวที่บ่งบอกถึงจุดเริ่มต้นและจุดสิ้นสุดของแต่ละส่วนของไฟล์ที่แยกส่วน วิธีนี้มีประสิทธิภาพมากกว่าการจัดเก็บดิสก์ทุกบล็อกที่นำมาจากแต่ละส่วนของไฟล์ เรามีขอบเขตหนึ่งเนื่องจากไฟล์ขนาดเล็กของเราอยู่ในบล็อกดิสก์เดียวที่ออฟเซ็ตบล็อกนี้

ชื่อไฟล์อยู่ที่ไหน

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

เมื่อเทียบกับ inode โครงสร้างไดเร็กทอรีมีข้อมูลจำนวน จำกัด เกี่ยวกับไฟล์ เก็บเฉพาะหมายเลขไอโหนดชื่อและความยาวของชื่อไฟล์เท่านั้น

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

ไดเร็กทอรี Inodes

คุณสามารถดูหมายเลขไอโหนดของไดเร็กทอรีได้อย่างง่ายดายเช่นเดียวกับที่คุณเห็นสำหรับไฟล์

ในตัวอย่างต่อไปนี้เราจะใช้ls กับตัวเลือก-l(รูปแบบยาว) -i(inode) และ-d(ไดเรกทอรี) และดูที่workไดเรกทอรี:

ls -lid งาน /

เนื่องจากเราใช้-dตัวเลือก (ไดเร็กทอรี)  lsรายงานบนไดเร็กทอรีเองไม่ใช่เนื้อหา ไอโหนดสำหรับไดเร็กทอรีนี้คือ 1443016

ในการทำซ้ำสำหรับhomeไดเร็กทอรีเราพิมพ์ดังต่อไปนี้:

ls -lid ~

ไอโหนดสำหรับhomeไดเร็กทอรีคือ 1447510 และworkไดเร็กทอรีอยู่ในโฮมไดเร็กทอรี ตอนนี้เรามาดูเนื้อหาของworkไดเร็กทอรี แทนที่จะเป็น  -dตัวเลือก (ไดเรกทอรี) เราจะใช้-aตัวเลือก (ทั้งหมด) ซึ่งจะแสดงรายการไดเรกทอรีที่มักจะซ่อนอยู่

เราพิมพ์สิ่งต่อไปนี้:

ls -lia ทำงาน /

เนื่องจากเราใช้-aตัวเลือก (ทั้งหมด) รายการ single- (.) และ double-dot (.. ) จะปรากฏขึ้น รายการเหล่านี้แสดงถึงไดเร็กทอรี (single-dot) และพาเรนต์ไดเร็กทอรี (double-dot.)

หากคุณดูหมายเลขไอโหนดสำหรับรายการจุดเดียวคุณจะเห็นว่ามันคือ 1443016 ซึ่งเป็นหมายเลขไอโหนดเดียวกับที่เราได้รับเมื่อเราค้นพบหมายเลขไอโหนดสำหรับworkไดเร็กทอรี นอกจากนี้หมายเลขไอโหนดสำหรับรายการจุดสองจุดจะเหมือนกับหมายเลขไอโหนดสำหรับhomeไดเร็กทอรี

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

Inodes และลิงค์

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

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

สมมติว่าเรามีไดเร็กทอรีที่มีสองไฟล์อยู่ในนั้นหนึ่งคือสคริปต์และอีกไฟล์เป็นแอปพลิเคชันดังที่แสดงด้านล่าง

เราสามารถใช้คำสั่ง ln และ-sตัวเลือก (สัญลักษณ์) เพื่อสร้างซอฟต์ลิงก์ไปยังไฟล์สคริปต์ได้ดังนี้:

ls -s my_script geek.sh

เราได้สร้างการเชื่อมโยงไปยังที่เรียกว่าmy_script.sh geek.shเราสามารถพิมพ์สิ่งต่อไปนี้และใช้  ls เพื่อดูไฟล์สคริปต์สองไฟล์:

ls -li * .sh

รายการสำหรับgeek.sh ปรากฏเป็นสีน้ำเงิน ตัวอักษรตัวแรกของธงสิทธิ์เป็น“L” สำหรับการเชื่อมโยงและ  จุดที่จะต้อง-> my_script.shทั้งหมดนี้บ่งชี้ว่าgeek.shเป็นลิงค์

ตามที่คุณคาดหวังไฟล์สคริปต์ทั้งสองมีหมายเลขไอโหนดต่างกัน สิ่งที่น่าแปลกใจกว่านั้นคือซอฟต์ลิงค์geek.shไม่มีสิทธิ์ผู้ใช้เหมือนกับไฟล์สคริปต์ต้นฉบับ ในความเป็นจริง  geek.shสิทธิ์ในการอนุญาตนั้นเปิดกว้างกว่ามาก - ผู้ใช้ทุกคนมีสิทธิ์ทั้งหมด

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

เราจะลบไฟล์ต้นฉบับและดูว่าจะเกิดอะไรขึ้นเมื่อเราพิมพ์สิ่งต่อไปนี้เพื่อดูเนื้อหาของ  geek.sh:

rm my_script.sh
แมว geek.sh

ลิงก์สัญลักษณ์เสียและการเปลี่ยนเส้นทางล้มเหลว

ตอนนี้เราพิมพ์สิ่งต่อไปนี้เพื่อสร้างฮาร์ดลิงก์ไปยังไฟล์แอปพลิเคชัน:

ln แอพพิเศษ geek-app

หากต้องการดู inodes ของไฟล์ทั้งสองนี้ให้พิมพ์ดังต่อไปนี้:

ls -li

ทั้งสองดูเหมือนไฟล์ทั่วไป ไม่มีอะไรเกี่ยวกับการgeek-appระบุว่าเป็นลิงก์ในลักษณะที่lsรายชื่อgeek.shทำ นอกจากนี้  geek-app ยังมีสิทธิ์ผู้ใช้เช่นเดียวกับไฟล์ต้นฉบับ อย่างไรก็ตามสิ่งที่น่าแปลกใจคือทั้งสองแอปพลิเคชันมีหมายเลขไอโหนดเดียวกัน: 1441797

รายการไดเร็กทอรีสำหรับgeek-appประกอบด้วยชื่อ "geek-app" และหมายเลขไอโหนด แต่จะเหมือนกับหมายเลขไอโหนดของไฟล์ต้นฉบับ ดังนั้นเราจึงมีรายการระบบไฟล์สองรายการที่มีชื่อต่างกันซึ่งทั้งคู่ชี้ไปที่ไอโหนดเดียวกัน ในความเป็นจริงจำนวนรายการสามารถชี้ไปที่ไอโหนดเดียวกันได้

เราจะพิมพ์สิ่งต่อไปนี้และใช้statโปรแกรมเพื่อดูไฟล์เป้าหมาย:

แอพพิเศษ stat

เราเห็นว่าฮาร์ดลิงก์สองอันชี้ไปที่ไฟล์นี้ สิ่งนี้ถูกเก็บไว้ในไอโหนด

ในตัวอย่างต่อไปนี้เราลบไฟล์ต้นฉบับและพยายามใช้ลิงก์ด้วยรหัสลับที่ปลอดภัย:

rm แอปพิเศษ
./geek-app ที่ถูกต้องhorsebatterystaple

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

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

เราจะพิมพ์ข้อความต่อไปนี้และใช้ stat อีกครั้ง - ในครั้งนี้geek-app:

แอพ stat geek

รายละเอียดเหล่านี้ดึงมาจากไอโหนด (1441797) เดียวกันกับstatคำสั่งก่อนหน้า จำนวนลิงก์ลดลงหนึ่งรายการ

เนื่องจากเราอยู่ในฮาร์ดลิงก์เดียวไปยังไอโหนดนี้หากเราลบ  geek-appมันจะลบไฟล์อย่างแท้จริง ระบบไฟล์จะเพิ่มไอโหนดและทำเครื่องหมายโครงสร้างไดเร็กทอรีด้วยไอโหนดเป็นศูนย์ ไฟล์ใหม่สามารถเขียนทับที่จัดเก็บข้อมูลในฮาร์ดไดรฟ์ได้

ที่เกี่ยวข้อง: วิธีใช้คำสั่ง stat บน Linux

Inode Overheads

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

  • ค้นหาโครงสร้างไดเร็กทอรีที่เหมาะสม
  • อ่านหมายเลขไอโหนด
  • ค้นหาไอโหนดที่ถูกต้อง
  • อ่านข้อมูล inode
  • ทำตามลิงก์ไอโหนดหรือส่วนขยายไปยังบล็อกดิสก์ที่เกี่ยวข้อง
  • อ่านข้อมูลไฟล์

จำเป็นต้องกระโดดไปรอบ ๆ อีกเล็กน้อยหากข้อมูลไม่ติดกัน

ลองนึกภาพงานที่ต้องทำ  ls เพื่อแสดงรายการไฟล์รูปแบบยาวของไฟล์จำนวนมาก มีการกลับไปกลับมามากมายlsเพื่อให้ได้ข้อมูลที่จำเป็นในการสร้างผลลัพธ์

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

ตอนนี้คุณจะรู้ว่าทำไม