Dowiązania symboliczne mają ograniczenia w sposobie, w jaki funkcje takie jak ls
, mv
i cp
mogą na nich działać, ponieważ w przeciwieństwie do poleceń inicjowanych przez powłokę cd
, takie funkcje nie mają informacji o tym, w jaki sposób użytkownik uzyskał dostęp do katalogu w odniesieniu do ścieżki logicznej (patrz powiązany post ). Wygląda na to, że użycie mount --bind
opcji zamiast tego pozwala obejść ten problem, oferując zwiększoną funkcjonalność i kompatybilność z sambą i innymi serwerami plików, ponieważ wtedy podłączony katalog będzie miał dwie niezależne ścieżki fizyczne zamiast łącza.
Chciałbym zastąpić wszystkie moje dowiązania symboliczne referencjami, używając tej mount --bind
opcji, ale oznaczałoby to zamontowanie ponad 150 punktów w fstab. Czy są jakieś problemy z wydajnością, które mogą wynikać z tej lub innych wad, które powinienem wziąć pod uwagę?
Odpowiedzi:
Z
mount --bind
, drzewo katalogów istnieje w dwóch (lub więcej) miejscach w hierarchii katalogów. Może to powodować szereg problemów. Kopie zapasowe i inne kopie plików wybiorą wszystkie kopie. Trudno jest określić, że chcesz skopiować system plików: ostatecznie skończysz kopiowanie plików podłączonych do wiązania. Wyszukiwania zfind
,grep -r
,locate
, itd., Będą przechodzić wszystkie kopie, i tak dalej.Nie uzyskasz żadnej „zwiększonej funkcjonalności i kompatybilności” z mocowaniami powiązań. Wyglądają jak każdy inny katalog, który przez większość czasu nie jest pożądanym zachowaniem. Na przykład Samba domyślnie udostępnia łącza symboliczne jako katalogi; nie ma nic do zyskania dzięki zastosowaniu oprawki do wiązania. Z drugiej strony montowanie powiązań może być przydatne do ujawnienia hierarchii katalogów w systemie plików NFS.
Nie będziesz mieć żadnych problemów z wydajnością z mocowaniami łączenia. Będziesz miał bóle głowy związane z administracją. Montowania Bind mają swoje zastosowania, takie jak udostępnianie drzewa katalogów z chroota lub ujawnianie katalogu ukrytego przez punkt montowania (zwykle jest to przejściowe zastosowanie podczas przebudowy struktury katalogów). Nie używaj ich, jeśli nie potrzebujesz.
Tylko root może manipulować oprawami bindowania. Nie można ich przenosić zwykłymi środkami; blokują swoją lokalizację i katalogi przodków.
Ogólnie rzecz biorąc, jeśli przekazujesz dowiązanie symboliczne do polecenia, polecenie działa na samo łącze, jeśli działa na plikach, i na cel łącza, jeśli działa na zawartości pliku. Dotyczy to również katalogów. Zazwyczaj jest to właściwa rzecz. Niektóre polecenia mają możliwości leczenia dowiązania symboliczne w inny sposób, na przykład
ls -L
,cp -d
,rsync -l
. Cokolwiek próbujesz zrobić, jest znacznie bardziej prawdopodobne, że dowiązania symboliczne są właściwym narzędziem, niż łączenie oprawek jest właściwym narzędziem.źródło
Oprócz tego, co wcześniej napisał @Gilles , warto zauważyć, że niektóre narzędzia mogą uznać katalog podłączony za odrębny system plików. Może to mieć wpływ na wydajność lub funkcjonalność, jeśli program nie może dłużej zakładać, że ten sam numer i-węzła odnosi się do tego samego pliku (czego nie ma, jeśli są w różnych systemach plików), nie można zoptymalizować ruchu jako link-at- źródło-następnie-odłącz-źródło itp.
źródło
df
w moim systemie domyślnie nawet nie bierze pod uwagę katalogów podłączonych, ale jeśli zostaniesz o to poproszony, jest traktowany jako kolejne podłączenie tego samego systemu plików. (Które, jeśli mnie zapytacie, jest oczekiwanym zachowaniem narzędzia do celów df.)Powinieneś także chcieć używać montowań powiązań zamiast dowiązań symbolicznych, gdy polegasz na wsparciu, które nie zawsze może być na miejscu (na przykład dysk zewnętrzny) i chcesz mieć pewność, że oryginalna struktura katalogów istnieje, nawet jeśli wsparcie zawiedzie lub zostanie usunięty.
Na przykład, jeśli chcę zachować / var / tmp na karcie SD, skorzystam z mount bind, ponieważ niektóre programy oczekują, że katalog / var / tmp będzie prawidłowy, nawet jeśli karta zostanie usunięta.
źródło
Próbowałem powiązać mount, aby obejść problem z instalacją niektórych pakietów z
pacman
(archlinux, więcej o tym tutaj ) w systemie, w którym/var
(oraz/home
i/usr/local
) były dowiązaniami symbolicznymi (między systemami plików: SSD do SATA).Wyglądało to świetnie na początku, ale jak zauważył Gilles,
locate
zawsze dawał wiele wyników dla jednego pliku, mimoPRUNE_BIND_MOUNTS = "yes"
linii/etc/updatedb.conf
.Kopiąc trochę dalej, odkryłem, że bardziej złożone mocowania wiązania mogą być przycinane poprawnie:
Bez opcji PRUNE_BIND_MOUNT uzyskałbym 3 wyniki:
Kolejny problem z mocowaniami powiązań:
Oczywiście można ręcznie dodawać uchwyty powiązań (mounpoint lub target) do
PRUNEPATHS
in/etc/updatedb.conf
.Ponadto,
mountpoint
różne narzędziastat
lub funkcje mogą być używane w narzędziach do poprawy przejścia systemu plików, jak tutaj zaproponowanoźródło