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