Псевдо-файловая система OverlayFS была впервые включена в релиз 3.18 ядра Linux: она позволяет объединять два дерева каталогов или файловых систем (“верхнее” и “нижнее”) совершенно прозрачно для пользователя, который может обращаться к файлам и каталогам на “объединенном” уровне точно так же, как и на стандартной файловой системе.
В этом руководстве мы изучим основные концепции OverlayFS и увидим демонстрацию ее использования.
В этом руководстве вы узнаете:
- Основные концепции OverlayFS
- Как объединить две файловые системы с помощью OverlayFS
Введение
Все мы должны быть знакомы со стандартным поведением ядра Linux при монтировании файловой системы: файлы и каталоги, существующие в каталоге, используемом в качестве точки монтирования, маскируются и становятся недоступными для пользователя, в то время как файлы, существующие в смонтированной файловой системе, отображаются.
Доступ к исходным файлам можно получить только после размонтирования файловой системы.
Это также происходит тогда, когда мы монтируем несколько файловых систем в одном каталоге.
Когда используется псевдо-файловая система OverlayFS, вместо этого файлы, существующие на разных слоях, объединяются, и результирующая файловая система может быть смонтирована самостоятельно.
OverlayFS обычно используется в системах, работающих на встроенных устройствах, таких как OpenWRT, где полезно сохранять базовый набор конфигураций и в то же время позволять пользователю выполнять модификации.
OverlayFS также лежит в основе драйверов хранения “overlay” и “overlay2” Docker.
Что происходит при удалении файла или каталога?
Если удаляемый файл принадлежит верхнему слою, то он удаляется на месте; если же он принадлежит нижнему слою, то удаление имитируется с помощью файла whiteout (или непрозрачного каталога – каталога с расширенным атрибутом trusted.overlay.opaque), который создается в слое с возможностью записи и заслоняет исходный элемент.
OverlayFS является основой драйверов Docker overlay и overlay2.
В такой реализации нижний, доступный только для чтения, слой представлен образами; верхний, доступный для записи, представлен контейнерами на их основе.
Образы неизменяемы: все изменения происходят внутри контейнеров и теряются при их удалении (именно поэтому для сохранения данных используются тома).
Использование OverlayFS
Давайте посмотрим, как использовать OverlayFS.
Для данного примера я предположу, что мы хотим объединить две файловые системы: нижнюю, существующую на разделе /dev/sda1, и ту, которая будет использоваться в режиме чтения-записи, на разделе /dev/sda2.
Первое, что мы хотим сделать, это создать каталоги, которые мы будем использовать в качестве точек монтирования:
$ sudo mkdir /lower /overlay
Теперь смонтируем файловую систему /dev/sda1 в каталоге /lower в режиме только для чтения:
$ sudo mount -o ro /dev/sda1 /lower
Команда ls показывает, что файловая система содержит только один файл:
$ ls -l /lower total 20 -rw-r--r--. 1 root root 23 Sep 1 10:43 file1.txt drwx------. 2 root root 16384 Sep 1 10:40 lost+foun
Файлы содержат всего одну строку:
$ cat /lower/file1.txt this is the first line
Теперь давайте продолжим.
В качестве следующего шага мы смонтируем файловую систему /dev/sda2 в каталог /overlay:
$ sudo mount /dev/sda2 /overlay
Когда файловая система смонтирована, мы создаем на ней две директории: upper и work.
В первой будут храниться файлы, являющиеся частью верхнего слоя, вторая будет использоваться для подготовки файлов при переходе с одного слоя на другой: она должна быть пустой и находиться в той же файловой системе, что и верхняя:
$ sudo mkdir /overlay/{upper,work}
Теперь мы можем “собрать” и смонтировать оверлей.
Для выполнения этой задачи мы используем следующую команду:
$ sudo mount overlay -t overlay -o lowerdir=/lower,upperdir=/overlay/upper,workdir=/overlay/work /media
Мы вызвали mount, передав “overlay” в качестве аргумента опции -t (сокращение от –types), тем самым указав тип файловой системы, которую мы хотим смонтировать (в данном случае псевдо-файловую систему), затем мы использовали флаг -o для перечисления опций монтирования: в данном случае “lowerdir”, “upperdir” и “workdir”, чтобы указать: каталог, в который монтируется файловая система только для чтения, каталог, содержащий файлы верхнего, записываемого слоя, и расположение “рабочего” каталога, соответственно. Наконец, мы указали точку монтирования для “объединенной” файловой системы: /media, в данном случае.
С помощью команды mount мы можем просмотреть сводную информацию о настройке оверлея:
$ mount | grep -i overlay overlay on /media type overlay (rw,relatime,seclabel,lowerdir=/lower,upperdir=/overlay/upper,workdir=/overlay/work)
Если мы перечислим файлы в каталоге /media, то увидим, что существует только файл file1.txt, который, как мы знаем, принадлежит нижнему уровню:
$ ls -l /media total 20 -rw-r--r--. 1 root root 23 Sep 1 10:43 file1.txt drwx------. 2 root root 16384 Sep 1 10:40 lost+found
Теперь давайте попробуем добавить строку в файл и посмотрим, что произойдет:
$ echo "this is the second line" | sudo tee -a /media/file1.txt
Если мы проверим содержимое файла, то увидим, что строка была добавлена успешно:
$ cat /media/file1.txt this is the first line this is the second line
Однако оригинальный файл file1.txt не был изменен:
$ cat /lower/file1.txt this is the first line
IВместо этого в верхний слой был добавлен файл с тем же именем:
$ ls -l /overlay/upper -rw-r--r--. 1 root root 47 Sep 1 14:36 file1.txt
Теперь, если мы удалим файл /media/file1.txt, /overlay/upper/file1.txt станет таким файлом whiteout :
$ sudo rm /media/file1.txt $ ls -l /overlay/upper c---------. 2 root root 0, 0 Sep 1 14:45 file1.txt
Как указано в официальной документации, файл whiteout является символьным устройством (это отражено в выводе ls – см. выделенную ведущую “c”) с номером устройства 0/0.
Заключение
В этом руководстве мы поговорили о OverlayFS: мы узнали основные концепции ее использования, увидели, как она может быть использована для объединения двух файловых систем или деревьев каталогов, и каковы некоторые из возможных случаев ее использования.
Наконец, мы увидели, как на самом деле создать установку OverlayFS на Linux.
см. также:
- 🐳 Что такое Docker без root (rootless)?
- Как найти эксплойты Linux по версии ядра
- 🐳 Как анализировать и исследовать содержимое образов Docker
- 🐳 3 довольно неизвестных команды Docker, которые помогут вам в самых различных ситуациях