Я намагаюся зрозуміти різницю між використанням ln -s
та mount --bind
. У базовому сценарії я можу використовувати обидва, щоб отримати доступ до одного каталогу з іншого місця. У яких сценаріях ці двоє будуть вести себе по-різному?
Я намагаюся зрозуміти різницю між використанням ln -s
та mount --bind
. У базовому сценарії я можу використовувати обидва, щоб отримати доступ до одного каталогу з іншого місця. У яких сценаріях ці двоє будуть вести себе по-різному?
Відповіді:
Вони поводяться по-різному щонайменше у двох випадках:
A
), на якому встановлено щось інше ( B
). Посилання покаже вміст target mount ( 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
на ціль. Не добре, як я виявив незадовго до відновлення одного з моїх серверів ...