Что такое привязка?

Что такое «привязанность»? Как это сделать? Для чего это полезно?

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

222 голоса | спросил Gilles 25 PMpSat, 25 Apr 2015 20:28:58 +030028Saturday 2015, 20:28:58

1 ответ


404

Что такое привязка?

A привязка mount - альтернативное представление дерева каталогов. Классически установка создает вид устройства хранения в виде дерева каталогов. Вместо этого привязка монтирует существующее дерево каталогов и реплицирует его в другой точке. Каталоги и файлы в привязке монтируются так же, как и оригинал. Любая модификация с одной стороны сразу отражается на другой стороне, так как оба представления показывают одни и те же данные.

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

mount --bind /some /где /else /где

каталоги /some /where и /else /where имеют одинаковый контент.

В отличие от жесткой ссылки или символической ссылки, mount привязки не влияет на то, что хранится в файловой системе. Это свойство живой системы.

Как создать привязку привязки?

bindfs

bindfs - это файловая система FUSE , которая создает представление дерева каталогов. Например, команда

bindfs /some /where /else /где

создает /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 может быть установлена ​​как пользователь без полномочий root, вам нужна только привилегия для монтирования файловых систем FUSE. В зависимости от вашего распределения это может потребоваться в группе fuse или разрешено всем пользователям. Чтобы отключить файловую систему FUSE, используйте fusermount -u вместо umount, например

fusermount -u /else /где

nullfs

FreeBSD предоставляет nullfs , которая создает альтернативное представление файловой системы. Следующие две команды эквивалентны:

mount -t nullfs /some /где /else /где
mount_nullfs /some /где /else /где

После выдачи любой команды /else /where становится точкой монтирования, в которой видны содержимое /some /where.

Поскольку nullfs является отдельной файловой системой, файлы /some /where /foo и /else /where /foo отображаются как разные файлы для приложений (файловая система nullfs имеет его собственное значение st_dev). Любые изменения с одной стороны «с математической точки зрения» отражаются на другой стороне, но тот факт, что файлы одинаковы, проявляется только тогда, когда известно, как работает нуль.

В отличие от FUSE bindfs, который действует на уровне дерева каталогов, nullfs FreeBSD действует глубже в ядре, поэтому точки подключения в /else /where не отображаются: только дерево, которое часть той же точки монтирования, что и /some /where отражается в /else /where.

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

Подключить привязку Linux

В Linux, привязки монтируются как функция ядра. Вы можете создать его с помощью mount , передав параметр командной строки - bind или параметр монтирования bind. Следующие две команды эквивалентны:

mount --bind /some /где /else /где
mount -o bind /some /где /else /где

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

Консоль привязки Linux в основном неотличима от оригинала. Команда df -T/else /where показывает одно и то же устройство и тот же тип файловой системы, что и df -T /some /where. Файлы /some /where /foo и /else /where /foo неразличимы, как если бы они были жесткими ссылками. Можно отключить /some /where, и в этом случае /else /where остается установленным.

С более старыми ядрами (я не знаю точно, когда, думаю, до тех пор, пока не будет 3.x), bind mounts действительно неотличимы от оригинала. Недавние ядра отслеживают привязки привязок и предоставляют информацию через PID /mountinfo, что позволяет findmnt, чтобы указать mount mount как таковое .

Если в разделе /some /where есть точки монтирования, их содержимое не отображается в /else /where. Вместо bind вы можете использовать rbind, также реплицировать точки монтирования под /some /where. Например, если /some /where /mnt является точкой монтирования, то

mount --rbind /some /где /else /где

эквивалентно

mount --bind /some /где /else /где
mount --bind /some /where /mnt /else /где /mnt

Кроме того, Linux позволяет объявлять mounts как shared , slave , private или unbindable . Это влияет на то, отражается ли эта операция монтирования под монтированием привязки, которая реплицирует точку монтирования. Для получения дополнительной информации см. документацию ядра .

Linux также предоставляет способ перемещения mounts: где - bind копии, - move перемещает точку монтирования.

В двух каталогах, связанных с привязкой, возможно наличие разных параметров монтирования. Однако есть причуда: создание привязки и настройка параметров монтирования не могут выполняться атомарно, они должны быть двумя последовательными операциями. (Старые ядра этого не допускали.) Например, следующие команды создают представление только для чтения, но есть небольшое окно времени, в течение которого /else /where читается-записывается:

mount --bind /some /где /else /где
mount -o remount, ro, bind /else /where

Я не могу заставить bind mounts работать!

Если ваша система не поддерживает FUSE, классический трюк для достижения такого же эффекта заключается в том, чтобы запустить сервер NFS, заставить экспортировать файлы, которые вы хотите открыть (разрешая доступ к localhost) и смонтируйте их на одной машине. Это имеет существенные накладные расходы с точки зрения памяти и производительности, поэтому привязки mounts имеют определенное преимущество, когда это доступно (что доступно для большинства вариантов Unix благодаря FUSE).

Использовать случаи

Просмотр только для чтения

Может быть полезно создать просмотр файловой системы только для чтения, либо по соображениям безопасности, либо как уровень безопасности, чтобы убедиться, что вы случайно не измените его.

С bindfs:

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, â € |) в системе, где у Алисы есть идентификатор пользователя 1000, а у Боба есть идентификатор пользователя 1001, и вы хотите сделать этот диск доступный в системе, где у Алисы есть идентификатор пользователя 1001, а у Боба есть идентификатор пользователя 1000. Если вы монтируете диск напрямую, файлы Alice будут отображаться как принадлежащие Бобу (поскольку идентификатор пользователя 1001), а файлы Боба будут отображаться как принадлежащие Алисе ( потому что идентификатор пользователя - 1000).

Вы можете использовать bindfs для переназначения идентификаторов пользователей. Сначала установите раздел диска в частной директории, где к нему может обращаться только root. Затем создайте представление bindfs в общедоступной области с повторным набором идентификатора пользователя и группы ID, который заменяет идентификаторы пользователя и идентификаторов группы Алиса и Боба.

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 - привязать другого пользователя как себя к другим примерам.

Установка в тюрьме

A chroot jail запускает процесс в поддереве дерева каталогов системы. Это может быть полезно для запуска программы с ограниченным доступом, например. запустить сетевой сервер с доступом только к собственным файлам и файлам, которые он обслуживает, но не к другим данным, хранящимся на одном компьютере). Ограничение chroot заключается в том, что программа ограничена одним поддеревом: он не может получить доступ к независимым поддеревьям. Связующие крепления позволяют пересаживать другие поддеревья на это основное дерево.

Например, предположим, что машина запускает службу /usr /sbin /somethingd, которая должна иметь доступ только к данным в /var /lib /something. Наименьшее дерево каталогов, содержащее оба этих файла, - это корень. Как можно ограничиться службой? Одна из возможностей - сделать жесткие ссылки на все файлы, которые нужны службе (не менее /usr /sbin /somethingd и несколько разделяемых библиотек) в /var /lib /something , Но это громоздко (жесткие ссылки необходимо обновлять всякий раз, когда файл обновляется), и не работает, если /var /lib /something и /usr включены различные файловые системы. Лучшее решение - создать ad hoc root и заполнить его с помощью mounts:

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 /что-то 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. Связывание монтируется таким образом, что пространства имен могут быть заполнены гибкими способами. См. Создание процесса для чтения другого файла для того же имени файла для примера.

Запуск другого дистрибутива

Другим использованием 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 подключаются на более низком уровне, чем инфраструктура монтирования, mount nullfs или монтировка привязки файловой системы предоставляет каталоги, которые были скрыты за подписчиками в оригинале.

Например, предположим, что у вас есть файловая система tmpfs, установленная в /tmp. Если были созданы файлы под /tmp, когда была создана файловая система tmpfs, эти файлы могут оставаться, фактически недоступными, но занимающими дисковое пространство. Run

mount --bind //mnt

(Linux) или

mount -t nullfs //mnt

(FreeBSD), чтобы создать представление корневой файловой системы в /mnt. Каталог /mnt /tmp - этоодин из корневой файловой системы.

Экспорт NFS на разных путях

Некоторые серверы NFS (например, сервер NFS ядра Linux до NFSv4) всегда рекламируют фактическое местоположение каталога при экспорте каталога. То есть, когда клиент запрашивает server: /request /location, сервер обслуживает дерево по адресу /request /location. Иногда желательно разрешить клиентам запрашивать /request /location, но фактически обслуживать файлы в /actual /location. Если ваш сервер NFS не поддерживает обслуживание альтернативного местоположения, вы можете создать привязку привязки для ожидаемого запроса, например.

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

в /etc /exports и в /etc /fstab:

/фактическое /местоположение /запрос /привязка привязки местоположения

Побочные эффекты привязок привязок

Обход рекурсивных каталогов

Если вы используете привязку привязок, вам нужно позаботиться о приложениях, которые рекурсивно перемещаются по дереву файловой системы, например, резервные копии и индексирование (например, для создания найти базу данных).

Обычно привязки mount должны быть исключены из рекурсивных обходов каталога, так что каждое дерево каталогов проходит только один раз в исходном местоположении. С bindfs и nullfs настройте инструмент обхода, чтобы игнорировать эти типы файловой системы, если это возможно. Подключения Linux bind не могут быть распознаны как таковые: новое местоположение эквивалентно оригиналу. С монтированием Linux-подключений или с инструментами, которые могут только исключать пути, а не типы файловой системы, вам нужно исключить точки монтирования для монтирования привязок.

Обход, который останавливается на границах файловой системы (например, find -xdev, rsync -x, du -x, â € |) будет автоматически остановитесь, когда они столкнутся с точкой подключения bindfs или nullfs, поскольку эта точка монтирования является другой файловой системой. С монтированием Linux-подключений ситуация немного сложнее: есть граница файловой системы, только если монтировка привязки выполняет трансляцию другой файловой системы, а не если она пересаживает другую часть той же файловой системы.

Переход за пределы привязок

Связывание монтирует представление дерева каталогов в другом месте. Они выставляют одни и те же файлы, возможно, с разными настройками монтирования и (с привязкой bindfs) разные права собственности и разрешения. Файловые системы, представляющие измененное представление дерева каталогов, называются файловыми системами с надписью или стековыми файловыми системами . Существует много других файловых систем наложения, которые выполняют более сложные преобразования. Вот несколько общих. Если ваш желаемый вариант использования здесь не рассматривается, проверьте репозиторий файловых систем FUSE .

Фильтровать видимые файлы

  • clamfs - запускать файлы через антивирусный сканер при чтении
  • filterfs - скрыть части файловой системы
  • rofs - просмотр только для чтения. Подобно bindfs -r, немного более легкий.
  • Mount mounts - представляет несколько файловых систем (называемых ветвями ) под одним каталогом: если tree1 содержит foo и tree2 содержит bar, то их объединенный вид содержит как foo и bar. Новые файлы записываются в конкретную ветвь или в ветвь, выбранную в соответствии с более сложными правилами. Существует несколько реализаций этой концепции, в том числе:

    • aufs - реализация ядра Linux
    • funionfs - реализация FUSE
    • mhddfs - ПРЕДОСТЕРЕЖЕНИЕ, запись файлов в ветвь на основе свободного пространства
    • оверлей - реализация ядра Linux
    • unionfs-fuse - FUSE, с функциями кэширования и копирования на запись.

Изменение имен файлов и метаданных

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

Просмотр измененного содержимого файла

Изменить способ хранения содержимого

  • chironfs - реплицировать файлы на несколько базовых хранилищ (RAID-1 на уровне дерева каталогов )
  • copyfs - хранить копии всех версий файлов
  • encfs - шифрование файлов
  • pcachefs - уровень кэша на диске для медленных удаленных файловых систем.
  • simplecowfs - сохраняет изменения через предоставленное представление в памяти, оставляя исходные файлы неповрежденными
  • обратный путь - сохранить копии всех версий файлов
ответил Gilles 25 PMpSat, 25 Apr 2015 20:28:58 +030028Saturday 2015, 20:28:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132