Có bất kỳ nhược điểm nào từ việc sử dụng mount --bind thay thế cho các liên kết tượng trưng không?


55

Symlink có những hạn chế trong cách các chức năng như ls, mvcpcó thể hoạt động trên chúng vì không giống như vỏ khởi xướng lệnh như cd, các chức năng này không có thông tin về cách sử dụng truy cập các thư mục liên quan đến các con đường hợp lý (xem liên quan đến bài ). Có vẻ như sử dụng mount --bindtùy chọn thay vào đó có thể giải quyết vấn đề này, cung cấp chức năng và khả năng tương thích với samba và các máy chủ tệp khác vì thư mục được gắn sau đó sẽ có hai đường dẫn vật lý độc lập, thay vì liên kết.

Tôi muốn thay thế tất cả các liên kết tượng trưng của mình bằng các tham chiếu bằng mount --bindtùy chọn nhưng điều này có nghĩa là gắn hơn 150 điểm trong fstab. Có bất kỳ vấn đề hiệu suất nào có khả năng phát sinh từ điều này hoặc bất kỳ nhược điểm nào khác mà tôi nên xem xét?


Bạn đã xem xét sử dụng các liên kết cứng ?
ire_and_curses

1
@ire_and_curses Hầu hết các hệ thống giống Unix đều cấm các liên kết cứng, vì lý do chính đáng (và vì lý do tương tự, bạn hầu như không bao giờ nên sử dụng chúng ngay cả trên các hệ thống mà bạn có thể).
Eliah Kagan

3
@ire_and_curses: Để làm rõ tuyên bố của Eliah, bạn không thể tạo một liên kết cứng đến một thư mục (mặc dù theo cách nào đó, HFS + không hỗ trợ nó). Và việc tạo một cây đệ quy của các liên kết cứng không giữ đồng bộ cả hai đường dẫn thư mục.
bahamat

Câu trả lời:


62

Với mount --bind, một cây thư mục tồn tại ở hai (hoặc nhiều) vị trí trong hệ thống phân cấp thư mục. Điều này có thể gây ra một số vấn đề. Sao lưu và các bản sao tập tin khác sẽ chọn tất cả các bản sao. Thật khó để xác định rằng bạn muốn sao chép một hệ thống tệp: cuối cùng bạn sẽ sao chép các tệp được gắn kết hai lần. Tìm kiếm với find, grep -r, locatevv, sẽ đi qua tất cả các bản sao, và vân vân.

Bạn sẽ không nhận được bất kỳ chức năng tăng khả năng và khả năng tương thích nào của Wap với các liên kết gắn kết. Chúng trông giống như bất kỳ thư mục khác, mà hầu hết thời gian không phải là hành vi mong muốn. Ví dụ, Samba hiển thị các liên kết tượng trưng như các thư mục theo mặc định; không có gì để đạt được bằng cách sử dụng một liên kết gắn kết. Mặt khác, các liên kết gắn kết có thể hữu ích để hiển thị phân cấp thư mục trên NFS.

Bạn sẽ không có bất kỳ vấn đề hiệu suất nào với các liên kết gắn kết. Những gì bạn sẽ có là đau đầu quản trị. Các gắn kết ràng buộc có công dụng của chúng, chẳng hạn như làm cho cây thư mục có thể truy cập được từ một chroot hoặc để lộ một thư mục bị ẩn bởi một điểm gắn kết (đây thường là một cách sử dụng tạm thời trong khi cấu trúc thư mục đang được sửa sang lại). Đừng sử dụng chúng nếu bạn không có nhu cầu.

Chỉ root mới có thể thao tác gắn kết gắn kết. Chúng không thể được di chuyển bằng các phương tiện thông thường; họ khóa vị trí của họ và các thư mục tổ tiên.

Nói chung, nếu bạn chuyển một liên kết tượng trưng cho một lệnh, lệnh sẽ tự hoạt động trên chính liên kết đó nếu nó hoạt động trên các tệp và trên mục tiêu của liên kết nếu nó hoạt động trên nội dung tệp. Điều này đi cho các thư mục quá. Đây thường là điều đúng. Một số lệnh có các tùy chọn để điều trị liên kết tượng trưng khác nhau, ví dụ ls -L, cp -d, rsync -l. Dù bạn đang cố gắng làm gì, nhiều khả năng các liên kết tượng trưng là công cụ phù hợp, hơn là các liên kết gắn kết là công cụ phù hợp.


Cảm ơn. Tôi đoán tôi đã không xem xét tác động lên các bản sao lưu, bản sao và tìm kiếm tệp. Tôi đã có thể khiến Samba theo dõi các liên kết tượng trưng bằng cách thêm 'follow symlinks = yes' trong smb.conf nhưng điều này làm mất tính bảo mật ở chỗ bất kỳ người dùng samba nào cũng có thể thực hiện nói, 'ln -s / etc' trong một thư mục có thể ghi và đạt được truy cập vào tập tin hệ thống. Tôi đang cố gắng tìm cách xoay quanh vấn đề này. Xin vui lòng cho tôi biết nếu bạn biết về một.
mrtrujiyo

2
@mrtrujiyo Đối với yêu cầu đó, tôi nghĩ sẽ hợp lý khi chạy máy chủ samba trong một chroot và gắn kết các thư mục bạn muốn xuất bên trong chroot đó. Đảm bảo loại trừ gốc của chroot khỏi các bản sao lưu, v.v. (với tổ chức này, bạn chỉ cần loại trừ một thư mục toplevel, vì vậy nó không phải là vấn đề đau đầu về bảo trì).
Gilles 'SO- ngừng trở nên xấu xa'

14

Ngoài những gì @Gilles đã viết trước đó, đáng chú ý là một số tiện ích có thể coi thư mục gắn kết là một hệ thống tệp riêng biệt. Điều này có thể có ý nghĩa về hiệu năng hoặc chức năng nếu chương trình không còn có thể giả sử rằng cùng một số inode đề cập đến cùng một tệp (mà nó không, nếu chúng nằm trên các hệ thống tệp khác nhau), việc di chuyển không thể được tối ưu hóa như liên kết tại mục tiêu-sau đó bỏ liên kết nguồn, v.v.


Cảm ơn. Tôi đã tự hỏi làm thế nào các tiện ích đơn giản như df và du sẽ xử lý các tính toán kích thước thư mục trên các hệ thống tập tin với các liên kết gắn kết.
mrtrujiyo

1
Ít nhất GNU dftrên hệ thống của tôi thậm chí không xem xét các thư mục gắn kết theo mặc định, nhưng nếu được hỏi cụ thể, nó được coi là một mount khác của cùng một hệ thống tệp. (Mà, nếu bạn hỏi tôi, hành vi được mong đợi cho một công cụ với mục đích của df.)
CVn

6

Bạn cũng nên sử dụng các liên kết gắn kết thay vì liên kết tượng trưng khi bạn đang dựa vào một hỗ trợ có thể không phải lúc nào cũng có (ví dụ như một đĩa bên ngoài) và bạn muốn chắc chắn rằng cấu trúc thư mục gốc được đặt ngay cả khi hỗ trợ thất bại hoặc bị loại bỏ.

Ví dụ: nếu tôi muốn giữ / var / tmp trong thẻ sd, tôi sẽ sử dụng liên kết gắn kết, vì một số chương trình sẽ mong muốn / var / tmp là một thư mục hợp lệ ngay cả khi thẻ bị xóa.


1

Tôi đã thử gắn kết liên kết để khắc phục sự cố khi cài đặt một số gói với pacman(archlinux, thông tin thêm về vấn đề này ở đây ) trên một hệ thống trong đó /var(cũng như /home/usr/local) là các liên kết tượng trưng (trên các hệ thống tệp: SSD sang SATA).

Ban đầu nó trông rất tuyệt, nhưng, như Gilles đã chỉ ra, locateluôn đưa ra nhiều kết quả cho một tệp, mặc dù có PRUNE_BIND_MOUNTS = "yes"dòng trong /etc/updatedb.conf.

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

Đi sâu hơn một chút, tôi thấy rằng các liên kết gắn kết phức tạp hơn có thể được cắt tỉa chính xác:

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
Rebuilding bind_mount_paths:
Matching bind_mount_paths:
Skipping `/SHARED/LOCALS/Manjaro/common': bind mount
Skipping `/usr/local/common': bind mount

$ locate \*/mmedia
/SHARED/LOCALS/common/mmedia

Nếu không có tùy chọn PRUNE_BIND_MOUNT, tôi sẽ có 3 kết quả:

$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 

Một vấn đề khác với liên kết gắn kết:

Tất nhiên, người ta có thể tự thêm các liên kết gắn kết (mounpoint hoặc đích) PRUNEPATHSvào /etc/updatedb.conf.

Ngoài ra, mountpointvà các statlệnh hoặc chức năng khác nhau có thể được sử dụng trong các công cụ để cải thiện truyền tải hệ thống tệp như đề xuất ở đây

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.