Có bất kỳ hệ thống tập tin nào mà `ln -d` thành công không?


11

Từ trang hướng dẫn cho ln :

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

Có bất kỳ trình điều khiển hệ thống tập tin thực sự cho phép điều này, hoặc là tùy chọn duy nhất mount --bind <src> <dest>? Hoặc là loại hành vi này bị chặn bởi kernel trước khi nó đến trình điều khiển dành riêng cho hệ thống tập tin?

LƯU Ý: Tôi thực sự không có kế hoạch thực hiện điều này trên bất kỳ máy nào, chỉ tò mò.

Câu trả lời:


6

Lần đầu tiên một lưu ý: các lnlệnh không có các tùy chọn như -d, -F, --directory, đây là một GNUism không cầm tay.

Tính năng bạn đang tìm kiếm, được thực hiện bằng link(1)lệnh.

Quay lại câu hỏi ban đầu của bạn:

Trên một hệ thống UNIX điển hình, quyết định, liệu các liên kết cứng trên các thư mục có khả thi hay không, được đưa ra trong trình điều khiển hệ thống tập tin.

Trình điều khiển Solaris UFS hỗ trợ các liên kết cứng trên các thư mục, trình điều khiển ZFS thì không.

Lý do tại sao UFS trên Solaris hỗ trợ các liên kết cứng là vì AT & T quan tâm đến tính năng này - UFS từ BSD không hỗ trợ các thư mục được liên kết cứng.

Lý do tại sao ZFS không hỗ trợ các thư mục liên kết cứng là Jeff Bonwick không thích tính năng đó.

Về Linux, tôi đoán rằng Linux chặn các nỗ lực tạo liên kết cứng trên các thư mục ở các lớp nhân phía trên. Lý do cho giả định này là Linus Torvalds đã viết mã cho GIT đã hủy các thư mục khi git cloneđược gọi là root trên nền tảng hỗ trợ các thư mục được liên kết cứng.

Lưu ý rằng một hệ thống tập tin hỗ trợ để tạo các thư mục được liên kết cứng cũng cần hỗ trợ unlink(1)để loại bỏ các thư mục không trống dưới dạng root.

Vì vậy, nếu chúng tôi cho rằng Torvalds biết Linux hoạt động như thế nào và nếu Linux hỗ trợ các thư mục được liên kết cứng, Torvalds nên biết rằng việc gọi unlink(2)thư mục trong khi đang root, sẽ không trả về lỗi mà hủy thư mục đó. Nói cách khác, không chắc là Linux cho phép trình điều khiển hệ thống tệp thực hiện các thư mục được liên kết cứng.


3

Đề cập đến câu hỏi của OP mount --bind. Kiểm tra nhanh cho thấy rằng nó không sửa đổi số lượng liên kết cho thư mục được gắn kết. Hardlinking luôn sửa đổi số lượng liên kết mà bạn có thể thấy bằng cách sử dụng ls -ld.

Thông thường (hầu hết các hệ thống giống Unix), số lượng liên kết cứng đến một thư mục sẽ là số lượng thư mục được kết nối với tên đó, ví dụ:

  • ".." (thư mục mẹ)
  • "." (chính thư mục)
  • thư mục con

Nếu bạn đọc (thường) thông tin mới hơn thông tin trang, bạn có thể khám phá như những người khác đã làm:

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

mặc dù hiện tại nó được diễn đạt

Hầu hết các hệ thống đều cấm tạo một liên kết cứng đến một thư mục; trên những nơi được phép, chỉ siêu người dùng mới có thể làm như vậy (và thận trọng, vì việc tạo chu trình sẽ gây ra sự cố cho nhiều tiện ích khác). Liên kết cứng không thể vượt qua ranh giới hệ thống tập tin. (Tuy nhiên, những hạn chế này không bắt buộc bởi POSIX.)

Tạo (và xóa) liên kết cứng vào thư mục là một tính năng bị hạn chế để bảo vệ chống mất tệp nếu thư mục không được liên kết. Do các hoạt động liên kết / hủy liên kết tại giao diện hệ điều hành C là đối xứng , nên việc liên kết đến các thư mục thường chỉ được thực hiện trong các cuộc gọi mkdir / rmdir.

Hãy nhớ rằng phần lớn lõi GNU đã được viết (và ghi lại) 20-30 năm trước, khi một số bảo tàng thực sự vẫn còn được sử dụng. Như đã nêu trong Về liên kết cứng , ban đầu có không có cuộc gọi mkdir / rmdir; thư mục đã được tạo (như một hoạt động đặc quyền) bằng cách sử dụng các liên kết cứng. Tất cả điều đó biến mất khi các cuộc gọi hệ thống được thêm vào để giải quyết các vấn đề được đề cập. Nhưng tài liệu tiếp tục đề cập đến các hệ thống này qua bộ nhớ của những người bảo trì của họ. Tùy chọn đã được đặt câu hỏi là ở người tiền nhiệm fileutils(được kết hợp với textutilsshellutilsvào giữa những năm 1990 để hình thành coreutils). Một vài mục từ thay đổi có thể giúp làm rõ nguồn gốc của tính năng:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

Vì vậy, bạn có thể thấy rằng một trong những cổ vật mà tính năng này được áp dụng là SunOS. Trang hướng dẫn tương ứng cho biết điều này:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

Như đã lưu ý trong tài liệu, tính năng này (và tùy chọn tương ứng không có trong POSIX (và xem phần Cơ sở lý giải giải thích tại sao). Thay vào đó, tính năng này đã được chuyển sang một lệnh mới (cũng được cung cấp bởi GNU coreutils) link. Bản thân lệnh là mơ hồ, bạn phải đọc mô tả của lệnh gọi hàm để sử dụng bất kỳ tiêu chuẩn nào. Tuy nhiên, tiêu chuẩn không làm rõ các điều kiện trong đó lệnh sẽ hoạt động, ngoài việc chuyển tiếp từ chối trách nhiệm về các đặc quyền bắt buộc. Vì thế, bạn phải tìm đến các tính năng phụ thuộc hệ thống ngoài tiêu chuẩn:

Liên kết đến một thư mục bị hạn chế đối với siêu người dùng trong hầu hết các triển khai lịch sử vì khả năng này có thể tạo ra các vòng lặp trong hệ thống phân cấp tệp hoặc làm hỏng hệ thống tệp. Tập POSIX.1-2008 này tiếp tục triết lý đó bằng cách cấm link()unlink()thực hiện điều này. Các chức năng khác có thể làm điều đó nếu người triển khai thiết kế một phần mở rộng như vậy.

những hệ thống sử dụng liên kết cứng đến các thư mục vượt quá số lượng bình thường (2 thư mục con cộng).

OSX sử dụng nhiều liên kết cứng đến thư mục cho các tệp thông thường . Nó không hỗ trợ điều này bằng cách sử dụng ln(xem trang hướng dẫn ). Theo How Time Machine hoạt động Magic của nó , nó thực hiện điều này để cung cấp các phiên bản được sử dụng cho phương tiện sao lưu Time Machine.

Đọc thêm:


3
Điều này dường như không trả lời câu hỏi nào cả.
Michael Homer
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.