Как стать автором
Обновить
Флант
DevOps-as-a-Service, Kubernetes, обслуживание 24×7

Как работает bind mount в Linux: руководство для начинающих

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров5.1K
Автор оригинала: Николас Хорхе Дато (Nicolás Jorge Dato)

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

Команды mount и umount используются для монтирования/размонтирования устройств в Linux. Однако существует и другой тип монтирования, называемый bind mount. В этом материале мы поговорим о том, что это такое, а также рассмотрим несколько примеров применения bind mount.

Пара слов о mount

Сначала вспомним, что делает команда mount. В системах на базе Linux она позволяет примонтировать устройство или директорию. В результате мы получаем доступ к файловой системе устройства. 

К примеру, примонтируем USB-накопитель /dev/sdc1 в /mnt/usb и выведем его содержимое:

$ mkdir /mnt/usb
$ mount /dev/sdc1 /mnt/usb
$ ls /mnt/usb
appendix.pdf pictures/

Видно, что на только что смонтированном USB-накопителе есть файл и директория. Вывести информацию обо всех точках монтирования в системе можно с помощью findmnt --real:

$ findmnt --real
TARGET			SOURCE	   	 FSTYPE		OPTIONS
/			    /dev/sda2	 ext4		rw,relatime
├─/home		    /dev/sdb1	 ext4		rw,relatime
├─/mnt/usb		/dev/sdc1	 vfat       rw,relatime,fmask=0022,dmask=0022,codepage=437,errors=remount-ro
└─/boot/efi		/dev/sda1	 vfat       rw,relatime,fmask=0022,dmask=0022,codepage=437,errors=remount-ro

Всего в системе примонтировано четыре устройства, включая USB-накопитель. У каждого устройства есть целевой каталог, из которого можно получить доступ к его файловой системе. Наконец, можно размонтировать USB-накопитель:

$ umount /dev/sdc1

Bind mount

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

В некотором смысле bind mount создаёт алиас. Например, если примонтировать /tmp/foo в /tmp/bar, обе директории будут ссылаться на одно и то же содержимое. Можно открывать файлы в /tmp/foo из /tmp/bar и наоборот. 

В качестве источника для bind mount можно использовать любую директорию. Если исходная директория является точкой монтирования устройства, то все устройство будет примонтировано к директории назначения. Если источник — поддиректория устройства, то будут примонтированы все директории, для которых эта поддиректория является родительской. 

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

После bind-монтирования теряется доступ к содержимому целевой директории. То же самое происходит при монтировании устройств. 

Создадим директорию /tmp/foo с несколькими файлами в ней:

$ mkdir /tmp/foo
$ touch /tmp/foo/bind_mount_example
$ touch /tmp/foo/baeldung

Теперь создадим директорию /tmp/bar и bind-примонтируем к ней директорию /tmp/foo:

$ mkdir /tmp/bar
$ mount --bind /tmp/foo /tmp/bar

Посмотрим содержимое обеих директорий:

$ ls -l /tmp/foo
total 0
-rw-r--r-- 1 baeldung users 0 Oct 30 19:26 baeldung
-rw-r--r-- 1 baeldung users 0 Oct 30 19:26 bind_mount_example
$ ls -l /tmp/bar
total 0
-rw-r--r-- 1 baeldung users 0 Oct 30 19:26 baeldung
-rw-r--r-- 1 baeldung users 0 Oct 30 19:26 bind_mount_example

Оно одинаково. Если создать файл в /tmp/bar, он появится и в /tmp/foo:

$ echo "new file" > /tmp/bar/new_file
$ cat /tmp/foo/new_file 
new file

С помощью findmnt --real можно вывести все точки монтирования, включая те, которые созданы bind mount:

$ findmnt --real
TARGET         SOURCE                 FSTYPE     OPTIONS
/              /dev/sda2              ext4       rw,relatime
├─/home        /dev/sdb1              ext4       rw,relatime
├─/boot/efi    /dev/sda1              vfat       rw,relatime,fmask=0022,dmask=0022,codepage=437,errors=remount-ro
└─/tmp/bar     /dev/sda2[/tmp/foo]    ext4       rw,relatime

Наконец, давайте отмонтируем /tmp/bar:

$ umount /tmp/bar

Варианты использования

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

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

При монтировании устройства в директорию её содержимое скрывается точкой монтирования. То есть обычным способом получить доступ к нему не получится. Однако, как мы узнали из предыдущего раздела, bind mount не монтирует дочерние точки монтирования из исходной директории. Эту особенность можно использовать для доступа к скрытым файлам. 

Предположим, что есть директория /mnt/usb и мы ещё не успели примонтировать в неё USB-устройство. Создадим в ней файл:

$ echo baeldung > /mnt/usb/hidden_file_example
$ ls /mnt/usb
hidden_file_example

Затем подключим USB-накопитель — файл hidden_file_example больше не виден:

$ mount /dev/sdc1 /mnt/usb
$ ls /mnt/usb
appendix.pdf pictures/

Получить доступ к нему можно с помощью bind-монтирования. Для этого создадим директорию /tmp/oldmnt, а затем примонтируем в неё /mnt:

$ mkdir /tmp/oldmnt
$ mount --bind /mnt /tmp/oldmnt

Исходное содержимое /mnt/usb появится в /tmp/oldmnt/usb:

$ ls /tmp/oldmnt/usb
hidden_file_example
$ cat /tmp/oldmnt/usb/hidden_file_example 
baeldung

Обратите внимание, что мы выполнили bind mount директории /mnt. Как уже говорилось, --bind игнорирует только дочерние точки монтирования. Если бы мы примонтировали /mnt/usb, в /tmp/oldmnt появилось бы содержимое USB-накопителя. В завершение давайте отмонтируем /mnt/usb и /tmp/oldmnt:

$ umount /mnt/usb /tmp/oldmnt

Доступ к файлам за пределами chroot-окружения

Другой пример использования bind mount — монтирование директорий в chroot-окружениях. chroot обеспечивает ограниченную изоляцию процессов, устанавливая корневую директорию для процесса. Например, можно сделать так, чтобы httpd считал /home/apache корневой директорией /. В этом случае /home/apache/www превратится в /www, при этом у httpd не будет доступа к файлам за пределами /home/apache

Возникает вопрос: как процессу, который работает в chroot-окружении, получить доступ к файлам за его пределами? Например, ему могут понадобиться библиотеки из /lib64 и исполняемые файлы из /bin. Bind mount решает эту проблему — с его помощью к этим директориям можно получить доступ из chroot-окружения. В качестве примера создадим директорию /home/chroot и две дочерние директории, bin и lib64, в ней:

$ mkdir /home/chroot
$ mkdir /home/chroot/bin
$ mkdir /home/chroot/lib64

Теперь bind-примонтируем /bin к /home/chroot/bin, а /lib64 — к /home/chroot/lib64:

$ mount --bind /bin /home/chroot/bin
$ mount --bind /lib64 /home/chroot/lib64

Наконец, изменим корневую директорию на /home/chroot:

$ chroot /home/chroot

Получим оболочку с /home/chroot в качестве корневой директории. Выведем её содержимое:

$ ls -l / 
total 16
drwxr-xr-x 2 0 0  4096 Oct 29 21:47 bin
drwxr-xr-x 8 0 0 12288 Oct 29 17:02 lib64
$ ls -l /bin/bash
-rwxr-xr-x 1 0 0 1218032 May  5 16:37 /bin/bash
$ ls -l /lib64/libc-*.so   
-rwxr-xr-x 1 0 0 2173576 Aug 17 20:03 /lib64/libc-2.33.so

Видно, что мы внутри chroot-окружения и имеем доступ только к /bin и /lib64 и их содержимому.

Заключение

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

P. S.

Читайте также в нашем блоге:

Теги:
Хабы:
+21
Комментарии0

Публикации

Информация

Сайт
flant.ru
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Александр Лукьянов