นี่เป็นเพียงความคิดที่ไม่ดีเนื่องจากไม่มีวิธีที่จะบอกความแตกต่างระหว่างฮาร์ดลิงก์และชื่อเดิม
การอนุญาตให้ฮาร์ดลิงก์ไปยังไดเรกทอรีต่างๆอาจทำลายโครงสร้างกราฟ acyclic โดยตรงของระบบไฟล์ซึ่งอาจสร้างไดเรกทอรีลูปและไดเรกทอรีย่อยไดเรกทอรีที่ห้อยอยู่ซึ่งจะทำให้fsck
เกิดข้อผิดพลาดและข้อผิดพลาดอื่น ๆ
ก่อนอื่นเพื่อที่จะทำความเข้าใจกับสิ่งนี้ ข้อมูลในระบบไฟล์จะถูกเก็บไว้ในบล็อกบนดิสก์และบล็อกเหล่านั้นจะถูกรวบรวมโดย inode คุณสามารถคิดว่า inode เป็นไฟล์ Inodes ขาดชื่อไฟล์แม้ว่า นั่นคือสิ่งที่ลิงค์เข้ามา
ลิงค์เป็นเพียงตัวชี้ไปยังไอโหนด ไดเรกทอรีเป็น inode ที่เก็บลิงค์ ชื่อไฟล์แต่ละรายการในไดเรกทอรีเป็นเพียงลิงค์ไปยัง inode การเปิดไฟล์ใน Unix นั้นเป็นการสร้างลิงค์ แต่มันเป็นลิงค์ประเภทอื่น (ไม่ใช่ลิงค์ที่มีชื่อ)
ฮาร์ดลิงก์เป็นเพียงรายการไดเรกทอรีพิเศษที่ชี้ไปที่ไอโหนดนั้น เมื่อคุณls -l
จำนวนหลังการอนุญาตคือการนับลิงค์ที่มีชื่อ ไฟล์ปกติส่วนใหญ่จะมีลิงค์เดียว การสร้างฮาร์ดลิงก์ใหม่ไปยังไฟล์จะทำให้ชื่อไฟล์ทั้งสองชี้ไปที่ไอโหนดเดียวกัน บันทึก:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
ตอนนี้คุณสามารถเห็นได้อย่างชัดเจนว่าไม่มีสิ่งใดเป็นฮาร์ดลิงก์ ฮาร์ดลิงก์เหมือนกับชื่อปกติ ในตัวอย่างด้านบนtest
หรือtest2
ไฟล์ต้นฉบับใดและไฟล์ใดที่เป็นฮาร์ดลิงก์ ในตอนท้ายคุณจะไม่สามารถบอกได้อย่างแท้จริง (แม้กระทั่งในการประทับเวลา) เพราะทั้งสองชื่อชี้ไปที่เนื้อหาเดียวกัน inode เดียวกัน:
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
การ-i
ตั้งค่าสถานะเพื่อls
แสดงหมายเลขไอโหนดในตอนต้นของบรรทัด สังเกตวิธีtest
และtest2
มีหมายเลขไอโหนดเดียวกัน แต่test3
มีหมายเลขไอโหนดอื่น
ทีนี้ถ้าคุณได้รับอนุญาตให้ทำสิ่งนี้กับไดเร็กตอรี่สองไดเร็กตอรี่ที่ต่างกันในจุดต่าง ๆ ในระบบไฟล์อาจชี้ไปที่สิ่งเดียวกัน. ในความเป็นจริง subdir สามารถชี้กลับไปที่ปู่ย่าตายายของมันสร้างวง
ทำไมห่วงนี้ถึงเป็นห่วง? เพราะเมื่อคุณกำลังทำการสำรวจคุณจะไม่สามารถตรวจพบว่าคุณกำลังวนซ้ำ (โดยไม่ต้องติดตามหมายเลขไอโหนดขณะที่คุณทำการสำรวจ) ลองนึกภาพคุณกำลังเขียนdu
คำสั่งซึ่งจำเป็นต้องเรียกคืนผ่านส่วนย่อยเพื่อค้นหาข้อมูลเกี่ยวกับการใช้งานดิสก์ จะdu
รู้ได้อย่างไรว่ามันกระทบลูป? มันเกิดข้อผิดพลาดได้ง่ายและมีการบันทึกบัญชีจำนวนมากที่du
ต้องทำเพียงดึงงานง่าย ๆ นี้ออก
Symlinks เป็นสัตว์ร้ายที่แตกต่างกันโดยสิ้นเชิงซึ่งเป็น "ไฟล์" ชนิดพิเศษที่ API ระบบไฟล์ไฟล์จำนวนมากมักจะติดตามโดยอัตโนมัติ หมายเหตุ symlink สามารถชี้ไปยังปลายทางที่ไม่มีอยู่ได้เนื่องจากจะชี้ไปที่ชื่อและไม่เชื่อมต่อโดยตรงกับ inode แนวคิดดังกล่าวไม่สมเหตุสมผลกับฮาร์ดลิงก์เนื่องจากการมีอยู่ของ "ฮาร์ดลิงก์" หมายถึงไฟล์ที่มีอยู่
เหตุใดจึงสามารถdu
จัดการกับ symlink ได้อย่างง่ายดายและไม่เชื่อมโยงที่ยาก เราสามารถเห็นได้ว่าการเชื่อมโยงฮาร์ดนั้นแยกไม่ออกจากรายการไดเรกทอรีปกติ อย่างไรก็ตาม Symlinks มีความพิเศษตรวจจับได้และข้ามได้!
du
สังเกตว่า symlink นั้นเป็น symlink และข้ามมันไปจนหมด!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
ชี้ไปที่ใด โดยเฉพาะอย่างยิ่งหลังจากลบฮาร์ดไดรฟ์ไปยังไดเรกทอรีนี้ในไดเรกทอรีชี้ไปที่..
? มันต้องชี้ไปที่ไหนสักแห่ง