Что такое связывание, монтируются?

Вы могли бы попробовать mirrordir. Я использовал его для тиражирования моей целой установки от одного раздела до другого и назад несколько раз только с небольшой проблемой. Тем не менее необходимо было бы поместить что-то загрузочное на целевую систему прежде, чем перезаписать его со скопированной системой или удостовериться, что загрузчик настроен для "установки", которую Вы просто сделали. Как "все - файл", Вы можете пойти этим путем, но не копируете домашних директоров, Mirrordir имеет некоторые переключатели для исключения некоторых отличных путей. Знайте, что Вы могли бы неявно удалить файлы в целевой системе, потому что они не находятся на источнике!

Описание mirrordir:

mirrordir forces the mirror directory to be an exact replica of the control
directory tree in every possible detail suitable for purposes of timed
backup. Files whose modification times or sizes differ are copied. File
permissions, ownerships, modification times, access times, and sticky bits 
are duplicated. Devices, pipes, and symbolic and hard links are duplicated. 
Files or directories that exist in the mirror directory that don't exist in
the control directory are deleted. It naturally descends into subdirectories 
to all their depths. mirrordir tries to be as efficient as possible by 
making the minimal set of changes necessary to mirror the directory. 

(Это описание заимствовано из http://www.debianhelp.co.uk/debianutilities3.htm),

Если Вы используете mirrordir: будьте осторожны. Это очень мощно.

346
25.04.2015, 20:28
2 ответа

Что такое bind mount?

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

Например, после выполнения команды 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 /, где появляется под / else /, где как изменение соответствующего каталога.

Bindfs может изменять некоторые метаданные файла: он может показывать поддельные разрешения и права собственности на файлы. См. Подробности в руководстве и примеры ниже.

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

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

В отличие от FUSE bindfs, который действует на уровне дерева каталогов, nullfs FreeBSD действует глубже в ядре, поэтому точки монтирования в / else /, где не видны: только дерево, которое является частью той же точки монтирования, что и / some /, где отражается в / 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 /, где - это не раздел диска, как в случае файловой системы на диске, а существующий каталог.Точка монтирования / else /, где , как обычно, должна быть существующим каталогом. Обратите внимание, что тип файловой системы не указан в любом случае: создание привязки при монтировании не требует использования драйвера файловой системы, она копирует структуры данных ядра из исходного монтирования.

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

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

В старых ядрах (я не знаю точно, когда, думаю, до версии 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 позволяет объявлять монтирования как shared , ] подчиненный , частный или несвязываемый . Это влияет на то, отражается ли эта операция монтирования в привязке, которая реплицирует точку монтирования. Дополнительные сведения см. В документации ядра .

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

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

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

Я не могу заставить работать привязанных маунтов!

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

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

chroot jail или контейнер запускает процесс в поддереве дерева каталогов системы. Это может быть полезно для запуска программы с ограниченным доступом, например запускать сетевой сервер с доступом только к его собственным файлам и файлам, которые он обслуживает, но не к другим данным, хранящимся на том же компьютере). Ограничение 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. Привязки - это способ гибкого заполнения пространств имен. См. В качестве примера Как заставить процесс читать другой файл с тем же именем .

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

Еще одно использование chroot - установка другого дистрибутива в каталог и запуск из него программ, даже если им требуются файлы по жестко заданным путям, которые отсутствуют или имеют другое содержимое на базе система. Это может быть полезно, например, для установки 32-битного дистрибутива в 64-битной системе, которая не поддерживает смешанные пакеты, для установки более старых выпусков дистрибутива или других дистрибутивов для проверки совместимости, для установки более нового выпуска для тестирования. новейшие функции при сохранении стабильной базовой системы и т. д. См. Как запустить 32-битные программы в 64-битном Debian / Ubuntu? для примера в Debian / Ubuntu.

Предположим, что у вас есть установка последних пакетов вашего дистрибутива в каталоге / f / unstable , где вы запускаете программы, переключаясь в этот каталог с помощью chroot / f / unstable . Чтобы сделать домашние каталоги доступными из этих установок, привяжите их к chroot:

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

Программа schroot делает это автоматически.

Доступ к файлам, скрытым за точкой монтирования

Когда вы монтируете файловую систему в каталог, это скрывает то, что находится за каталогом. Файлы в этом каталоге становятся недоступными, пока каталог не будет размонтирован. Поскольку BSD nullfs и Linux bind mounts работают на более низком уровне, чем инфраструктура монтирования, монтирование nullfs или bind монтирования файловой системы открывает каталоги, которые были скрыты за вспомогательными модулями в оригинале.

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

mount --bind / /mnt

(Linux) или

mount -t nullfs / /mnt

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

NFS экспортирует по разным путям

Некоторые серверы NFS (например, NFS-сервер ядра Linux до NFSv4) всегда объявляют фактическое местоположение каталога при экспорте каталога. То есть, когда клиент запрашивает сервер: / запрошено / местоположение , сервер обслуживает дерево в местоположении / запрошено / местоположение . Иногда желательно разрешить клиентам запрашивать / 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 ,но приложение, использующее файл , расширяет символические ссылки и отклоняет / some / where / is / my / file . Bind mount может обойти это: bind-mount / some / where / is / my to / else / where / is / my , а затем realpath сообщит, что / else / where / is / my / file находится в / else / where , а не в / some / where .

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

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

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

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

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

Выходя за рамки монтирования привязки

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

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

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

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

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

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

Изменение способа хранения контента

  • chironfs - репликация файлов на несколько базовых хранилищ ( RAID-1 на уровне дерева каталогов )
  • copyfs - хранить копии всех версий файлов
  • encfs - шифровать файлы
  • pcachefs - слой кеширования на диске для медленных удаленных файловых систем
  • simplecowfs - сохранить изменения с помощью предоставленного представления в памяти, оставив исходные файлы нетронутыми
  • обратный путь - сохранить копии всех версий файлов
611
27.01.2020, 19:26

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

0
27.01.2020, 19:26

Теги

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