ln -s против монтирования --bind


19

Есть ли практическая разница между использованием ln -sили mount --bind?

Я хочу переместить несколько папок в другой раздел, не меняя их настройки демона, и задаюсь вопросом, какой подход я должен использовать.

Я предпочитаю, так ln -sкак это требует минимальной настройки (без /etc/fstabизменений), но, возможно, есть причина, почему это не распространено?

Ответы:


25

Да, черт возьми. При выполнении ln -sвы создаете символическую ссылку, которая является индексом, указывающим на определенный объект файловой системы, поэтому символические ссылки могут проходить через файловые системы, а жесткие ссылки не могут: жесткие ссылки не имеют своего собственного индекса.

Если вы монтируете файловую систему с помощью --bind, вы создаете вторую точку монтирования для устройства или файловой системы.

Если вы представляете символическую ссылку как перенаправление, то представляете --bindсмонтированную файловую систему как создание другого шлюза к данным.

Симлинки и привязные монтировки - это совершенно другая игра в мяч.

--bindКрепление кажется немного более надежным для меня , и это , вероятно, немного быстрее , чем работы с линком. С другой стороны, нет никаких серьезных недостатков в использовании символической ссылки, так как снижение производительности будет небольшим (если оно вообще существует).

Изменить : я думал об этом, и хит производительности может быть немного больше, чем я первоначально думал. Если у вас есть приложение, которое читает много разных файлов, то каждый открытый файл требует дополнительного чтения. Некоторые исследования здесь говорят о том , что мое предположение верно, поэтому если у вас есть приложение тяжелых IO работает там, рассмотреть --bindвозможность монтировать над раствором SYMLINK.

Причина, по которой это не часто встречается, - это, вероятно, тот факт, что символическая ссылка видима в ls, тогда как монтирование связывания видно только при просмотре / proc / mounts или / etc / mtab (что и делает команда mount, если она выполняется без параметров). Кроме этого, я не думаю, что есть какие-либо проблемы. Мне было бы интересно, если таковые имеются.

Дополнение : другая проблема ln -sзаключается в том, что для некоторых приложений, когда путь разыменовывается, это может привести к блокировке приложения, если оно «ожидает», что определенные элементы находятся в определенных местах.


Спасибо за исчерпывающее объяснение! Небольшой дополнительный вопрос - что на самом деле делает параметр --rbind и как его можно использовать? Из руководства кажется, что параметр поддерживает монтирование подмонтировок в смонтированном дереве, это правильно? Кроме того, достаточно только --rbind или мне нужно сделать --bind затем --rebind? Еще раз спасибо.
SyRenity

2
mount, когда вызывается без каких-либо аргументов, печатает содержимое /etc/mtab, которое имеет информацию немного отличную от /proc/mounts. (В частности, /proc/mounts(символическая ссылка на /proc/self/mounts) всегда показывает точки монтирования, видимые для процесса, который его читает.)
user1686

1
@wzzrd - из FAQ «Лучше всего - редактируйте и улучшайте существующие вопросы и ответы!» :) .. это ни в коем случае не является незначительным для вашего ответа - это небольшое улучшение с дополнительной информацией, за которую вы получите дополнительное повторение, если / когда за него проголосуют :)
warren

1
@ warren, не бери в голову, я не злюсь :) просто ты добавил что-то, о
чём

2
@wzzrd - не хотел наступать ни на что :): специфическая проблема приложения - это то, с чем я столкнулся с основным продуктом, который я использую
Уоррен

6

Одно из больших различий между ln -sмонтированием и связыванием заключается в том, что вы можете использовать монтирование связывания, чтобы «модифицировать» файловую систему только для чтения. Например, если на нем был смонтирован компакт-диск /mnt/applicationи вы хотите заменить его /mnt/application/badconfigfile.confна правильную версию, вы можете сделать это:

mount -o bind /path/to/correct/file.conf /mnt/application/badconfigfile.conf

Было бы невозможно повлиять на то же изменение, используя символическую ссылку, потому что вы не можете изменить целевую файловую систему.

Это также может быть полезно, если вы распространяли общий набор программного обеспечения через NFS (или какую-то кластерную файловую систему), и вы хотите внести изменения, специфичные для хоста, в одной системе. Вы можете просто использовать bind mount в целевой системе, чтобы при необходимости переопределить файлы или каталоги.


Головная боль заставка! (редкий случай, но стоит помнить для этого особенного момента)
Джонатан Комар

2

Практическая разница # 1 для меня между ln -s и mount --bind:

vsftpd не позволяет просматривать каталог по символической ссылке, но разрешает при монтировании.

Я не знаю, каким демоном вы пользуетесь, но он может вести себя аналогично.


1

Можно заметить, что в результате привязки к монтированию, которое само по себе является связыванием, которое впоследствии восстанавливается, исходное связывание остается неповрежденным, предполагая, что все физически остается подключенным.

То есть, если связать A с B и B с C, а затем связать D с B, C все равно будет связан с A. Это может быть тем, что вы хотите, или нет. Если кто-то желает, чтобы C следовал за B, перемонтируйте, используя те же цели, то есть mount -o remount B C, или используйте --rbindвместо этого. Там нет --rebindварианта.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.