Đây chỉ là một ý tưởng tồi, vì không có cách nào để nói sự khác biệt giữa một liên kết cứng và một tên gốc.
Việc cho phép các liên kết cứng đến các thư mục sẽ phá vỡ cấu trúc đồ thị theo chu kỳ có hướng của hệ thống tập tin, có thể tạo ra các vòng lặp thư mục và các thư mục thư mục lơ lửng, điều này sẽ gây ra fsck
và bất kỳ lỗi nào của tập tin cây đi bộ khác.
Trước tiên, để hiểu điều này, hãy nói về inodes. Dữ liệu trong hệ thống tập tin được giữ trong các khối trên đĩa và các khối đó được thu thập với nhau bằng một nút. Bạn có thể nghĩ về inode như tập tin. Inodes thiếu tên tập tin, mặc dù. Đó là nơi liên kết đến.
Một liên kết chỉ là một con trỏ đến một nút. Một thư mục là một nút giữ các liên kết. Mỗi tên tệp trong một thư mục chỉ là một liên kết đến một nút. Mở một tệp trong Unix cũng tạo ra một liên kết, nhưng đó là một loại liên kết khác (nó không phải là một liên kết có tên).
Một liên kết cứng chỉ là một mục nhập thư mục bổ sung trỏ đến nút đó. Khi bạn ls -l
, số sau các quyền là số liên kết được đặt tên. Hầu hết các tập tin thông thường sẽ có một liên kết. Tạo một liên kết cứng mới đến một tệp sẽ làm cho cả hai tên tệp trỏ đến cùng một nút. Ghi chú:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
Bây giờ, bạn có thể thấy rõ rằng không có thứ gọi là liên kết cứng. Một liên kết cứng giống như một tên thông thường. Trong ví dụ trên, test
hoặc test2
, đó là tệp gốc và liên kết cứng nào? Cuối cùng, bạn không thể thực sự nói (thậm chí bằng dấu thời gian) bởi vì cả hai tên đều trỏ đến cùng một nội dung, cùng một nút:
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
Các -i
lá cờ để ls
cho bạn thấy số inode vào đầu dòng. Lưu ý làm thế nào test
và test2
có cùng số inode, nhưng test3
có một số khác.
Bây giờ, nếu bạn được phép làm điều này cho các thư mục, hai thư mục khác nhau ở các điểm khác nhau trong hệ thống tệp có thể chỉ ra cùng một điều. Trong thực tế, một subir có thể quay trở lại ông bà của nó, tạo ra một vòng lặp.
Tại sao vòng lặp này là một mối quan tâm? Bởi vì khi bạn đang di chuyển ngang, không có cách nào để phát hiện bạn đang lặp (mà không theo dõi các số inode khi bạn di chuyển ngang). Hãy tưởng tượng bạn đang viết du
lệnh, cần phải lặp lại thông qua các thư mục con để tìm hiểu về việc sử dụng đĩa. Làm thế nào để du
biết khi nào nó đạt một vòng lặp? Đó là lỗi dễ dàng và rất nhiều sổ sách kế toán du
sẽ phải làm, chỉ để thực hiện nhiệm vụ đơn giản này.
Symlinks là một con thú hoàn toàn khác nhau, trong đó chúng là một loại "tệp" đặc biệt mà nhiều API hệ thống tệp tệp có xu hướng tự động theo. Lưu ý, một liên kết tượng trưng có thể trỏ đến một đích không tồn tại, vì chúng trỏ theo tên và không trực tiếp đến một nút. Khái niệm đó không có ý nghĩa với các liên kết cứng, bởi vì sự tồn tại đơn thuần của "liên kết cứng" có nghĩa là tệp tồn tại.
Vậy tại sao có thể du
đối phó với các liên kết tượng trưng dễ dàng và không phải là liên kết cứng? Chúng tôi đã có thể thấy ở trên rằng các liên kết cứng không thể phân biệt với các mục thư mục bình thường. Symlinks, tuy nhiên, là đặc biệt, có thể phát hiện và bỏ qua!
du
thông báo rằng symlink là một symlink và bỏ qua nó hoàn toàn!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
chỉ đến đâu? Đặc biệt là sau khi gỡ bỏ liên kết cứng đến thư mục này, trong thư mục được chỉ bởi..
? Nó cần phải chỉ ra một nơi nào đó.