Jaka jest różnica między ln -s a mount -bind?

36

Próbuję zrozumieć różnicę między używaniem ln -sa mount --bind. W podstawowym scenariuszu mogę użyć obu, aby uzyskać dostęp do jednego katalogu z innego miejsca. W jakich scenariuszach ci dwaj będą zachowywać się inaczej?

Łukasz
źródło
7
Powinienem ostrzec przed rm -rna zasadzie mount --bind. Przy pomocy a lnusuwa link, podczas gdy dla a --bindma taki sam efekt jak uruchomienie rm -rna celu. Nie dobrze, jak znalazłem na krótko przed przebudową jednego z moich serwerów ...
Mark K Cowan
@ MarkKCowan to prawda, chyba że utworzyłeś twardy link .
JohnnyQ
@JohnnyQ Can't hardlink katalogów
Mark K Cowan

Odpowiedzi:

33

Zachowują się inaczej w co najmniej dwóch przypadkach:

  • W chroot , jeśli cel łącza znajduje się poza chroot, łącze będzie martwe. Mocowanie do wiązania będzie nadal dostępne.
  • Kilka programów może odróżnić dowiązania symboliczne od rzeczywistych katalogów lub plików. Niewielu (jeśli w ogóle) potrafi odróżnić katalog lub plik od tego, w którym jest on zamontowany. Dotyczy to również dowiązań symbolicznych do czegoś ( A), które mają Bzamontowane coś innego ( ). Link pokaże zawartość mount target ( B) zamiast oryginalnego ( A).

Ponadto możesz powiązać zamontować katalog lub plik w istniejącym katalogu lub pliku, maskując oryginalną zawartość (czyniąc oryginalną zawartość niedostępną, chyba że oryginał został podłączony w innym miejscu). Link symboliczny wymaga przeniesienia lub usunięcia oryginału.

muru
źródło
16

Cóż, ln -stworzy dowiązanie symboliczne, podczas gdy mount --bindtworzy wierzchowca.

Dowiązanie symboliczne to specjalny typ pliku. Jeśli to zrobisz ln -s /var/target /var/link, /var/linkbędzie to plik zawierający ścieżkę „ /var/target”. Jedyną różnicą między dowiązaniem symbolicznym a zwykłym plikiem jest to, że gdy program próbuje wykonać operację na dowiązaniu symbolicznym, operacja jest zwykle wykonywana na obiekcie docelowym zamiast pliku. Więc teraz, jeśli to zrobisz ls /var/link, lsprogram spróbuje uzyskać listę katalogów dla /var/link, ale /var/targetzamiast tego dostanie listę katalogów .

Dowiązania symboliczne są jednak nadal tylko plikami. Można je zmienić i usunąć, i cały ten jazz. Zauważ, że nie możesz utworzyć dowiązania symbolicznego (lub zwykłego pliku, jeśli o to chodzi) wywoływanego, /var/linkjeśli istnieje już plik o nazwie /var/link; najpierw musisz się go pozbyć.

Montaż nie jest plikiem; jest to zapis, który jądro przechowuje w pamięci. Jeśli to zrobisz mount --bind /var/target /var/mount, jądro zapisze fakt, że /var/mountteraz jest to nowa nazwa /var/target. (Nie znam szczegółów; w szczególności nie wiem, czy zamontowanie czegoś w podkatalogu /var/targetsprawi, że również się pojawi /var/mount, lub dlaczego lub dlaczego nie. Modyfikacje tej odpowiedzi byłyby mile widziane.) Więc teraz jeśli to zrobisz ls /var/mount, stanie się to samo, jakbyś to zrobił ls /var/target, ponieważ /var/mounti /var/targetsą w tym samym katalogu.

Mocowania nie są plikami. Nie wiem, co by się stało, gdybyś próbował zmienić nazwę lub usunąć /var/mount. Zauważ, że nie możesz zamontować niczego na, /var/mount chyba że istnieje już katalog na /var/mount.

Tanner Swett
źródło
1
Nie użyłem mount -bind, ale wątpię, żeby mógł odtworzyć zachowanie takiego dowiązania symbolicznego ln -s ../../myfile .. Jeśli przeniesiesz to do innego katalogu, wskaże to gdzie indziej, ponieważ jest to łącze względne. Może to być przydatne, jeśli chcesz wykonać kopię zapasową poddrzewa i nadal mieć łącza działające w kopii zapasowej.
Joe
10

Dodatkowo, ln -s przetrwałoby restart; podczas gdy mount --bind nie zrobiłby tego, chyba że edytujesz / etc / fstab, aby był trwały.

Mark Williams
źródło
2

Oprócz innych odpowiedzi. System nie zezwala na stałe łącze do katalogu:

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

Mount pozwala ci tworzyć twarde łącza, tj. Dwie lub więcej nazw dla tego samego i- węzła :

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

(Można znaleźć, że pomaga w tworzeniu kopii zapasowych migawek ze starą wersją rsync.)

Pamiętaj również, że to połączenie nie zostało ukończone:

# 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)

Tak więc mount jest nadal do odczytu i zapisu, nawet jeśli poprosiłem o opcję ro (tylko do odczytu).

Udi
źródło