Я пытаюсь понять разницу между использованием ln -s
и mount --bind
. В базовом сценарии я могу использовать оба для доступа к одному каталогу из другого места. В каких случаях эти двое будут вести себя по-разному?
36
Я пытаюсь понять разницу между использованием ln -s
и mount --bind
. В базовом сценарии я могу использовать оба для доступа к одному каталогу из другого места. В каких случаях эти двое будут вести себя по-разному?
rm -r
оmount --bind
. С помощью aln
он удаляет ссылку, тогда как для a--bind
он имеет тот же эффект, что и запускrm -r
цели. Не хорошо, как я обнаружил незадолго до перестройки одного из моих серверов ...Ответы:
Они будут вести себя по-разному как минимум в двух случаях:
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, чтобы сделать его постоянным.
источник
В дополнение к другим ответам. Система не допускает жесткую ссылку на каталог:
Крепление позволяет вам создать жесткие ссылки, например, два или более имени для одного и того же inode :
(Можно найти, что это помогает для резервного копирования моментальных снимков со старой версией rsync.)
Также обратите внимание, что это монтирование не завершено:
Таким образом, монтирование все еще читается и пишется, даже если я попросил опцию ro (только для чтения).
источник