Я пытаюсь понять разницу между использованием ln -s
и mount --bind
. В базовом сценарии я могу использовать оба для доступа к одному каталогу из другого места. В каких случаях эти двое будут вести себя по-разному?
Я пытаюсь понять разницу между использованием ln -s
и mount --bind
. В базовом сценарии я могу использовать оба для доступа к одному каталогу из другого места. В каких случаях эти двое будут вести себя по-разному?
Ответы:
Они будут вести себя по-разному как минимум в двух случаях:
A
), на котором есть что-то другое ( B
). По ссылке будет отображаться содержимое mount target ( B
) вместо оригинального ( A
).Кроме того, вы можете подключить каталог или файл к существующему каталогу или файлу, маскируя исходное содержимое (делая исходное содержимое недоступным, если исходное содержимое не было подключено в другом месте). Символическая ссылка требует, чтобы оригинал был перемещен или удален.
Хорошо, 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
.
ln -s ../../myfile .
. Если вы переместите это в другой каталог, он укажет куда-то еще, потому что это относительная ссылка. Это может быть полезно, если вам нужно сделать резервную копию поддерева и при этом все еще работают ссылки в резервной копии.
Кроме того, ln -s переживет перезагрузку; тогда как mount --bind не будет, если вы не отредактируете / 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 (только для чтения).
rm -r
оmount --bind
. С помощью aln
он удаляет ссылку, тогда как для a--bind
он имеет тот же эффект, что и запускrm -r
цели. Не хорошо, как я обнаружил незадолго до перестройки одного из моих серверов ...