Я пытаюсь понять различие между использованием ln -s
и mount --bind
. В основном сценарии я могу использовать обоих для доступа к одному каталогу от где-то в другом месте. В каких сценариях те два будут вести себя по-другому?
Они будут вести себя по-другому по крайней мере в двух случаях:
A
), которые имеют что-то еще (B
) смонтированный на них. Ссылка покажет содержание цели монтирования (B
) вместо оригинала (A
). кроме того, можно связать, монтируют каталог или файл на существующем каталоге или файл, маскируя исходное содержание (представляющий исходное содержание, недоступное, если оригинал не был, связывают смонтированный в другом месте). Символьная ссылка требует, чтобы оригинал был перемещен или удален.
Кроме того, ln-s пережил бы перезагрузку; тогда как монтируются - связывают, не был бы, если Вы не редактируете/etc/fstab для создания его персистентным.
В дополнение к другим ответам. Система не позволяет жесткую ссылку на каталог:
# ln mydir mpoint
ln: `mydir': hard link not allowed for directory
монтирование позволило Вам сделать подобными жесткой ссылке т.е. два или больше названия того же один inode:
# mount -B mydir/ mpoint/
# ls -d -i *
807175 mpoint/ 807175 mydir/
(Можно найти, что это помогает для резервного копирования снимка со старой версией rsync.)
кроме того, обратите внимание, что это монтирование не завершено:
# 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)
Так, монтирование все еще читается, и запишите, попросил ли я опцию ro (только для чтения).
Ну, ln -s
создает символьную ссылку, тогда как mount --bind
создает монтирование.
Символьная ссылка является специальным типом файла. Если Вы делаете ln -s /var/target /var/link
, затем /var/link
будет файл, содержащий путь"/var/target
"в нем. Единственная разница между символьной ссылкой и обычным файлом - то, что, когда программа пытается выполнить операцию на символьной ссылке, операция обычно выполняется на цели вместо файла. Таким образом, теперь, если Вы делаете ls /var/link
, ls
программа попытается получить список каталогов для /var/link
, но на самом деле получит список каталогов для /var/target
вместо этого.
Символьные ссылки являются все еще просто файлами, все же. Они могут быть переименованы и удалены и весь тот джаз. Обратите внимание, что Вы не можете создать символьную ссылку (или обычный файл, в этом отношении) названный /var/link
если уже существует названный файл /var/link
; необходимо было бы избавиться от него сначала.
Монтирование не является файлом; это - учет, который ядро ведет в памяти. Если Вы делаете mount --bind /var/target /var/mount
, ядро запишет факт это /var/mount
теперь новое название /var/target
. (Я не знаю детали; в частности, я не знаю при монтировании чего-то в подкаталоге /var/target
заставит его обнаружиться в /var/mount
также, или почему или почему нет. Редактирования к этому ответу ценились бы.) Поэтому теперь, если Вы делаете ls /var/mount
, то же самое произойдет, как будто Вы сделали ls /var/target
, потому что /var/mount
и /var/target
тот же каталог.
Монтирование не является файлами. Я не знаю то, что произошло бы, если бы Вы пытались переименовать или удалить /var/mount
. Обратите внимание, что Вы ничего не можете смонтировать в /var/mount
если уже нет каталог в /var/mount
.