Яка різниця між ln -s та mount --bind?


36

Я намагаюся зрозуміти різницю між використанням ln -sта mount --bind. У базовому сценарії я можу використовувати обидва, щоб отримати доступ до одного каталогу з іншого місця. У яких сценаріях ці двоє будуть вести себе по-різному?


7
Я повинен попередити проти rm -rна mount --bind. При використанні a lnвін видаляє посилання, тоді як для a --bindце має такий же ефект, як і біг rm -rна ціль. Не добре, як я виявив незадовго до відновлення одного з моїх серверів ...
Mark K Cowan

@MarkKCowan це правда, якщо ви не створили жорстке посилання .
JohnnyQ

@JohnnyQ Не вдається поправити каталоги
Mark K Cowan

Відповіді:


33

Вони поводяться по-різному щонайменше у двох випадках:

  • У chroot , якщо ціль посилання знаходиться поза chroot, посилання буде мертвою. Прив’язка кріплення все ще буде доступною.
  • Кілька програм можуть розрізняти символічні посилання та фактичні каталоги чи файли. Мало хто (якщо є) може розрізнити каталог чи файл та встановлений на ньому. Це також поширюється на символічні посилання на щось ( A), на якому встановлено щось інше ( B). Посилання покаже вміст target mount ( B) замість оригіналу ( A).

Крім того, ви можете прив’язати монтування до каталогу чи файлів у існуючий каталог чи файл, маскуючи оригінальний вміст (робить вихідний вміст недоступним, якщо оригінал не був прив’язаний іншим чином). Символічне посилання вимагає переміщення або видалення оригіналу.


16

Ну, 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.


1
Я не використовував mount -bind, але я сумніваюся, що він може повторити поведінку подібного посилання ln -s ../../myfile .. Якщо ви перемістите це до іншого каталогу, він вкаже десь ще, оскільки це відносна посилання. Це може бути корисно, якщо вам потрібно створити резервну копію піддерева і все ж посилання працювати в резервній копії.
Джо

10

Крім того, ln -s пережив би перезавантаження; тоді як mount --bind не буде, якщо ви не редагуєте / etc / fstab, щоб зробити його стійким.


2

Окрім інших відповідей. Система не дозволяє жорстке посилання на каталог:

# 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 (лише для читання).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.