Điều gì xảy ra khi bạn xóa một liên kết cứng?


Câu trả lời:


110

Trong Unix tất cả các tệp bình thường là Hardlinks. Các liên kết cứng trong hệ thống tệp Unix (và hầu hết (tất cả?)) Là các tham chiếu đến cái được gọi là inode. Bộ inodeđếm có tham chiếu, khi bạn có một "liên kết" đến tệp (là modus operandi bình thường) thì bộ đếm là 1. Khi bạn tạo liên kết thứ hai, thứ ba, thứ tư, v.v., bộ đếm được tăng (tăng) mỗi thời gian một. Khi bạn xóa ( rm) một liên kết, bộ đếm bị giảm (giảm) bởi một liên kết. Nếu bộ đếm liên kết đạt 0, hệ thống tập tin sẽ loại bỏ inodevà đánh dấu khoảng trống là có sẵn để sử dụng.

Nói tóm lại, miễn là bạn không xóa liên kết cuối cùng thì tập tin sẽ vẫn còn.

Edit:Các tập tin sẽ vẫn còn ngay cả khi liên kết cuối cùng được gỡ bỏ . Đây là một trong những cách để đảm bảo bảo mật dữ liệu có trong một tệp không thể truy cập được đối với bất kỳ quy trình nào khác. Việc xóa hoàn toàn dữ liệu khỏi hệ thống tập tin chỉ được thực hiện nếu dữ liệu có 0 liên kết đến nó như được đưa ra trong siêu dữ liệu của nó và không được sử dụng bởi bất kỳ quy trình nào.

Đây IMHO là do sự xa cách dễ nhất để hiểu khó liên kết (và sự khác biệt của nó từ softlinks).


7
Hơn nữa, hệ thống gọi để xóa một tập tin là unlink().
mouviciel

1
Điều này không bao gồm tình huống nơi tệp được mở khi liên kết cuối cùng được chỉnh sửa unlink.
cjm

5
@OrangeDog, không chính xác, bởi vì các liên kết cứng không thể vượt qua các hệ thống tệp và /proclà một hệ thống tệp (ảo) riêng biệt.
cjm

2
/ Proc cũng phản ánh các cấu trúc dữ liệu bên trong của kernel (đó là cách để kernel Linux hiển thị một số dữ liệu nhất định ở định dạng được xác định hợp lý mà không cho phép tất cả và truy cập trực tiếp vào bộ nhớ kernel). Vì vậy, chính xác hơn để nói rằng kernel theo dõi thực tế rằng tệp đang mở và hiển thị thông tin đó thông qua các Procfs.
một CVn

1
Và đúng vậy, việc gọi unlink()để xóa một tập tin khiến tôi bối rối khi tôi bắt đầu chơi với lập trình C trên MS-DOS một thời gian trở lại vào nửa đầu những năm 1990. :)
một CVn

12

Kiểm tra dễ dàng hơn tôi nghĩ: Tôi đã tạo một tệp văn bản, sau đó liên kết cứng với nó. Xóa liên kết cứng sẽ không xóa tệp mà nó được liên kết cứng và tệp được liên kết đến vẫn giữ nguyên vị trí của nó.


1
Đây là sự thật, nhưng không phải là một bức tranh hoàn chỉnh
xenoterracide

3
Điều quan trọng là việc tạo tệp văn bản cũng thêm một liên kết cứng. Trong các hệ thống tệp * NIX, tất cả các tệp (inodes) phải được liên kết cứng ít nhất một lần vào cấu trúc thư mục.
Ngừng làm hại Monica

0

tất cả các tệp trong đĩa của bạn thực sự là con trỏ tới dữ liệu thực trên ổ đĩa của bạn. nhập mô tả hình ảnh ở đây

Khi bạn tạo một liên kết cứng cho tệp đó, tệp hardlink-ed sẽ được trỏ đến cùng dữ liệu mà tệp gốc đã trỏ đến.

nhập mô tả hình ảnh ở đây

như trong ví dụ này, a.txt đã trỏ đến dữ liệu (byte) của tệp trong ổ đĩa, khi b.txt liên kết cứng được tạo, nó sẽ trỏ đến những gì a.txt đang trỏ tới.

do đó loại bỏ một trong số chúng sẽ không ảnh hưởng đến cái khác mà chúng được tách ra khỏi nhau.

NHƯNG, khi bạn loại bỏ cả hai, hệ thống sẽ thấy rằng dữ liệu trên đĩa không có tệp nào trỏ đến nó, vì vậy hệ thống sẽ coi đó là không gian trống và sẽ ghi đè lên khi muốn.


2
Tôi nghĩ điều quan trọng là bạn làm rõ nó FILE "A.txt"giống hệt LINK "B.txt", đặc biệt là bạn đã gọi cái này FILEvà cái kia a LINK. Liên kết thực sự là mũi tên đen.
roaima

vâng, tôi nghĩ rằng sẽ không rõ ràng rằng b.txt là một tệp được liên kết cứng ...
ZOLDIK
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.