จะยกเลิกการลิงก์ (ลบ) ฮาร์ดลิงก์พิเศษ“.” ที่สร้างขึ้นสำหรับโฟลเดอร์ได้อย่างไร?


29

บน Linux เมื่อคุณสร้างโฟลเดอร์มันจะสร้างฮาร์ดลิงก์สองลิงก์ไปยังไอโหนดที่เกี่ยวข้องโดยอัตโนมัติ หนึ่งในนั้นคือโฟลเดอร์ที่คุณขอให้สร้างอีกอันเป็น.โฟลเดอร์พิเศษที่โฟลเดอร์นี้

ตัวอย่าง:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

อย่างที่คุณเห็นทั้งด้านในfolderและ.ด้านในfolderมีหมายเลขไอโหนดเดียวกัน (แสดงพร้อม-iตัวเลือก)

มีอยู่แล้วเพื่อลบ.hardlink พิเศษนี้

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

ฉันพยายามมองrmผู้ชาย แต่ไม่สามารถหาทางทำได้ เมื่อฉันพยายามลบ.สิ่งที่ฉันได้รับคือ:

rm: "." และ ".. " อาจไม่ถูกลบ

ฉันอยากรู้จริง ๆ เกี่ยวกับวิธีการทำงานของสิ่งเหล่านี้ทั้งหมดดังนั้นอย่าละเว้นจากการ verbose มากในเรื่อง

แก้ไข: บางทีฉันไม่ชัดเจนกับโพสต์ของฉัน แต่ฉันต้องการเข้าใจกลไกพื้นฐานที่รับผิดชอบ.ไฟล์และสาเหตุที่พวกเขาไม่สามารถลบได้

ฉันรู้ว่ามาตรฐาน POSIX ปิดการใช้งานโฟลเดอร์ที่มีการเชื่อมโยงน้อยกว่า 2 แต่ไม่เข้าใจว่าทำไม ฉันต้องการทราบว่ามันเป็นไปได้ที่จะทำมันต่อไป



@StephenKitt โปรดดูการแก้ไขของฉัน
Fantattitude

1
ฉันถอนการโหวตของฉันแล้วเราจะมาดูกันว่าการออกเสียงลงคะแนนเป็นอย่างไร ...
สตีเฟ่นคิ

2
ทั้งสองมีความจำเป็นสำหรับเส้นทางญาติ ทำไมคุณต้องการลบเหล่านี้ (นอกเหนือจากความอยากรู้ธรรมดา)
HalosGhost

@ HalosGhost ฉันแค่อยากรู้อยากเห็นมากฮ่าฮ่าสำรวจข้อ จำกัด ของระบบและอย่างไรและทำไมมันถูกออกแบบมาด้วยวิธีนี้
Fantattitude

คำตอบ:


46

เป็นไปได้ทางเทคนิคที่จะลบ.อย่างน้อยในระบบไฟล์ EXT4 หากคุณสร้างอิมเมจระบบไฟล์test.imgให้ติดตั้งและสร้างtestโฟลเดอร์จากนั้นยกเลิกการต่อเชื่อมอีกครั้งคุณสามารถแก้ไขได้โดยใช้debugfs :

debugfs -w test.img
cd test
unlink .

debugfs ไม่บ่นและลบหน้าที่ .รายการไดเรกทอรีในระบบแฟ้มtestไดเรกทอรียังคงสามารถใช้งานได้กับคนแปลกใจ:

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

แสดงให้เห็นเท่านั้น

..

ดังนั้น.มันจะหายไป ยังcd . , ls ., pwdยังคงทำงานตามปกติ!

ฉันจะทำก่อนหน้านี้การทดสอบนี้ใช้rmdir .แต่ที่ลบ inode ไดเรกทอรี ( ขนาดใหญ่ต้องขอบคุณBowlOfRedสำหรับชี้นี้ ) ซึ่งออกtestรายการไดเรกทอรีห้อยและเป็นเหตุผลที่แท้จริงสำหรับปัญหาที่พบ ในสถานการณ์สมมตินี้testโฟลเดอร์นั้นจะไม่สามารถใช้งานได้ หลังจากติดตั้งภาพแล้วให้รันlsผลิต

ls: cannot access '/mnt/test': Structure needs cleaning

และบันทึกของเคอร์เนลจะแสดงขึ้นมา

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

การรันe2fsckในสถานการณ์นี้บนอิมเมจจะเป็นการลบtestไดเร็กทอรีทั้งหมด (inode ไดเรคทอรีหายไปดังนั้นจึงไม่มีอะไรจะเรียกคืน)

ทั้งหมดนี้แสดงให้เห็นว่า.มีอยู่เป็นนิติบุคคลเฉพาะในระบบไฟล์ EXT4 ฉันได้รับความประทับใจจากรหัสระบบแฟ้มในเคอร์เนลที่มันคาดหวัง.และ..มีอยู่และเตือนถ้าพวกเขาไม่ได้ (ดูnamei.c) แต่ด้วยการunlink .ทดสอบที่ใช้ฉันไม่เห็นคำเตือนนั้น e2fsckไม่ชอบ.รายการไดเรกทอรีที่ขาดหายไปและเสนอให้แก้ไข:

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

สิ่งนี้จะสร้าง.รายการไดเรกทอรีใหม่


น่าสนใจมาก! ขอขอบคุณ! ดังนั้น.โฟลเดอร์นั้นมีอยู่จริงภายใน FS และเครื่องมือต่าง ๆ คาดว่ามันจะทำงานได้อย่างถูกต้อง
Fantattitude

เป็นคนที่ดีจริง ๆ ฉันไม่รู้ Linux และ FS เพียงพอที่จะหาข้อมูลแบบนี้ได้ฉันจึงรู้สึกขอบคุณมากที่คุณใช้เวลาตอบฉัน :)
Fantattitude

3
คุณลองเปลี่ยน "rmdir" (ซึ่งลบ inode จริง) เป็น "unlink" (ซึ่งจะลบรายการไดเรกทอรีเท่านั้น) ดูเหมือนว่าจะออกจากไดเรกทอรีทำงานส่วนใหญ่ (ไม่มีข้อผิดพลาดmountหรือls) ฉันไม่เห็นว่ามีปัญหาอื่นเกิดขึ้นหรือไม่
BowlOfRed

@ BowlOfRed ขอบคุณมากนั่นเป็นจุดที่ดีมาก - ดังนั้นrmdir .จริงๆแล้วฉันก็ทำลายtestและปล่อยให้มันเป็นรายการไดเรกทอรีห้อยต่องแต่งซึ่งคุณคาดหวังว่าจะทำให้เกิดปัญหา ฉันจะตรวจสอบunlinkและอัปเดตคำตอบของฉัน!
Stephen Kitt

1
@GiacomoCatenazzi ไม่ได้โดยตรงสิทธิ์และความเป็นเจ้าของจะถูกเก็บไว้ใน inode ไม่ใช่รายการไดเรกทอรี
Stephen Kitt

5

ไม่มีวิธีลบรายการไดเรกทอรีนี้ .รายการหมายถึง "ไดเรกทอรีนี้" ที่..หมายถึงรายการ "ไดเรกทอรีแม่ของไดเรกทอรีนี้" พวกเขาไม่ได้เชื่อมโยงอย่างหนักจริง ๆ นั่นเป็นเพียงวิธีที่โครงสร้างไดเรกทอรีได้รับการสร้าง / แสดง


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

3
> ลิงก์เหล่านี้ไม่ใช่ลิงก์ที่ยากจริงๆนั่นเป็นเพียงวิธีสร้างโครงสร้างไดเรกทอรี / สร้าง ซ้ำซ้อน unix.stackexchange.com/questions/289385/…
Xalorous

@Xalorous และดังนั้นสิ่งที่แสดงถึงไฟล์พิเศษเหล่านี้หากพวกเขาไม่ใช่ฮาร์ดลิงก์พวกเขาคืออะไร? พวกเขามีอยู่ดังนั้นพวกเขาจะต้องอยู่ที่ไหนสักแห่งยกเว้นถ้าพวกเขาเพิ่งได้รับการแสดงโดยlsหรือเครื่องมืออื่น ๆ โดยอัตโนมัติซึ่งดูเหมือนจะไม่สมจริงสำหรับฉัน
Fantattitude

@Fantattitude พวกเขาเป็นวิธีการที่โฟลเดอร์แสดงถึงตัวเองเพื่อใช้ความต้องการ POSIX ที่ rmdir ไม่สามารถลบ PWD ได้
Xalorous

1
ในระบบไฟล์ Unix แบบดั้งเดิมพวกเขากำลังเชื่อมโยงอย่างหนักจริง ๆ พวกเขากำลังสังเคราะห์โดยคนขับสำหรับระบบไฟล์อื่น ๆ
Barmar

2

ตามที่อธิบายในLion's Notes ในซอร์สโค้ด Unix 6Unix แรก ๆ มีไฟล์ดิสก์ที่ทั้งไฟล์และไดเรกทอรีถูกแสดงบนดิสก์โดยโครงสร้างไอโหนด มีบิตพิเศษที่ระบุว่าเนื้อหาไฟล์เป็นไดเรกทอรี แต่ละไอโหนดมีลิงค์ไปยังไอโหนดของมันเองที่อนุญาตให้ไฟล์รู้ว่ามันอยู่ในไดเร็กตอรี่อะไรยกเว้นเป็นไดเร็กตอรี่ '/' ซึ่งเป็นของตัวเอง นอกจากนี้ยังมีลิงก์ไปยังเนื้อหา หากไอโหนดไม่มีเนื้อหามันจะถูกส่งกลับไปยังรายการฟรี เนื่องจากไดเรกทอรีเป็นเพียงไฟล์ที่มีความสุขแม้กระทั่งไดเรกทอรีที่ว่างเปล่าจึงต้องมีเนื้อหาเพื่อป้องกันไม่ให้มีการรวบรวมขยะ ดังนั้น .. คือลิงก์ของ inode ไปยัง parent inode และ. อยู่ที่นั่นเพื่อระบุว่าไดเรกทอรีนั้นยังใช้งานได้อยู่ rmdir (โดยการโทรยกเลิกการเชื่อมโยง) สามารถลบ


0

ดังที่คำตอบของ 'โพสต์ ' ซ้ำซ้อนที่สุดกล่าวว่ามาตรฐาน POSIX ระบุว่าหาก rmdir พยายามลบไดเรกทอรีปัจจุบันมันจะล้มเหลว

ด้วยสิ่งใดก็ตามที่คุณสร้างขึ้นคุณจะต้องมีรากฐาน เป็นการยากที่จะกำหนดเส้นทางที่สัมพันธ์กันโดยไม่มีวิธีการพูดว่า 'ที่นี่' ดังนั้น '.' ถูกกำหนดให้เป็น 'ที่นี่'

นอกจากนี้คุณสามารถลบ 'dot' และ 'dot dot' เขียนระบบปฏิบัติการของคุณเองที่ไม่ได้กำหนดไว้ แม้ว่า Unix (และโดยส่วนขยาย Mac OSX), Linux และแม้กระทั่ง MS DOS และ Windows ทั้งหมดใช้ dot และ dotdot

TL; DR - 'dot' อยู่ในนิยามของระบบปฏิบัติการ


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