Tại sao các liên kết cứng không được phép cho các thư mục?


129

Tôi đang sử dụng Ubuntu 12.04. Khi tôi cố gắng tạo một liên kết cứng cho bất kỳ thư mục nào, nó đều thất bại. Tôi có thể tạo liên kết cứng cho các tệp bên trong ranh giới hệ thống tệp. Tôi biết lý do tại sao chúng ta không thể tạo liên kết cứng cho các tệp ngoài hệ thống tệp.

Tôi đã thử các lệnh này:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Tôi chỉ muốn biết lý do đằng sau này. Có giống nhau đối với tất cả các bản phân phối GNU / Linux và hương vị Unix (BSD, Solaris, HP-UX, IBM AIX) hoặc chỉ trong Ubuntu hoặc Linux không?



2
Hãy thử ln -F <src> <dst>và nó có thể làm việc. Chắc chắn, nó được sử dụng để làm việc cho siêu người dùng trong các phiên bản cũ hơn của Unix. Có ai nhớ đó là UCB hay System V không? Vâng, những điều xấu có thể xảy ra, nhưng thường thì không. Khi tôi nhớ lại, rmdirbiết không tiếp tục xóa qua một liên kết cứng. Tuy nhiên, người dùng có thể bị nhầm lẫn và xóa những thứ bị lỗi.
Steve Pitchers

@StevePitchers Làm thế nào có thể rmdirxử lý các liên kết cứng theo cách đặc biệt? Một liên kết cứng chỉ là một liên kết bình thường - nhưng là một liên kết bổ sung. Thậm chí không dễ để tìm hiểu xem một liên kết bổ sung bất thường có tồn tại mà không có bản ghi thêm hay không.
Volker Siegel

1
Mỗi nút lưu trữ số lượng liên kết cứng trỏ đến nó: nội dung chỉ được phát hành khi không còn liên kết nào. Vì vậy, rmdircó thể cho biết liệu thư mục có liên kết từ những nơi khác. Loại bỏ đệ quy rm -r, phải được mã hóa cẩn thận, để chắc chắn rằng nó sẽ hành động chính xác ngay cả khi có các lỗi như "quyền bị từ chối". BTW, UCB = BSD, doh!
Steve Pitchers

2
Tôi đã thực hiện ln -Ftrên các thư mục và có nó làm việc. Nhưng bạn không dám xóa thư mục sau đó vì sợ làm hỏng hệ thống tệp.
Edward Falk

Câu trả lời:


159

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 findphả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/alà thư mục cha của /tmp/a/b.
Trong trường hợp thứ hai, /tmp/a/b/llà 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 readlinkcó 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
        [  ...  ]

1
Tại sao một liên kết mềm không thể làm tất cả điều này?
Tanay

1
@Tanay Đúng, nó có thể giúp mở rộng để so sánh nó với các trường hợp tương tự với các liên kết mềm. Tôi sẽ thử.
Volker Siegel

Chính xác thì làm thế nào điều này chỉ liên quan đến các thư mục? Theo cách hiểu của tôi, những vấn đề này cũng là một vấn đề đối với các tập tin liên kết cứng. Hơn nữa, tôi thấy liên kết cứng là một cách dễ dàng để thay đổi sự cho phép của một thư mục nhất định để cho phép những người khác vào bên trong mà không phải cho phép họ trong chuỗi cha mẹ. Âm thanh rất hữu ích nếu bạn không có khả năng thêm / sửa đổi nhóm ...
inetknght

Câu trả lời tuyệt vời, nhưng sau đó ... Apple đã giải quyết những vấn đề này cho Time Machine như thế nào?
Damien

Nghe rất thú vị! Nhưng tôi không biết gì về vấn đề này - bạn có thể cho tôi một gợi ý không?
Volker Siegel

77

"Nói chung, bạn không nên sử dụng các liên kết cứng" là quá rộng. Bạn cần hiểu sự khác biệt giữa các liên kết cứng và liên kết tượng trưng, ​​và sử dụng từng liên kết phù hợp. Mỗi loại đi kèm với các ưu điểm và nhược điểm riêng:

Liên kết có thể:

  • Trỏ tới thư mục
  • Chỉ vào các đối tượng không tồn tại
  • Trỏ tới các tệp và thư mục bên ngoài cùng hệ thống tệp

Liên kết cứng có thể:

  • Giữ các tệp mà họ tham chiếu khỏi bị xóa

Liên kết cứng đặc biệt hữu ích trong việc thực hiện các ứng dụng "sao chép trên ghi". Chúng cho phép bạn giữ một bản sao dự phòng của cấu trúc thư mục, trong khi chỉ sử dụng không gian cho các tệp thay đổi giữa hai phiên bản.

Lệnh cp -alnày đặc biệt hữu ích trong vấn đề này. Nó tạo một bản sao hoàn chỉnh của cấu trúc thư mục, trong đó tất cả các tệp được thể hiện bằng các liên kết cứng đến các tệp gốc. Sau đó, bạn có thể tiến hành cập nhật các tệp trong cấu trúc và chỉ các tệp mà bạn cập nhật sẽ chiếm thêm dung lượng. Điều này đặc biệt hữu ích khi duy trì sao lưu đa thế hệ.


41
liên quan đến đoạn cuối cùng, nếu bạn chỉnh sửa "sao chép" tập tin hardlinked, file gốc cũng được thay đổi - xem unix.stackexchange.com/questions/70531/...
Marcin

32
Mô tả về các liên kết cứng là khá sai lệch. Về cơ bản, các liên kết cứng "giữ cho tệp mà chúng tham chiếu không bị xóa", nhưng đó chỉ là tác dụng phụ của các liên kết cứng. Điều chắc chắn là KHÔNG đúng khi bạn có thể tạo các liên kết cứng trong một thư mục, thay đổi tệp "gốc" và sau đó mong đợi các liên kết cứng bằng cách nào đó trỏ đến nội dung cũ. Trong thực tế, sự thật hướng dẫn của các liên kết cứng là thực tế rằng nó hoàn toàn không phải là một liên kết, ít nhất là không hơn "tập tin" ban đầu, mà chỉ là một tên chỉ vào một tập tin. Một liên kết cứng chỉ đơn giản là một tên khác trỏ đến cùng một tệp.
matty

7
Ý tưởng sao lưu là tốt và tôi thực sự sử dụng nó rất nhiều, nhưng tôi nghĩ người dùng nên được cảnh báo rằng việc thay đổi một tệp cũng sẽ thay đổi bản sao lưu.
Đánh dấu

3
Heck, một symlink không cần phải chỉ ra bất cứ điều gì cả. ln -s "Don't use this directory" READMElà hợp pháp. Trong thực tế, nếu bạn nghĩ về nó, một thư mục có thể được sử dụng như một cơ sở dữ liệu quan hệ và hoàn toàn không chứa bất kỳ tệp thực tế nào.
Edward Falk

5
-1 Điều này không trả lời câu hỏi và một số thông tin hoàn toàn sai.
wjandrea

43

FYI, bạn có thể đạt được điều tương tự như các liên kết cứng cho các thư mục bằng cách sử dụng mount:

mount -t bind /var/www /home/user/workspace/www

Điều này rất nguy hiểm vì hầu hết các công cụ và chương trình sẽ không nhận thức được ràng buộc . Tôi đã từng làm một cái gì đó như trong ví dụ trên và sau đó tiến hành rm -rf /home/user. May mắn thay, không có gì liên quan /var/www.


6
Tôi đã sử dụng mount --bind <src> <dest>. Sử dụng cẩn thận không lau src;)
kachar

1
Tôi nhận được:mount: unknown filesystem type 'bind'
Wizek

4
trên Busybox, nómount -o bind src dest
Mat M

@MatM tương tự với Debian
hanshenrik

2
Nếu bạn chỉ cần gắn kết để đọc, bạn có thể đặt quyền trên điểm gắn kết và tránh sự rm -rfcố. superuser.com/questions/320415/ từ
zanerock

19

Lý do thư mục liên kết cứng không được phép là một chút kỹ thuật. Về cơ bản, chúng phá vỡ cấu trúc hệ thống tập tin . Nói chung bạn không nên sử dụng các liên kết cứng. Liên kết tượng trưng cho phép hầu hết các chức năng tương tự mà không gây ra vấn đề (ví dụ ln -s target link).


17
Liên kết cứng có trường hợp sử dụng tốt. Nói chung bạn không nên sử dụng chúng là một chút quá rộng.
Sander Steffann

4
+2 để cung cấp liên kết thực sự trả lời câu hỏi của OP (và của tôi), -1 để phát ra ý kiến ​​("Nói chung, bạn không nên sử dụng liên kết cứng" - nếu có liên kết để hỗ trợ thì mọi chuyện sẽ ổn). Điều đó là tốt, vì dù sao tôi cũng không thể cho +2. ; D
msb

3
liên kết "họ phá vỡ cấu trúc hệ thống tệp" không hoạt động.
Charlie Parker

5
Cố gắng tóm tắt nội dung của liên kết trong câu trả lời và giữ liên kết làm tài liệu tham khảo. Đây là một thực hành tốt Stack để tránh thối liên kết, cảm ơn.
Oxwivi

3
làm tốt lắm @CharlieParker; bình luận mỉa mai tốt nhất ngoài ý muốn (?) của mọi thời đại :)
Eliran Malka
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.