Відповіді:
Встановити прив'язку - це альтернативний вигляд дерева каталогів. Класично класичне монтування створює вигляд пристрою зберігання даних як дерева каталогів. Встановлення прив'язки замість цього займає існуюче дерево каталогів і реплікує його під іншою точкою. Довідники та файли, що знаходяться в кріпленні для прив’язки, такі самі, як у оригіналі. Будь-яка модифікація з одного боку негайно відображається на іншій стороні, оскільки два представлення показують однакові дані.
Наприклад, після видачі команди Linux
mount --bind /some/where /else/where
каталоги /some/where
та /else/where
мають однаковий зміст.
На відміну від жорсткого посилання або символічного посилання, прив'язка кріплення не впливає на те, що зберігається у файловій системі. Це властивість живої системи.
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
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, кріплення прив'язки доступні як функція ядра. Ви можете створити його за допомогою 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/my
to /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 .
bindfs -r
, просто трохи більш легкий.Кріплення Union - представлення декількох файлових систем (званих гілок ) в одному каталозі: якщо він tree1
містить foo
і tree2
містить, bar
то їх представлення об'єднання містить і foo
і bar
. Нові файли записуються до певної гілки, або до гілки, обраної за більш складними правилами. Існує кілька реалізацій цієї концепції, включаючи:
mount --bind /dir1 /dir1
? Чим він відрізняється від випадку, коли джерело та мета монтажу відрізняються?
/proc/self/mountinfo
. Що стосується хроту, його можна використовувати для ізоляції, але не самостійно. Однак вам не потрібні простори імен кріплення: chroot достатньо для частини простору імен файлової системи. Вам потрібно переконатися, що жоден процес у chroot не працює таким самим користувачем, як процес поза chroot.
Просте, коли ви використовуєте кріплення для прив’язки, файл або каталог на хост-машині встановлюється в контейнер, тому будь-які зміни, внесені всередині файлового каталогу на хост-машині, автоматично будуть доступні всередині контейнера в каталозі.