Tôi đang cố gắng để hiểu sự khác biệt giữa việc sử dụng ln -s
và mount --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?
Tôi đang cố gắng để hiểu sự khác biệt giữa việc sử dụng ln -s
và mount --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?
Câu trả lời:
Họ sẽ hành xử khác nhau trong ít nhất hai trường hợp:
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.
Vâng, ln -s
tạo ra một liên kết tượng trưng, trong khi mount --bind
tạ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/link
sẽ 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
, ls
chươ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/target
thay 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/link
nế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/mount
bâ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/target
sẽ làm cho nó hiển thị trong /var/mount
là 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
và /var/target
là 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
.
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.
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ỉ.
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).
rm -r
amount --bind
. Với aln
, 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ạyrm -r
trê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 ...