В чем разница между ln -s и mount --bind?

36

Я пытаюсь понять разницу между использованием ln -sи mount --bind. В базовом сценарии я могу использовать оба для доступа к одному каталогу из другого места. В каких случаях эти двое будут вести себя по-разному?

Лукаш
источник
7
Я должен предостеречь против rm -rо mount --bind. С помощью a lnон удаляет ссылку, тогда как для a --bindон имеет тот же эффект, что и запуск rm -rцели. Не хорошо, как я обнаружил незадолго до перестройки одного из моих серверов ...
Марк К Кауэн
@MarkKCowan это правда, если вы не создали жесткую ссылку .
JohnnyQ
@JohnnyQ Не могу жестко связать каталоги
Марк К Коуэн

Ответы:

33

Они будут вести себя по-разному как минимум в двух случаях:

  • В chroot , если цель ссылки находится вне chroot, ссылка будет мертвой. Привязка будет по-прежнему доступна.
  • Несколько программ могут различать символические ссылки и фактические каталоги или файлы. Немногие (если есть) могут различить каталог или файл и тот, который на нем установлен. Это также распространяется на символические ссылки на что-то ( A), на котором есть что-то другое ( B). По ссылке будет отображаться содержимое mount target ( B) вместо оригинального ( A).

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

Мур
источник
16

Хорошо, 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.

Таннер Светт
источник
1
Я не использовал mount --bind, но сомневаюсь, что он может повторять поведение символической ссылки ln -s ../../myfile .. Если вы переместите это в другой каталог, он укажет куда-то еще, потому что это относительная ссылка. Это может быть полезно, если вам нужно сделать резервную копию поддерева и при этом все еще работают ссылки в резервной копии.
Джо
10

Кроме того, ln -s переживет перезагрузку; тогда как mount --bind не будет, если вы не отредактируете / etc / fstab, чтобы сделать его постоянным.

Марк Уильямс
источник
2

В дополнение к другим ответам. Система не допускает жесткую ссылку на каталог:

# 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 (только для чтения).

Уди
источник