Làm cách nào để hủy liên kết (xóa) liên kết cứng đặc biệt. Được tạo cho một thư mục?


29

Trên Linux, khi bạn tạo một thư mục, nó sẽ tự động tạo hai liên kết cứng đến inode tương ứng. Một trong đó là thư mục bạn yêu cầu tạo, .thư mục còn lại là thư mục đặc biệt này.

Thí dụ:

$ 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 ..

Như bạn có thể thấy, cả hai folder.bên trong folderđều có cùng số inode (hiển thị với -itùy chọn).

Có cách nào để xóa liên kết .cứng đặc biệt này ?

Nó chỉ dành cho thử nghiệm và tò mò. Ngoài ra tôi đoán câu trả lời có thể áp dụng cho ..tập tin đặc biệt là tốt.

Tôi đã cố gắng nhìn vào rmcon người nhưng không thể tìm ra cách nào để làm điều đó. Khi tôi cố gắng loại bỏ .tất cả những gì tôi nhận được là:

rm: "." và ".." có thể không bị xóa

Tôi thực sự tò mò về toàn bộ cách thức hoạt động của những thứ này vì vậy đừng kiềm chế quá dài dòng về chủ đề này.

EDIT: Có thể tôi không rõ ràng với bài đăng của mình, nhưng tôi muốn hiểu cơ chế cơ bản chịu trách nhiệm về .các tệp và lý do tại sao chúng không thể bị xóa.

Tôi biết tiêu chuẩn POSIX không cho phép một thư mục có ít hơn 2 liên kết cứng, nhưng thực sự không hiểu tại sao. Tôi muốn biết nếu có thể làm điều đó bằng cách nào.



@StephenKitt Xin vui lòng xem chỉnh sửa của tôi.
Tưởng tượng

1
Tôi đã rút lại phiếu bầu của mình, hãy xem cách bỏ phiếu diễn ra ...
Stephen Kitt

2
Cả hai đều cần thiết cho các đường dẫn tương đối. tại sao bạn muốn loại bỏ những thứ này (ngoài sự tò mò đơn giản)?
HalosGhost

@HalosGhost Tôi chỉ đang rất tò mò haha, khám phá những hạn chế của hệ thống và cách thức và lý do tại sao nó được thiết kế theo cách này.
Tưởng tượng

Câu trả lời:


46

Về mặt kỹ thuật có thể xóa ., ít nhất là trên các hệ thống tập tin EXT4. Nếu bạn tạo một hình ảnh hệ thống tập tin vào test.img, gắn kết nó và tạo một testthư mục, sau đó ngắt kết nối nó một lần nữa, bạn có thể chỉnh sửa nó bằng cách sử dụng debugfs:

debugfs -w test.img
cd test
unlink .

debugfskhông phàn nàn và mạnh mẽ xóa .mục nhập thư mục trong hệ thống tập tin. Thư mục testvẫn có thể sử dụng được, với một điều ngạc nhiên:

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

chỉ hiển thị

..

vì vậy .thực sự là đi Tuy nhiên cd ., ls ., pwdvẫn cư xử như bình thường!

Trước đây tôi đã thực hiện thử nghiệm này bằng cách sử dụng rmdir ., nhưng nó đã xóa nút inode của thư mục ( rất cảm ơn BowlOfRed vì đã chỉ ra điều này ), để lại testmột mục nhập thư mục lơ lửng và là lý do thực sự cho các vấn đề gặp phải. Trong trường hợp này, testthư mục sau đó trở nên không sử dụng được; Sau khi gắn hình ảnh, chạy lssản xuất

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

và nhật ký kernel hiển thị

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

Chạy e2fscktrong tình huống này trên hình ảnh sẽ xóa testhoàn toàn thư mục (inode thư mục đã biến mất nên không có gì để khôi phục).

Tất cả điều này cho thấy .tồn tại như một thực thể cụ thể trong hệ thống tệp EXT4. Tôi đã có ấn tượng từ mã hệ thống tập tin trong kernel mà nó mong đợi ...tồn tại, và cảnh báo nếu chúng không (xem namei.c), nhưng với unlink .thử nghiệm dựa trên cơ sở, tôi đã không thấy cảnh báo đó. e2fsckkhông thích .mục thư mục bị thiếu và đề nghị sửa nó:

$ /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>?

Điều này tạo lại .mục nhập thư mục.


Rất thú vị! Cảm ơn bạn! Vì vậy, .thư mục thực sự tồn tại bên trong FS và các công cụ mong đợi nó hoạt động bình thường.
Tưởng tượng

Bạn thật sự rất tốt, tôi không biết Linux và FS của nó đủ để tự tìm loại infos này vì vậy tôi rất biết ơn bạn đã dành thời gian để trả lời tôi :)
Fantattitude

3
Bạn có thể thử thay đổi "rmdir" (thực sự loại bỏ inode) thành "unlink" (chỉ xóa mục nhập thư mục). Nó dường như để lại một thư mục hầu hết hoạt động (không có lỗi trên mounthoặc ls). Tôi đã không nhìn thấy nếu vấn đề khác phát sinh.
BowlOfRed

@BowlOfRed cảm ơn bạn rất nhiều, đó là một điểm rất tốt - vì vậy tôi rmdir .đã thực sự phá hủy testvà để lại đó là một mục thư mục lơ lửng, mà bạn dự kiến ​​sẽ gây ra vấn đề. Tôi sẽ kiểm tra unlinkvà cập nhật câu trả lời của tôi!
Stephen Kitt

1
@GiacomoCatenazzi không trực tiếp, quyền và quyền sở hữu được lưu trữ trong inode, không phải mục nhập thư mục.
Stephen Kitt

5

Không có cách nào để loại bỏ mục nhập thư mục này. Các .phương tiện nhập "thư mục này", các ..phương tiện nhập "thư mục cha của thư mục này". Chúng thực sự không phải là liên kết cứng, đó chỉ là cách cấu trúc thư mục được tạo / đại diện.


Tôi biết về điều đó, tôi chỉ tò mò nếu có thể vì chúng dường như là liên kết cứng. Nếu họ không tại sao họ lại thêm vào số lượng liên kết cứng của inode?
Tưởng tượng

3
> Chúng thực sự không phải là liên kết cứng, đó chỉ là cách cấu trúc thư mục được tạo / đại diện. Ngoài ra, trùng lặp. unix.stackexchange.com/questions/289385/ Từ
Xalious

@Xalious Và vì vậy, chính xác những gì đại diện cho các tệp đặc biệt này, nếu chúng không phải là liên kết cứng, chúng là gì? Chúng tồn tại nên chúng phải ở một nơi nào đó, trừ khi chúng chỉ được hiển thị bởi lshoặc các công cụ khác tự động không có vẻ thực tế đối với tôi.
Tưởng tượng

@Fantattitude chúng là cách thư mục thể hiện chính nó để thực hiện yêu cầu POSIX mà rmdir không thể xóa PWD.
Xalious

1
Trong các hệ thống tập tin Unix truyền thống, chúng là các liên kết cứng thực sự. Chúng được tổng hợp nhanh chóng bởi trình điều khiển cho các hệ thống tập tin khác.
Barmar

2

Như được mô tả trong Ghi chú của Lion về Mã nguồn Unix 6Unix ban đầu có một tệp đĩa trong đó cả tệp và thư mục được thể hiện trên đĩa bằng cấu trúc inode. Có một bit đặc biệt chỉ ra rằng nội dung tệp là một thư mục. Mỗi inode có một liên kết đến inode sở hữu của nó cho phép một tệp biết nó nằm trong thư mục nào. Ngoại lệ là thư mục '/' sở hữu chính nó. Ngoài ra còn có một liên kết đến nội dung. Nếu một nút không có nội dung, nó có thể được đưa trở lại danh sách miễn phí. Vì một thư mục chỉ là một tập tin may mắn, ngay cả một thư mục trống cũng phải có nội dung để giữ cho nó không bị thu gom rác. Do đó, .. là liên kết của inode với inode cha và. đã ở đó để chỉ ra thư mục vẫn có thể sử dụng được. rmdir (bằng cách gọi unlink) có thể loại bỏ.


0

Như câu trả lời 'có thể trùng lặp' của bài đăng , tiêu chuẩn POSIX chỉ định rằng nếu rmdir cố xóa thư mục hiện tại, nó sẽ thất bại.

Với bất cứ điều gì bạn xây dựng, bạn phải có một nền tảng. Thật khó để xác định các đường dẫn tương đối mà không có cách nào để nói 'ở đây'. Nên '.' được định nghĩa là "ở đây".

Ngoài ra, bạn có thể xóa 'chấm' và 'chấm chấm'. Viết hệ điều hành của riêng bạn mà không xác định chúng. Mặc dù Unix (và bởi Mac OSX mở rộng), Linux và thậm chí cả MS DOS và Windows đều sử dụng dot và dotdot.

TL; DR - 'dot' nằm trong định nghĩa của HĐH.


Câu trả lời này chủ yếu tốt cho TL; DR.
Joshua
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.