Я пытаюсь понять разницу между использованием 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цели. Не хорошо, как я обнаружил незадолго до перестройки одного из моих серверов ...