Sự khác biệt giữa ln -s và mount --bind là gì?


36

Tôi đang cố gắng để hiểu sự khác biệt giữa việc sử dụng ln -smount --bind. Trong kịch bản cơ bản, tôi có thể sử dụng cả hai để truy cập một thư mục từ một nơi khác. Trong kịch bản nào hai người đó sẽ cư xử khác nhau?


7
Tôi nên cảnh báo chống lại rm -ra mount --bind. Với a ln, nó loại bỏ liên kết, trong khi đối với a --bind, nó có tác dụng tương tự như chạy rm -rtrên mục tiêu. Không tốt, như tôi đã tìm thấy ngay trước khi xây dựng lại một trong các máy chủ của mình ...
Mark K Cowan

@MarkKCowan điều đó đúng trừ khi bạn tạo một liên kết cứng .
JohnnyQ

@JohnnyQ Không thể thư mục liên kết cứng
Mark K Cowan

Câu trả lời:


33

Họ sẽ hành xử khác nhau trong ít nhất hai trường hợp:

  • Trong một chroot , nếu mục tiêu liên kết nằm ngoài chroot, liên kết sẽ bị chết. Một liên kết gắn kết vẫn sẽ có thể truy cập.
  • Một số chương trình có thể phân biệt giữa các liên kết tượng trưng và các thư mục hoặc tập tin thực tế. Rất ít (nếu có) có thể phân biệt giữa một thư mục hoặc tệp và tệp được gắn trên đó. Điều này cũng mở rộng đến các liên kết tượng trưng đến một cái gì đó ( A) có cái gì khác ( B) gắn trên chúng. Liên kết sẽ hiển thị nội dung của mount target ( B) thay vì gốc ( A).

Ngoài ra, bạn có thể liên kết gắn một thư mục hoặc tệp trên một thư mục hoặc tệp hiện có, che giấu nội dung gốc (hiển thị nội dung gốc không thể truy cập trừ khi bản gốc được gắn kết ở nơi khác). Một liên kết tượng trưng đòi hỏi bản gốc phải được di chuyển hoặc xóa.


16

Vâng, ln -stạo ra một liên kết tượng trưng, ​​trong khi mount --bindtạo ra một gắn kết.

Một liên kết tượng trưng là một loại tập tin đặc biệt. Nếu bạn làm như vậy ln -s /var/target /var/link, thì đó /var/linksẽ là một tệp chứa đường dẫn " /var/target" trong đó. Sự khác biệt duy nhất giữa liên kết tượng trưng và tệp thông thường là khi chương trình cố gắng thực hiện thao tác trên liên kết tượng trưng, ​​thao tác thường được thực hiện trên mục tiêu thay vì tệp. Vì vậy, bây giờ nếu bạn làm như vậy ls /var/link, lschương trình sẽ cố gắng để có được một danh sách thư mục cho /var/link, nhưng thực sự sẽ có một danh sách thư mục /var/targetthay thế.

Liên kết tượng trưng vẫn chỉ là tập tin, mặc dù. Họ có thể được đổi tên và xóa và tất cả những gì jazz. Lưu ý rằng bạn không thể tạo một liên kết tượng trưng (hoặc một tệp thông thường, cho vấn đề đó) được gọi /var/linknếu đã có một tệp được gọi /var/link; bạn cần phải thoát khỏi nó trước.

Một mount không phải là một tập tin; đó là một bản ghi mà kernel giữ trong bộ nhớ. Nếu bạn làm như vậy mount --bind /var/target /var/mount, kernel sẽ ghi lại thực tế /var/mountbây giờ là một tên mới cho /var/target. (Tôi không biết các chi tiết; đặc biệt, tôi không biết nếu gắn cái gì đó trong một thư mục con của /var/targetsẽ làm cho nó hiển thị trong /var/mountlà tốt, hay tại sao hoặc tại sao không chỉnh sửa câu trả lời này sẽ được đánh giá..) Vì vậy bây giờ nếu bạn làm như vậy ls /var/mount, điều tương tự sẽ xảy ra như thể bạn đã làm ls /var/target, bởi vì /var/mount/var/targetlà cùng một thư mục.

Mounts không tập tin. Tôi không biết điều gì sẽ xảy ra nếu bạn cố đổi tên hoặc xóa /var/mount. Lưu ý rằng bạn không thể gắn kết bất cứ thứ gì /var/mount trừ khi đã có thư mục tại /var/mount.


1
Tôi chưa sử dụng mount --bind, nhưng tôi nghi ngờ nó có thể sao chép hành vi của một symlink như thế nào ln -s ../../myfile .. Nếu bạn di chuyển nó sang thư mục khác, nó sẽ trỏ đến một nơi khác vì đó là một liên kết tương đối. Điều này có thể hữu ích nếu bạn cần sao lưu một cây con và vẫn có các liên kết hoạt động trong bản sao lưu.
Joe

10

Ngoài ra, ln -s sẽ tồn tại khi khởi động lại; trong khi mount --bind thì không, trừ khi bạn chỉnh sửa / etc / fstab để làm cho nó bền bỉ.


2

Ngoài các câu trả lời khác. Hệ thống không cho phép liên kết cứng đến thư mục:

# ln mydir mpoint
ln: `mydir': hard link not allowed for directory

Gắn kết cho phép bạn tạo liên kết cứng giống như hai hoặc nhiều tên cho cùng một nút :

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(Người ta có thể tìm thấy nó giúp sao lưu ảnh chụp nhanh với phiên bản rsync cũ.)

Ngoài ra, lưu ý rằng việc gắn kết này không hoàn thành:

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

Vì vậy, mount vẫn đọc và ghi ngay cả khi tôi yêu cầu tùy chọn ro (chỉ đọc).

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.