Thư mục liên kết cứng phá vỡ hệ thống tập tin theo nhiều cách
Chúng cho phép bạn tạo các vòng lặp
Một liên kết cứng đến một thư mục có thể liên kết với cha mẹ của chính nó, tạo ra một vòng lặp hệ thống tệp. Ví dụ, các lệnh này có thể tạo một vòng lặp với liên kết ngược l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
Một hệ thống tập tin với một vòng lặp thư mục có độ sâu vô hạn:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Tránh một vòng lặp vô hạn khi đi qua cấu trúc thư mục như vậy là hơi khó (mặc dù ví dụ POSIX yêu cầu find
phải tránh điều này).
Một hệ thống tệp với loại liên kết cứng này không còn là cây nữa, bởi vì theo định nghĩa, cây không được chứa vòng lặp.
Chúng phá vỡ tính không rõ ràng của các thư mục cha
Với một vòng lặp hệ thống tập tin, nhiều thư mục cha tồn tại:
cd /tmp/a/b
cd /tmp/a/b/l/b
Trong trường hợp đầu tiên, /tmp/a
là thư mục cha của /tmp/a/b
.
Trong trường hợp thứ hai, /tmp/a/b/l
là thư mục cha của /tmp/a/b/l/b
, giống như /tmp/a/b
.
Vì vậy, nó có hai thư mục cha.
Họ nhân tập tin
Các tập tin được xác định bởi các đường dẫn, sau khi giải quyết các liên kết tượng trưng. Vì thế
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
là những tập tin khác nhau.
Có vô số đường dẫn tiếp theo của tập tin. Họ là như nhau về số lượng inode của họ tất nhiên. Nhưng nếu bạn không rõ ràng mong đợi các vòng lặp, không có lý do để kiểm tra điều đó.
Một liên kết cứng thư mục cũng có thể trỏ đến một thư mục con hoặc một thư mục không phải là con cũng không phải là cha mẹ của bất kỳ độ sâu nào. Trong trường hợp này, một tệp là con của liên kết sẽ được sao chép thành hai tệp, được xác định bởi hai đường dẫn.
Ví dụ của bạn
$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar
Làm thế nào có thể liên kết mềm đến thư mục làm việc sau đó?
Một đường dẫn có thể chứa các liên kết mềm và thậm chí các vòng thư mục được liên kết mềm thường được sử dụng chỉ để xác định và mở tệp. Nó có thể được sử dụng như một con đường tuyến tính bình thường.
Nhưng có những tình huống khác, khi các đường dẫn được sử dụng để so sánh các tập tin. Trong trường hợp này, các liên kết tượng trưng trong đường dẫn có thể được giải quyết trước tiên, chuyển đổi nó thành mức tối thiểu và đại diện thường được thống nhất tạo ra một đường dẫn chính tắc :
Điều này là có thể, bởi vì tất cả các liên kết mềm có thể được mở rộng thành các đường dẫn mà không cần liên kết. Sau khi làm điều đó với tất cả các liên kết mềm trong một đường dẫn, đường dẫn còn lại là một phần của cây, nơi một đường dẫn luôn không rõ ràng.
Lệnh readlink
có thể giải quyết một đường dẫn đến đường dẫn chính tắc của nó:
$ readlink -f /some/symlinked/path
Liên kết mềm khác với những gì hệ thống tập tin sử dụng
Một liên kết mềm không thể gây ra tất cả các rắc rối vì nó khác với các liên kết bên trong hệ thống tập tin. Nó có thể được phân biệt với các liên kết cứng và được phân giải thành một đường dẫn không có liên kết tượng trưng nếu cần.
Theo một nghĩa nào đó, việc thêm các liên kết tượng trưng không làm thay đổi cấu trúc hệ thống tệp cơ bản - nó giữ nó, nhưng thêm cấu trúc giống như một lớp ứng dụng.
Từ man readlink
:
NAME
readlink - print resolved symbolic links or canonical
file names
SYNOPSIS
readlink [OPTION]... FILE...
DESCRIPTION
Print value of a symbolic link or canonical file name
-f, --canonicalize
canonicalize by following every symlink in
every component of the given name recursively;
all but the last component must exist
[ ... ]