ln -s против mount --bind
Есть ли практическая разница между использованием ln -s
или же mount --bind
?
Я хочу переместить несколько папок в другой раздел, не меняя их настройки демона, и задаюсь вопросом, какой подход я должен использовать.
я предпочитаю ln -s
так как требует минимальной настройки (нет /etc/fstab
модификаций), но, возможно, есть причина, почему это не распространено?
4 ответа
Да, черт возьми. Если вы выполните ln -s
вы создаете символическую ссылку, которая является индексом, указывающим на определенный объект файловой системы, поэтому символические ссылки могут проходить через файловые системы, а жесткие ссылки - нет: жесткие ссылки не имеют своего собственного индекса.
Если вы смонтировали файловую систему с --bind
Вы создаете вторую точку монтирования для устройства или файловой системы.
Если вы видите символическую ссылку в качестве перенаправления, то представьте --bind
смонтированная файловая система как создание другого шлюза к данным.
Симлинки и привязные монтировки - это совершенно другая игра в мяч.
--bind
mount кажется мне более надежным и, вероятно, немного быстрее, чем работа с символической ссылкой. С другой стороны, нет никаких серьезных недостатков в использовании символической ссылки, так как снижение производительности будет небольшим (если оно вообще существует).
Изменить: я думал об этом, и хит производительности может быть немного больше, чем я первоначально думал. Если у вас есть приложение, которое читает много разных файлов, то каждый открытый файл требует дополнительного чтения. Некоторые исследования показывают, что моё предположение верно, поэтому, если у вас запущено тяжелое приложение ввода-вывода, рассмотрите --bind
возможность монтировать над решением символической ссылки.
Причина, по которой это не часто встречается, - это, вероятно, тот факт, что символическая ссылка видна в ls
в то время как монтирование с привязкой видно только при просмотре /proc/mounts или /etc/mtab (что и делает команда монтирования, если она выполняется без параметров). Кроме этого, я не думаю, что есть какие-либо проблемы. Мне было бы интересно, если таковые имеются.
Дополнение: еще одна проблема с ln -s
заключается в том, что для некоторых приложений, когда путь разыменовывается, это может привести к блокировке приложения, если оно "ожидает", что определенные элементы находятся в определенных местах.
Одно из больших различий между ln -s
и bind mount - это то, что вы можете использовать bind mount, чтобы "модифицировать" файловую систему только для чтения. Например, если на нем был смонтирован компакт-диск /mnt/application
и ты хотел заменить /mnt/application/badconfigfile.conf
с правильной версией вы можете сделать это:
mount -o bind /path/to/correct/file.conf /mnt/application/badconfigfile.conf
Было бы невозможно повлиять на то же изменение, используя символическую ссылку, потому что вы не можете изменить целевую файловую систему.
Это также может быть полезно, если вы распространяли общий набор программного обеспечения через NFS (или какую-то кластерную файловую систему), и вы хотите внести изменения, специфичные для хоста, в одной системе. Вы можете просто использовать bind mount в целевой системе, чтобы при необходимости переопределить файлы или каталоги.
Практическая разница #1 для меня между ln -s и mount --bind:
vsftpd не позволяет просматривать каталог по символической ссылке, но разрешает при монтировании.
Я не знаю, каким демоном вы пользуетесь, но он может вести себя аналогично.
Можно заметить, что в результате привязки к монтированию, которое само по себе является связыванием, которое впоследствии восстанавливается, исходное связывание остается неизменным, предполагая, что все физически остается подключенным.
То есть, если связать A с B и B с C, а затем связать D с B, C все равно будет связан с A. Это может быть тем, что вы хотите, или нет. Если кто-то желает, чтобы C следовал за B, то перемонтируйте, используя те же цели, т.е. mount -o remount B C
или используйте --rbind
вместо. Здесь нет --rebind
вариант.