ln -s vs mount --bind

19

Czy jest jakaś praktyczna różnica między używaniem ln -slub mount --bind?

Chcę przenieść niektóre foldery na inną partycję bez zmiany ich ustawień demonów i zastanawiam się, jakie podejście powinienem zastosować.

Wolę, ln -sponieważ wymaga minimalnej konfiguracji (bez /etc/fstabmodyfikacji), ale może istnieje powód, dla którego nie jest to powszechne?

SyRenity
źródło

Odpowiedzi:

25

O tak. Wykonując polecenie ln -s, tworzysz dowiązanie symboliczne, które jest i- węzłem wskazującym na określony obiekt systemu plików, dlatego dowiązania symboliczne mogą przechodzić przez systemy plików, a dowiązania twarde nie mogą: dowiązania twarde nie mają własnego i-węzła.

Jeśli montujesz system plików --bind, tworzysz drugi punkt montowania dla urządzenia lub systemu plików.

Jeśli wyobrażasz sobie dowiązanie symboliczne jako przekierowanie, to wyobraź sobie --bindzamontowany system plików jako kolejną bramę do danych.

Łącza symboliczne i łączenie opraw to zupełnie inna gra.

--bindMocowanie wydaje się nieco bardziej odporne na mnie i to prawdopodobnie jest nieco szybciej niż praca z dowiązania symbolicznego. Z drugiej strony nie ma poważnych wad korzystania z dowiązania symbolicznego, ponieważ wydajność będzie niewielka (jeśli w ogóle istnieje).

Edycja : Myślałem o tym, a wydajność może być nieco większa, niż początkowo myślałem. Jeśli masz aplikację, która odczytuje wiele różnych plików, każdy nowy plik, który zostanie otwarty, będzie wymagał dodatkowego odczytu. Niektóre badania tutaj sugerują, że moje założenie jest poprawne, więc jeśli masz tam ciężką aplikację IO, rozważ --bindopcję zamontowania nad rozwiązaniem dowiązania symbolicznego.

Powodem, dla którego nie jest to powszechne, jest prawdopodobnie fakt, że dowiązanie symboliczne jest widoczne w ls, podczas gdy łączenie łączenia jest widoczne tylko podczas patrzenia na / proc / mounts lub / etc / mtab (co robi polecenie mount, jeśli jest wykonywane bez parametrów). Poza tym nie sądzę, żeby były jakieś problemy. Byłbym jednak zainteresowany, gdyby tak było.

Dodanie : innym problemem ln -sjest to, że w przypadku niektórych aplikacji, gdy ścieżka zostaje zaniedbana, może to powodować zawieszanie się aplikacji, jeśli „spodziewa się”, że niektóre elementy znajdują się w określonych miejscach.

wzzrd
źródło
Dzięki za wyjaśnienie! Małe pytanie uzupełniające - co właściwie robi parametr --rbind i jak go wykorzystać? Z instrukcji wynika, że ​​parametr obsługuje montaż podpórek w zamontowanym drzewie, czy to prawda? Ponadto, czy tylko - wiązanie jest wystarczające, czy też muszę zrobić - wiązać wtedy - wiązać? Dzięki jeszcze raz.
SyRenity,
2
mount, po wywołaniu bez żadnych argumentów, drukuje zawartość /etc/mtab, która zawiera nieco inne informacje niż /proc/mounts. (W szczególności /proc/mounts(dowiązanie symboliczne do /proc/self/mounts) zawsze pokazuje punkty montowania widoczne dla czytającego go procesu.)
grawity
1
@wzzrd - z FAQ „Najlepsze ze wszystkich - edytuj i ulepsz istniejące pytania i odpowiedzi!” :) .. to nie jest żadna drobna odpowiedź - jest to małe ulepszenie z dodatkowymi informacjami, za które otrzymasz dodatkowe przedstawicielstwo, jeśli / kiedy zostanie głosowane :)
warren
1
@warren, nieważne, nie jestem zły :) po prostu dodałeś coś, o czym nie mam pojęcia, więc czułem się trochę dziwnie;)
wzzrd
2
@wzzrd - nie chciałem stanąć na palcach :) .. problem związany z aplikacją to coś, z czym natknąłem się na główny produkt, którego używam
warren
6

Jedną z dużych różnic między ln -spodłączeniem do wiązania jest to, że można użyć podłączenia do „modyfikacji” systemu plików tylko do odczytu. Na przykład, jeśli zamontowano dysk CD /mnt/application, a chcesz zastąpić /mnt/application/badconfigfile.confpoprawną wersją, możesz to zrobić:

mount -o bind /path/to/correct/file.conf /mnt/application/badconfigfile.conf

Nie można zmienić tej samej zmiany za pomocą dowiązania symbolicznego, ponieważ nie można modyfikować docelowego systemu plików.

Można to również wykorzystać, jeśli ma się dobry wpływ, jeśli rozpowszechniasz wspólny pakiet oprogramowania za pośrednictwem NFS (lub innego systemu plików w klastrze) i chcesz wprowadzić zmiany specyficzne dla hosta w jednym systemie. Możesz po prostu użyć montowania powiązań w systemie docelowym, aby w razie potrzeby zastąpić pliki lub katalogi.

Larsks
źródło
Oszczędzanie bólu głowy! (rzadki przypadek, ale warto pamiętać o tym szczególnym momencie)
Jonathan Komar
2

Praktyczna różnica # 1 dla mnie między ln -s a mount --bind:

vsftpd nie pozwala na przeglądanie katalogu poprzez dowiązanie symboliczne, ale pozwala na zamontowanie.

Nie wiem, jakiego demona używasz, ale może on zachowywać się podobnie.

petrus
źródło
1

Można zauważyć, że w wyniku powiązania z wierzchowcem, który sam jest wiązaniem, które później jest odbijane, oryginalne wiązanie pozostaje nietknięte, zakładając, że wszystko fizycznie pozostaje połączone.

To znaczy, jeśli wiązanie A do B i wiązanie B do C, a następnie wiązanie D do B, C nadal będzie wiązane z A. To może być to, czego chcesz, lub nie. Jeśli ktoś chce, aby C podążył za B, wówczas ponownie zamontuj go, używając tych samych celów, czyli mount -o remount B Cużyj --rbindzamiast tego. Nie ma --rebindopcji.

Wiley
źródło