ทุกสิ่งที่คุณอยากรู้เกี่ยวกับ inodes บน Linux
ระบบไฟล์ Linux อาศัย inodes ส่วนสำคัญของการทำงานภายในของระบบไฟล์เหล่านี้มักจะเข้าใจผิด มาดูกันว่าพวกเขาคืออะไรและทำอะไร
องค์ประกอบของระบบไฟล์
ตามความหมายระบบไฟล์จำเป็นต้องจัดเก็บไฟล์และยังมีไดเร็กทอรี ไฟล์จะถูกเก็บไว้ในไดเร็กทอรีและไดเร็กทอรีเหล่านี้สามารถมีไดเร็กทอรีย่อย มีบางอย่างต้องบันทึกว่าไฟล์ทั้งหมดอยู่ที่ใดในระบบไฟล์สิ่งที่เรียกว่าบัญชีใดเป็นของบัญชีใดมีสิทธิ์ใดและอื่น ๆ อีกมากมาย ข้อมูลนี้เรียกว่าข้อมูลเมตาเนื่องจากเป็นข้อมูลที่อธิบายข้อมูลอื่น ๆ
ในระบบไฟล์ Linux ext4 โครงสร้างไอโหนดและไดเร็กทอรีจะทำงานร่วมกันเพื่อจัดเตรียมเฟรมเวิร์กที่รองรับซึ่งเก็บข้อมูลเมตาทั้งหมดสำหรับทุกไฟล์และไดเร็กทอรี พวกเขาทำให้เมตาใช้ได้กับทุกคนที่ต้องการมันไม่ว่าจะเป็นเคอร์เนลการใช้งานของผู้ใช้หรือสาธารณูปโภคลินุกซ์เช่นls
, และstat
df
ขนาด 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 พยายามทำการแคชไฟล์ล่วงหน้าให้มากที่สุด สิ่งนี้ช่วยได้มาก แต่ในบางครั้ง - เช่นเดียวกับระบบไฟล์อื่น ๆ - ค่าโสหุ้ยสามารถมองเห็นได้ชัดเจน
ตอนนี้คุณจะรู้ว่าทำไม