Що таке кріплення кріплення?


325

Що таке "прив'язка"? Як зробити його? Для чого це добре?

Мені сказали використовувати прив'язку для чогось, але я не розумію, що це таке, і як ним користуватися.


2
корисне альтернативне уточнення між кріпленнями та посиланнями: quora.com/…
Чарлі Паркер

Відповіді:


564

Що таке кріплення кріплення?

Встановити прив'язку - це альтернативний вигляд дерева каталогів. Класично класичне монтування створює вигляд пристрою зберігання даних як дерева каталогів. Встановлення прив'язки замість цього займає існуюче дерево каталогів і реплікує його під іншою точкою. Довідники та файли, що знаходяться в кріпленні для прив’язки, такі самі, як у оригіналі. Будь-яка модифікація з одного боку негайно відображається на іншій стороні, оскільки два представлення показують однакові дані.

Наприклад, після видачі команди Linux

mount --bind /some/where /else/where

каталоги /some/whereта /else/whereмають однаковий зміст.

На відміну від жорсткого посилання або символічного посилання, прив'язка кріплення не впливає на те, що зберігається у файловій системі. Це властивість живої системи.

Як створити кріплення для прив’язки?

bindfs

bindfsФайлова система є FUSE файлову систему , яка створює уявлення дерева каталогів. Наприклад, команда

bindfs /some/where /else/where

робить /else/whereточку кріплення, під якою /some/whereвидно вміст .

Оскільки bindfs є окремою файловою системою, файли /some/where/fooі /else/where/fooвидаються різними файлами для додатків (файлова система bindfs має своє st_devзначення). Будь-яка зміна з одного боку "магічно" відображається на іншій стороні, але той факт, що файли однакові, видно лише тоді, коли хтось знає, як працює bindfs.

Bindfs не знає точок монтажу, тому, якщо є точка монтажу під /some/where, він відображається як лише інший каталог під /else/where. Монтаж або демонтаж файлової системи під нею /some/whereвідображається /else/whereяк зміна відповідного каталогу.

Bindfs може змінити деякі метадані файлу: він може показувати підроблені дозволи та права власності на файли. Деталі див. У посібнику та нижче.

Файлову систему bindfs можна встановити як некорінний користувач, для монтажу файлових систем FUSE потрібна лише привілей. Залежно від вашого розповсюдження, це може знадобитися бути у fuseгрупі або дозволено всім користувачам. Щоб відключити файлову систему FUSE, використовуйте fusermount -uзамість umount, напр

fusermount -u /else/where

nullfs

FreeBSD надає nullfsфайлову систему, яка створює альтернативний вигляд файлової системи. Наступні дві команди еквівалентні:

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

Після видачі будь-якої команди /else/whereперетворюється в точку монтажу, в якій /some/whereвидно вміст .

Оскільки nullfs - це окрема файлова система, файли /some/where/fooі /else/where/fooвидаються як різні файли для програм (файлова система nullfs має своє st_devзначення). Будь-яка зміна на одній стороні "магічно" відображається на іншій стороні, але той факт, що файли однакові, видно лише тоді, коли хтось знає, як працює nullfs.

На відміну від FUSE bindfs, який діє на рівні дерева каталогів, nullfs FreeBSD діє глибше в ядрі, тому точки монтажу під /else/whereне видно: лише дерево, яке є частиною тієї ж точки монтажу, що /some/whereвідображено під /else/where.

Файлова система nullfs може використовуватися в інших варіантах BSD (OS X, OpenBSD, NetBSD), але вона не компілюється як частина системи за замовчуванням.

Linux прив'язує кріплення

У Linux, кріплення прив'язки доступні як функція ядра. Ви можете створити його за допомогою mountкоманди, передавши або --bindваріант командного рядка, або bindопцію кріплення. Наступні дві команди еквівалентні:

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

Тут «пристрій» /some/where- це не дисковий розділ, як у випадку файлової системи на диску, а існуючий каталог. Точкою монтажу /else/whereмає бути звичайний каталог, як завжди. Зауважте, що жоден спосіб файлової системи не вказаний у будь-якому випадку: виготовлення прив’язки до монтажу не передбачає драйвера файлової системи, вона копіює структури даних ядра з оригінального кріплення.

mount --bindтакож підтримує встановлення не-каталогу на не-каталог: /some/whereможе бути звичайним файлом (і в цьому випадку також /else/whereповинен бути звичайний файл).

Версія для прив’язки до Linux переважно не відрізняється від оригіналу. Команда df -T /else/whereпоказує той самий пристрій і той же тип файлової системи, що і df -T /some/where. Файли /some/where/fooі /else/where/fooнерозрізні, ніби вони були жорсткими посиланнями. Демонтувати його можна /some/where, і в такому випадку він /else/whereзалишається змонтованим.

Що стосується старих ядер (я не знаю точно, коли, я думаю, до якогось 3.x), прив'язки кріплення справді не відрізнялися від оригіналу. Останні ядра відслідковують прив'язки монтів і викривають інформацію через PID / mountinfo, що дозволяє findmntвказати прив'язування монтажу як такого .

Ви можете розмістити записи прив’язки для монтування /etc/fstab. Просто включіть bind(або rbindтощо) в параметри разом з будь-якими іншими параметрами, які ви хочете. "Пристрій" - це існуюче дерево. Стовпчик файлової системи може містити noneабо bind(він ігнорується, але використання імені файлової системи було б заплутаним). Наприклад:

/some/where /readonly/view none bind,ro

Якщо під точками кріплення є місця /some/where, їх вміст не видно під /else/where. Замість цього bindви можете використовувати rbindтакож копіювати точки кріплення під ними /some/where. Наприклад, якщо /some/where/mntє точкою кріплення, тоді

mount --rbind /some/where /else/where

еквівалентно

mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt

Крім того, Linux дозволяє монтує бути оголошені як загальні , ведений , приватний або unbindable . Це впливає на те, чи відображається ця операція кріплення під прив'язкою, яка реплікує точку кріплення. Детальніше дивіться в документації на ядро .

Linux також пропонує спосіб переміщення монтів: де --bindкопіюється, --moveпереміщується точка монтажу.

Можливі різні параметри монтажу в двох каталогів, прив'язаних до зв'язків. Однак є химерність: зробити прив'язування прив’язки та встановити параметри кріплення не можна виконати атомно, вони повинні бути двома послідовними операціями. (Старіші ядра цього не дозволяли.) Наприклад, наступні команди створюють представлення лише для читання, але є невелике вікно часу, протягом якого /else/whereчитається-записується:

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

Я не можу змусити прив’язувати кріплення до роботи!

Якщо ваша система не підтримує FUSE, класичним трюком для досягнення того ж ефекту є запуск сервера NFS, змушення експортувати файли, які ви хочете викрити (дозволяючи доступ до них localhost) та монтувати їх на одній машині. Це має значні видатки з точки зору пам’яті та продуктивності, тому прив'язка кріплення має певну перевагу, коли це можливо (що в більшості варіантів Unix завдяки FUSE).

Використовуйте випадки

Перегляд лише для читання

Це може бути корисно створити представлення файлової системи лише для читання, або з міркувань безпеки, або просто як рівень безпеки, щоб гарантувати, що ви не випадково її зміните.

З палітурками:

bindfs -r /some/where /mnt/readonly

З Linux простий спосіб:

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

Це залишає невеликий проміжок часу, протягом якого /mnt/readonlyчитається-записується. Якщо це стосується безпеки, спершу створіть прив’язане кріплення в каталозі, до якого може отримати доступ лише root, зробіть його лише для читання, а потім перенесіть його на загальнодоступну точку монтажу. У фрагменті нижче зауважте, що важливо, щоб /root/private(каталог над точкою монтажу) був приватним; оригінальні дозволи на не /root/private/mntмають значення, оскільки вони приховані за точкою кріплення.

mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly

Переоформлення користувачів та груп

Файлові системи записують користувачів та групи за їх числовим ідентифікатором. Іноді ви стикаєтесь з кількома системами, які присвоюють різні ідентифікатори користувачів одній людині. Це не проблема з доступом до мережі, але робить ідентифікатори користувачів безглуздими, коли ви переносите дані з однієї системи в іншу на диску. Припустимо, у вас є диск, створений з багатокористувацькою файловою системою (наприклад, ext4, btrfs, zfs, UFS,…) в системі, де Alice має ідентифікатор користувача 1000, а Bob має ідентифікатор користувача 1001, і ви хочете зробити цей диск доступним на система, де Аліса має ідентифікатор користувача 1001, а Боб має ідентифікатор користувача 1000. Якщо ви встановите диск безпосередньо, файли Аліси з’являться як власності Боба (оскільки ідентифікатор користувача 1001), а файли Боба з'являться як належать Алісі (оскільки ідентифікатор користувача 1000).

Ви можете використовувати bindfs для перенастроювання ідентифікаторів користувачів. Спочатку змонтуйте розділ диска у приватному каталозі, де до нього може отримати доступ лише root. Потім створіть подання bindfs у загальнодоступній зоні, перезавантаживши ідентифікатор користувача та груповий ідентифікатор, який обміняє ідентифікатори користувачів Аліси та Боба та ідентифікатори групи.

mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk

Див. Як можна допустити доступ до файлів у домашній папці користувача, що не завантажується? і mount - прив'яжіть іншого користувача, як я ще один приклад.

Монтаж у в’язниці чи контейнері

У в'язниці чи контейнері chroot запускається процес у піддереві дерева каталогів системи. Це може бути корисно для запуску програми з обмеженим доступом, наприклад, запуску мережевого сервера з доступом лише до власних файлів та файлів, які він обслуговує, але не до інших даних, що зберігаються на тому ж комп'ютері). Обмеженням chroot є те, що програма обмежена одним піддією: вона не може отримати доступ до незалежних підрядів. Прив’язування кріплення дозволяє прищеплювати інші підкреслення до цього основного дерева. Це робить їх основоположним для найбільш практичного використання контейнерів під Linux.

Наприклад, припустимо, що машина працює службою, /usr/sbin/somethingdяка повинна мати доступ лише до даних під /var/lib/something. Найменше дерево каталогів, яке містить обидва ці файли, є коренем. Як можна обмежити службу? Однією з можливостей є створення жорстких посилань на всі файли, необхідні службі (принаймні, /usr/sbin/somethingdта декілька спільних бібліотек) /var/lib/something. Але це громіздко (жорсткі посилання повинні бути оновлені щоразу , коли файл оновлюється), і не працює , якщо /var/lib/somethingі /usrзнаходяться на різних файлових системах. Краще рішення - створити спеціальний корінь і заповнити його за допомогою кріплення:

mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &

Простори імен для монтування Linux узагальнюють хрооти. Прив'язування кріплення - це те, як простори імен можна заповнювати гнучкими способами. Див. Розділ Налаштування процесу для читання іншого файлу для того ж імені файлу для прикладу.

Запуск іншого розподілу

Ще одне використання chroots - це встановити інший розподіл у каталозі та запускати з нього програми, навіть коли їм потрібні файли на жорстко закодованих контурах, які відсутні або мають різний вміст у базовій системі. Це може бути корисно, наприклад, встановити 32-розрядний дистрибутив у 64-бітній системі, яка не підтримує змішані пакети, встановити старіші випуски дистрибутива чи інші дистрибутиви для перевірки сумісності, встановити новіший випуск для тестування новітні функції при підтримці стабільної базової системи тощо. Див. Як запустити 32-бітні програми на 64-бітній Debian / Ubuntu? для прикладу на Debian / Ubuntu.

Припустимо, у вас є установка останніх пакунків вашого дистрибутива під каталогом /f/unstable, де ви запускаєте програми, переходячи до цього каталогу chroot /f/unstable. Щоб домашні каталоги були доступні для цих установок, прив’яжіть їх, монтуючи їх у chroot:

mount --bind /home /f/unstable/home

Програма schroot робить це автоматично.

Доступ до файлів, прихованих за точкою кріплення

Коли ви монтуєте файлову систему в каталозі, це приховує те, що знаходиться за каталогом. Файли в цьому каталозі стають недоступними до тих пір, поки каталог не буде вимкнено. Оскільки BSD nullfs та Linux прив’язування Linux працюють на більш низькому рівні, ніж інфраструктура монтування, кріплення nullfs або прив'язка файлової системи відкриває каталоги, які були приховані за підмножинами в оригіналі.

Наприклад, припустимо, що у вас встановлена ​​файлова система tmpfs /tmp. Якщо під /tmpчас створення файлової системи tmpfs були файли , ці файли можуть залишатися фактично недоступними, але займають місце на диску. Біжи

mount --bind / /mnt

(Linux) або

mount -t nullfs / /mnt

(FreeBSD) для створення подання кореневої файлової системи на /mnt. Каталог /mnt/tmp- це той із кореневої файлової системи.

Експорт НФС за різними шляхами

Деякі сервери NFS (наприклад, сервер NFS ядра Linux до NFSv4) завжди рекламують фактичне розташування каталогів, коли вони експортують каталог. Тобто, коли клієнт запитує server:/requested/location, сервер обслуговує дерево у своєму місці /requested/location. Іноді бажано дозволити клієнтам запитувати, /request/locationале насправді обслуговувати файли під /actual/location. Якщо ваш сервер NFS не підтримує обслуговування альтернативного місця, ви можете створити прив'язку для очікуваного запиту, наприклад

/requested/location *.localdomain(rw,async)

в /etc/exportsі в наступному /etc/fstab:

/actual/location /requested/location bind bind

Заміна символічних посилань

Іноді ви хочете зробити символічне посилання, щоб файл /some/where/is/my/fileз’явився під /else/where, але програма, яка використовує, fileрозширює символічні посилання та відхиляє /some/where/is/my/file. Прив’язка кріплення може обходити це: bind-mount /some/where/is/myto /else/where/is/my, а потім realpathбуде повідомляти /else/where/is/my/fileпро under /else/where, а не under /some/where.

Побічні ефекти скріплення кріплення

Рекурсивні траверси каталогів

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

Зазвичай прив'язки кріплення повинні бути виключені з рекурсивних обходів каталогів, так що кожне дерево каталогів проходить лише один раз у вихідному місці. За допомогою bindfs та nullfs конфігуруйте інструмент проходу для ігнорування цих типів файлової системи, якщо це можливо. Linux-прив'язки не можуть бути розпізнані як такі: нове місце розташування еквівалентно оригіналу. Якщо Linux прив'язує кріплення або інструменти, які можуть виключати лише шляхи, а не типи файлової системи, вам потрібно виключити точки монтажу для прив'язки.

Обходи , які зупиняються на кордонах файлової системи (наприклад find -xdev, rsync -x, du -x, ...) автоматично зупиняються , коли вони стикаються з bindfs або nullfs точки монтування, тому що точка монтування іншої файлової система. З монтажами на прив'язку Linux ситуація дещо складніша: є межа файлової системи лише в тому випадку, якщо прив’язане кріплення прищеплює іншу файлову систему, а не якщо вона щеплює іншу частину тієї ж файлової системи.

Виходячи за кріплення кріплення

Встановлення прив'язки забезпечує перегляд дерева каталогів в іншому місці. Вони відкривають одні і ті ж файли, можливо, з різними параметрами монтажу та (з bindfs) різними правами власності та дозволами. Файлові системи, які представляють змінене уявлення про дерево каталогів, називаються файловими системами накладення або файловими системами, що складаються . Існує багато інших файлових систем накладення, які виконують більш вдосконалені перетворення. Ось кілька загальних. Якщо бажаний випадок використання тут не висвітлений, перевірте сховище файлових систем FUSE .

Фільтр видимих ​​файлів

  • clamfs - запускайте файли через сканер вірусів, коли вони читаються
  • filterfs - приховує частини файлової системи
  • rofs - вид лише для читання. Подібний bindfs -r, просто трохи більш легкий.
  • Кріплення Union - представлення декількох файлових систем (званих гілок ) в одному каталозі: якщо він tree1містить fooі tree2містить, barто їх представлення об'єднання містить і fooі bar. Нові файли записуються до певної гілки, або до гілки, обраної за більш складними правилами. Існує кілька реалізацій цієї концепції, включаючи:

Змінення імен файлів та метаданих

  • ciopfs - нечутливі до регістру імена файлів (можуть бути корисні для монтажу файлових систем Windows)
  • convmvfs - конвертувати назви файлів між наборами символів ( приклад )
  • posixovl - зберігати назви файлів Unix та інші метадані (дозволи, право власності,…) у більш обмежених файлових системах, таких як VFAT ( приклад )

Перегляд зміненого вмісту файлу

Змініть спосіб зберігання вмісту


1
можна додати приклад того, як це зробити з systemd: utcc.utoronto.ca/~cks/space/blog/linux/SystemdBindMountUnits
dothebart

1
Що робить mount --bind /dir1 /dir1? Чим він відрізняється від випадку, коли джерело та мета монтажу відрізняються?
Марк

Я не бачив записів у / proc / self / mountinfo, використовуючи linux 5.0. Ядро не каже мені, що це прив'язка чи ні. І процес може легко порушити chroot, ізоляція повинна бути виконана за допомогою простору імен.
炸鱼 薯条 德里克

@ 炸鱼 薯条 德里克 Я думаю, що пов'язане питання unix.stackexchange.com/questions/295525/… адреси /proc/self/mountinfo. Що стосується хроту, його можна використовувати для ізоляції, але не самостійно. Однак вам не потрібні простори імен кріплення: chroot достатньо для частини простору імен файлової системи. Вам потрібно переконатися, що жоден процес у chroot не працює таким самим користувачем, як процес поза chroot.
Жиль

@Mark Прив’язка каталогів до себе не дуже корисна. Я думаю, ви можете використовувати його для приховування файлових систем, встановлених під певним каталогом, але я не можу придумати момент, коли я хотів би це зробити конкретно.
Жиль

-1

Просте, коли ви використовуєте кріплення для прив’язки, файл або каталог на хост-машині встановлюється в контейнер, тому будь-які зміни, внесені всередині файлового каталогу на хост-машині, автоматично будуть доступні всередині контейнера в каталозі.


Це один із способів використовувати прив’язане кріплення, але самі по собі кріплення кріплення не мають нічого спільного з контейнерами. Я згадую це у своїй відповіді, але під назвою "в'язниця", а не "контейнер"; додавання "контейнера" ​​було б цінним редагуванням (я це зроблю). Це також поганий опис: чому згадувати, що зміни, внесені зовні, також доступні всередині, не згадуючи навпаки?
Жиль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.