ไดเรกทอรีถูกลบเมื่อจำนวนฮาร์ดลิงก์เป็น 0 หรือไม่


10

ไดเรกทอรีถูกลบเมื่อจำนวนฮาร์ดลิงก์เป็น 0 หรือไม่

ไดเรกทอรีมักจะมีอย่างน้อย 2 .เป็นจำนวนครั้งของการเชื่อมโยงอย่างหนักเพราะ เมื่อไหร่rm -rไดเรกทอรีจะลดจำนวนของฮาร์ดลิงก์จาก 2 เป็น 0 โดย 2 แทนที่จะเป็น 1 หรือไม่

จำนวนฮาร์ดลิงก์ของไดเรกทอรีสามารถเป็น 1 ได้หรือไม่?

ขอบคุณ

คำตอบ:


9

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

จำนวนการเชื่อมโยงไปยังไดเรกทอรีจะไม่น้อยกว่าสองเนื่องจากการและ. ..จำนวนไดเรกทอรีย่อยเท่ากับจำนวนลิงก์ลบด้วยสอง ด้วยเหตุนี้คุณไม่สามารถเชื่อมโยงหรือยกเลิกการเชื่อมโยงไดเรกทอรีดังนั้นrm -rจะstatไฟล์ก่อนที่จะลบและใช้rmdirแทนunlinkในไดเรกทอรี การเรียกระบบทั้งสองใช้เส้นทางรหัสที่แตกต่างอย่างสิ้นเชิงในเคอร์เนล


ขอบคุณ ไดเรกทอรีมีฮาร์ดลิงก์..เฉพาะเมื่อมีไดเรกทอรีย่อยใช่ไหม ดังนั้น..จะไม่ปรากฏสำหรับไดเรกทอรีใช่มั้ย
ทิม

..มีอยู่ในแต่ละไดเรกทอรีที่เป็นไดเรกทอรีย่อย ซึ่งก็คือทั้งหมด แต่/มีอันเดียวด้วยดังนั้นไดเรกทอรีทั้งหมด
hildred

1
(1) หากไดเรกทอรีไม่มีส่วนย่อยไดเรกทอรีจะไม่มีฮาร์ดลิงก์..ไปยังตัวเอง ลิงค์ยากไปยัง dir คืออะไร? ไฟล์ที่มีชื่อพา ธ และ.? (2) ทำไมคุณไม่สนใจจุดเมานท์
ทิม

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

1
คุณถูกต้องที่นับการเชื่อมโยงจะไม่น้อยกว่า 2 ..แต่ก็ไม่ได้เพราะ มันเป็นเพราะ.และชื่อในไดเรกทอรีหลักที่ชี้ไปที่มัน ข้อยกเว้นเดียวคือรูทซึ่งไม่มีพาเรนต์ แต่มัน..ชี้ไปที่ตัวมันเองดังนั้นมันจึงมีลิงค์นับ = 2
Barmar

11

ไฟล์ใด ๆ บนระบบไฟล์ UNIX ที่ออกแบบตามหลักการซึ่งมีจำนวนการอ้างอิง (เช่นผลรวมของจำนวน hardlink และจำนวนของการเปิดไฟล์ที่จับ *) ถึง 0 จะถูกลบออก อย่างไรก็ตามสำหรับระบบ UNIX ที่ทันสมัยการrmdirเรียกของระบบจะลบไดเร็กทอรีว่างในการดำเนินการครั้งเดียวแทนที่จะลบ.และ..ทีละหนึ่ง

ในระบบ UNIX ที่ผ่านมาอย่างไรก็ตามการเรียกระบบนี้ไม่มีอยู่ แต่rmdir คำสั่งคือโปรแกรม setuid ( สามารถพบซอร์สโค้ดได้ที่นี่ ) ซึ่งตรวจสอบว่าไดเรกทอรีนั้นว่างเปล่า (นอกเหนือจากรายการพิเศษ) จากนั้นลบออก..และ.ตามลำดับจากนั้นจึงลบไดเรกทอรีเองทั้งหมดด้วยunlinkการเรียกระบบที่รูทเท่านั้นที่ได้รับอนุญาตให้ใช้ในไดเรกทอรี (ดังนั้นทำไมคำสั่งถูกตั้งค่า) ดังนั้นในระบบเหล่านั้นการนับลิงก์ของไดเรกทอรีจะเป็น 1 หลังจากนั้น.ถูกลบออก แต่ก่อนที่ไดเรกทอรีจะถูกลบออกจากไดเรกทอรีหลักดังนั้นมันจะเป็น 0

rmคำสั่งบังเอิญป้องกันไม่ให้รากแม้จะมาจากการลบไดเรกทอรี และrm -rจะเรียกใช้rmdirคำสั่งเพื่อลบไดเรกทอรีหลังจากล้างเนื้อหา

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


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


พฤติกรรมของไดเรกทอรีที่ถูกลบ (เช่นเมื่อตรวจสอบโดยกระบวนการที่เปิดอยู่แล้วหรือเป็นไดเรกทอรีปัจจุบัน) และความหมายที่แน่นอนของ "จำนวนลิงค์" ของไดเรกทอรีนั้นไม่ได้ระบุ ตัวอย่างเช่นบน Mac OS X จะรายงานจำนวนฮาร์ดลิงก์ 2ถึงแม้ว่าจะไม่มีฮาร์ดลิงก์จริง แม้ว่า.และ..ไม่ปรากฏในรายชื่อไดเรกทอรีสามารถเปิดและstatอาจจะเรียกว่ามีชื่อหรือ. ..บน Linux นับการเชื่อมโยงเป็น 0 แต่.และ..เช่นเดียวกันยังคงทำงาน

Mac OS X ยังรายงานจำนวนไฟล์ทั้งหมดในไดเรกทอรีเป็นจำนวนลิงค์แทนที่จะเป็นเพียงจำนวนไดเรกทอรีย่อย แต่มันเป็น 2 แม้กระทั่งเมื่อ.และ..ไป


* ซึ่งรวมถึงตัวอธิบายแบบเปิดปกติส่วนหน่วยความจำที่แมป (รวมถึงเช่นการเรียกใช้ไบนารีและไลบรารีที่แชร์) และประมวลผลไดเรกทอรีปัจจุบัน


2
strcpyไปยังอาร์เรย์ที่มีขนาดคงที่ในไฟล์สั่งการ setuid ... นี่เป็นช่วงเวลาที่ดี!
Andrea Corbellini

@AndreaCorbellini จริง ๆ แล้วมันมีประโยชน์จากการตีพิมพ์mkdirบนพื้นฐานของความจริงที่ว่ามันจะต้องทำสิ่งเดียวกันในสิ่งที่ตรงกันข้าม
Random832

1
ฉันคิดว่าฉันพบแล้ว: securityfocus.com/archive/1/365038/2004-05-31/2004-06-06/0 :) :)
Andrea Corbellini

ถามเกี่ยวกับrmdirจะไม่ removein ..ลบไดเรกทอรีหลัก?
Edward Torvalds

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