Próbuję zrozumieć różnicę między używaniem ln -s
a 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?
Próbuję zrozumieć różnicę między używaniem ln -s
a 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?
Odpowiedzi:
Zachowują się inaczej w co najmniej dwóch przypadkach:
A
), które mają B
zamontowane 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.
Cóż, ln -s
tworzy dowiązanie symboliczne, podczas gdy mount --bind
tworzy wierzchowca.
Dowiązanie symboliczne to specjalny typ pliku. Jeśli to zrobisz ln -s /var/target /var/link
, /var/link
bę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
, ls
program spróbuje uzyskać listę katalogów dla /var/link
, ale /var/target
zamiast 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/link
jeś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/mount
teraz jest to nowa nazwa /var/target
. (Nie znam szczegółów; w szczególności nie wiem, czy zamontowanie czegoś w podkatalogu /var/target
sprawi, ż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/mount
i /var/target
są 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
.
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.
Dodatkowo, ln -s przetrwałoby restart; podczas gdy mount --bind nie zrobiłby tego, chyba że edytujesz / etc / fstab, aby był trwały.
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).
rm -r
na zasadziemount --bind
. Przy pomocy aln
usuwa link, podczas gdy dla a--bind
ma taki sam efekt jak uruchomienierm -r
na celu. Nie dobrze, jak znalazłem na krótko przed przebudową jednego z moich serwerów ...