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