จะเกิดอะไรขึ้นเมื่อคุณลบฮาร์ดลิงก์


คำตอบ:


110

ใน Unix ไฟล์ปกติทั้งหมดคือฮาร์ดลิงก์ hardlinks ใน Unix (และส่วนใหญ่ (ทั้งหมด?)) inodeระบบไฟล์ที่มีการอ้างอิงถึงสิ่งที่เรียกว่า inodeมีเคาน์เตอร์อ้างอิงเมื่อคุณมี "การเชื่อมโยง" หนึ่งแฟ้ม (ซึ่งเป็นวิธีการทำงาน operandi ปกติ) เคาน์เตอร์คือ 1. เมื่อคุณสร้างที่สองสามสี่ลิงก์ ฯลฯ เคาน์เตอร์จะเพิ่มขึ้น (เพิ่มขึ้น) แต่ละ เวลาโดยหนึ่ง เมื่อคุณลบ ( rm) ลิงค์เคาน์เตอร์จะลดลง (ลดลง) หนึ่งรายการ หากตัวนับลิงก์ถึง 0 ระบบไฟล์จะลบinodeและทำเครื่องหมายพื้นที่ที่พร้อมใช้งาน

ในระยะสั้นตราบใดที่คุณไม่ได้ลบลิงค์สุดท้ายไฟล์จะยังคงอยู่

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

IMHO นี้เป็นวิธีที่ง่ายที่สุดในการทำความเข้าใจฮาร์ดลิงก์ (และความแตกต่างจากซอฟต์ลิงค์)


7
unlink()นอกจากนี้ยังมีการเรียกระบบสำหรับการลบไฟล์ที่เป็น
mouviciel

1
นี้ไม่ครอบคลุมถึงสถานการณ์ที่ไฟล์จะเปิดเมื่อการเชื่อมโยงสุดท้ายคือunlinkเอ็ด
cjm

5
@OrangeDog ไม่ถูกต้องเนื่องจาก hardlinks ไม่สามารถข้ามระบบไฟล์และ/procเป็นระบบไฟล์แยกต่างหาก (เสมือน)
cjm

2
/ proc ยังทำหน้าที่สะท้อนโครงสร้างข้อมูลภายในของเคอร์เนล (เป็นวิธีสำหรับเคอร์เนล Linux ที่เปิดเผยข้อมูลบางอย่างในรูปแบบที่กำหนดไว้อย่างสมเหตุสมผลโดยไม่ต้องเข้าถึงหน่วยความจำเคอร์เนลโดยตรงทั้งหมด ดังนั้นจึงมีความแม่นยำมากกว่าที่จะบอกว่าเคอร์เนลติดตามข้อเท็จจริงที่ว่าไฟล์เปิดอยู่และแสดงข้อมูลนั้นผ่าน procfs
CVn

1
และใช่การโทรunlink()เพื่อลบไฟล์ทำให้ฉันงุนงงไม่สิ้นสุดเมื่อฉันเริ่มเล่นกับการเขียนโปรแกรม C บน MS-DOS บางครั้งย้อนกลับไปในช่วงครึ่งแรกของปี 1990 :)
CVn

12

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


1
นี่เป็นเรื่องจริง แต่ไม่ใช่ภาพที่สมบูรณ์
xenoterracide

3
กุญแจสำคัญคือการสร้างไฟล์ข้อความยังเป็นการเพิ่มการเชื่อมโยงอย่างหนัก ในระบบไฟล์ * NIX ไฟล์ทั้งหมด (inodes) จะต้องฮาร์ดลิงก์อย่างน้อยหนึ่งครั้งในโครงสร้างไดเร็กทอรี
OrangeDog

0

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

เมื่อคุณสร้างฮาร์ดลิงก์สำหรับไฟล์นั้นไฟล์ hardlink-ed จะชี้ไปที่ข้อมูลเดียวกันกับไฟล์ต้นฉบับที่ชี้ไป

ป้อนคำอธิบายรูปภาพที่นี่

ดังในตัวอย่างนี้ a.txt ชี้ไปที่ข้อมูล (ไบต์) ของไฟล์ที่อยู่ในไดรฟ์เมื่อสร้าง hardlink b.txt ขึ้นมามันจะชี้ไปที่สิ่งที่ a.txt ชี้ไป

ดังนั้นการลบอันใดอันหนึ่งจะไม่ส่งผลกระทบต่ออีกอันหนึ่งซึ่งแยกออกจากกัน

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


2
ฉันคิดว่ามันเป็นสิ่งสำคัญที่คุณชี้แจงว่าFILE "A.txt"เป็นเหมือนLINK "B.txt"โดยเฉพาะอย่างยิ่งเมื่อคุณได้เรียกว่าหนึ่งและอื่นFILELINKลิงค์นี้เป็นลูกศรสีดำจริงๆ
roaima

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