Этот ответ и сообщение электронной почты указывает, что нечто под названием "OverlayFS" доступно в Ubuntu 11.10 и принудительно заменит aufs в Ubuntu 12.04.

Как мне это использовать? Где его документация?

66
muru 13 Окт 2017 в 07:08
4
Ты и я оба, брат. До сих пор я сталкивался с этим: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Кроме того, я невежественный. Я работаю с ним в живой системе, но мне пока не удалось заставить его работать. Хотел бы я точно знать, что означают «upperdir» и «lowerdir». Я ничего не нашел.
 – 
Chuck R
2 Мар 2012 в 20:17

5 ответов

Лучший ответ

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

Наконец-то мне удалось его найти. Я нашел ссылки на него в исходниках ядра, но по какой-то причине он не отображается в дереве git на kernel.org. Но! Если вы вытащите исходный код ядра Ubuntu следующим образом: apt-get source linux-image-3.0.0-16-generic вы можете найти его в linux-3.0.0/Documentation/overlayfs.txt. Он также доступен в пакете linux-doc в /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Поскольку фактическая справочная документация больше посвящена тому, «как это работает», а не «как с ним монтировать», вот краткое изложение (в документации ядра есть один пример):

mount -t overlayfs -o [mount options] overlayfs [mountpoint for merged system]

Где [параметры монтирования] могут быть:

  • lowerdir=somedir: нижний каталог — это каталог, в который вы собираетесь поместить свою новую файловую систему, если есть дубликаты, они будут перезаписаны (фактически, скрыты в пользу) версии верхнего каталога.
  • upperdir=somedir: upperdir — это каталог, на который вы хотите наложить нижний каталог. Если в нижнем и верхнем каталогах существуют повторяющиеся имена файлов, версия верхнего каталога имеет приоритет.
  • стандартные варианты крепления. Единственный, который я видел из кода, это ro/rw, но вы можете поэкспериментировать.

Одна вещь, которая сначала смутила меня, поэтому я, вероятно, должен уточнить, что монтирование overlayfs на самом деле не монтирует файловую систему. Я пытался смонтировать файловую систему squashfs с помощью монтирования overlayfs, но это не так. Сначала вы должны смонтировать файловую систему (в моем случае squashfs) в произвольный каталог, а затем использовать overlayfs для объединения точки монтирования (каталога) и другого каталога в третичный каталог (точка монтирования overlayfs) (редактировать: этот «третичный» каталог на самом деле может быть каталог upperdir=). В третичном каталоге вы увидите объединенные файловые системы (или деревья каталогов — это гибко).

Пример 1, наложение корневой файловой системы

Я работал над гибридным загрузочным диском Ubuntu, где базовая система Ubuntu существует как filesystem.squashfs, и у меня есть файлы с именами ubuntu.overlay, kubuntu.overlay, xubuntu.overlay и lubuntu.overlay. Файлы .overlay представляют собой базовые установки указанных систем с обрезанным содержимым файловой системы filesystem.squashfs (для экономии места). Затем я изменил сценарии инициализации, чтобы наложить правильный файл .overlay дистрибутива (из параметра загрузки), используя overlayfs и указанные выше параметры, и это работает как шарм!

Это строки, которые я использовал в своих сценариях инициализации (после перевода всех переменных):

mkdir -p /overlay
mount -t squashfs /cdrom/casper/ubuntu.overlay /overlay
mount -t overlayfs -o lowerdir=/filesystem.squashfs,upperdir=/overlay overlayfs /

Обратите внимание, что указанный выше файл system.squashfs представляет собой каталог, созданный casper, а не файл.

Эти три оператора создают каталог /overlay, монтируют файловую систему squashfs в каталог /overlay, а затем используют OverlayFS для существенного слияния содержимого /overlay с /.

Пример 2, прозрачное объединение двух каталогов

В процессе пересборки живого USB для каждого релиза я использую OverlayFS, чтобы сэкономить кучу времени. Я начинаю с каталога под названием ubuntu-base, который содержит содержимое образа ubuntu-core, который является самой простой установкой. Затем я создам каталоги с именами ubuntu, kubuntu, lubuntu и xubuntu.

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

mount -t overlayfs -o lowerdir=ubuntu-base,upperdir=kubuntu overlayfs kubuntu

Это заставляет файлы из базы ubuntu отображаться в папке kubuntu. Затем я могу chroot перейти в папку kubuntu и сделать что-то вроде apt-get install kubuntu-desktop. Любые изменения, сделанные во время этого монтирования OverlayFS, останутся в верхнем каталоге, в данном случае в папке kubuntu. Затем, как только я размонтирую OverlayFS, файлы, которые действительно существуют в базе ubuntu, но «отражены» в папке kubuntu, исчезают, если они не были изменены. Это избавляет меня от необходимости иметь несколько копий файлов в базе Ubuntu, но при этом иметь возможность использовать их так, как если бы они физически существовали в каждом месте.

73
Seth 8 Янв 2022 в 07:54
3
"но по какой-то причине он не отображается в дереве git на kernel.org" - Это потому, что overlayfs не находится в основной ветке разработки ядра, как и aufs (и никогда не будет) . Такие объединенные файловые системы интегрируются командой ядра Ubuntu.
 – 
MestreLion
19 Май 2012 в 17:18
2
OverlayFS, по-видимому, проникает в ядро ​​​​3.10.
 – 
David C. Bishop
17 Мар 2013 в 07:57
9
Наконец, следует перейти в 3.18 lwn.net/Articles/617099.
 – 
Rmano
20 Окт 2014 в 17:12
5
@Rmano: на моей машине это работает только с overlay, а не с overlayfs
 – 
Janus Troelsen
6 Апр 2015 в 17:33
1
Спасибо @austinmarton, я тоже нашел это некоторое время назад, и Тотти рассказал об этом ниже, прежде чем я обновил свой ответ, поэтому я отдал должное его ответу вверху моего.
 – 
Chuck R
8 Апр 2016 в 09:11

Из https://www.kernel.org/doc/Documentation/filesystems/overlayfs. текст:

Верхний и нижний

Оверлейная файловая система объединяет две файловые системы — «верхнюю» файловую систему и «нижнюю» файловую систему. Когда имя существует в обеих файловых системах, объект в «верхней» файловой системе виден, в то время как объект в «нижней» файловой системе либо скрыт, либо, в случае каталогов, объединен с «верхним» объектом.

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

Нижняя файловая система может быть любой файловой системой, поддерживаемой Linux, и не обязательно быть доступной для записи. Нижняя файловая система может быть даже другим overlayfs. Верхняя файловая система обычно доступна для записи, и если это так, она должна поддерживать создание расширенных атрибутов trust.* и должна предоставлять действительный d_type в ответах readdir, поэтому NFS не подходит.

Наложение только для чтения двух файловых систем только для чтения может использовать любой тип файловой системы.

Справочники

Наложение в основном включает каталоги. Если заданное имя появляется как в верхней, так и в нижней файловых системах и ссылается на не-каталог в любой из них, то нижний объект скрыт — имя относится только к верхнему объекту.

Если и верхний, и нижний объекты являются каталогами, создается объединенный каталог.

Во время монтирования два каталога, указанные как параметры монтирования «нижний каталог» и «верхний каталог», объединяются в объединенный каталог:

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

«Рабочий каталог» должен быть пустым каталогом в той же файловой системе, что и верхний каталог.

Затем всякий раз, когда запрашивается поиск в таком объединенном каталоге, поиск выполняется в каждом фактическом каталоге, а объединенный результат кэшируется в dentry, принадлежащей оверлейной файловой системе. Если оба фактических поиска находят каталоги, сохраняются оба и создается объединенный каталог, в противном случае сохраняется только один: верхний, если он существует, иначе нижний.

Объединяются только списки имен из каталогов. О другом содержимом, таком как метаданные и расширенные атрибуты, сообщается только для верхнего каталога. Эти атрибуты нижнего каталога скрыты.

27
Anwar 16 Авг 2017 в 08:57
4
Спасибо за разъяснение по workdir. Это было довольно недавнее изменение, и по какой-то причине я так и не смог найти документацию о том, что на самом деле делает «workdir». Его не было и в справке по ядру в прошлый раз, когда я смотрел. Добавляет слой путаницы в overlayfs IMO, хотелось бы, чтобы новые версии можно было использовать без него - это как бы портит мой рабочий процесс.
 – 
Chuck R
27 Окт 2015 в 16:58
2
Я прочитал это, так как мне сказали, что в нем есть разъяснение о том, что такое рабочий каталог. Но не видеть ни одного. (находится только в резервном хранилище для кеша, о котором вы говорите? Так что его можно удалить, когда ФС отключена, но поможет производительность? Или он содержит первичные данные?)
 – 
ctrl-alt-delor
17 Фев 2020 в 20:36

Я расширил эти статьи, включив в них скрипт для оверлейных файлов, который настраивает корневую файловую систему только для чтения.

Надеюсь, это поможет.

7
Floyd42 22 Апр 2012 в 16:16
1
Благодаря работе, которую проделали другие, мы с Дастином добавили банарный пакет с именем overlayroot в Quantal, который является частью cloud-initramfs-tools с исходным кодом. См. документацию по использованию в /etc/overlayroot.conf
 – 
smoser
31 Июл 2012 в 18:37

Монтирование OverlayFS в fstab

Вышеприведенные ответы объяснили, как смонтировать оверлейную файловую систему из строки cmd и/или скрипта. Также можно смонтировать OverlayFS из fstab.

Существует неотъемлемая проблема с монтированием OverlayFS. Поскольку мы монтируем каталоги, эти каталоги должны быть в наличии и/или готовы. Присутствует означает, что файловая система, в которой находится конкретный каталог, уже смонтирована, а готовность означает, что конкретный каталог «заполнен». Примером более позднего является монтирование ISO-образа в определенный каталог или монтирование сетевого ресурса (любого типа).

Смонтировать каталог, которого нет, не удастся, в то время как смонтировать еще не «заполненный» каталог не удастся, так как OverlayFS не может узнать, готов ли каталог.

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

Однако, если дистрибутив Linux использует systemd, то монтирование файловых систем выполняется им. Systemd читает файл fstab и создает модули монтирования на лету. После этого все монтирование обрабатывается systemd. Файлы юнитов systemd имеют параметры: require, after, before, которые можно использовать для управления порядком и зависимостью монтирований, определенных в fstab, таким образом гарантируя, что монтирование OverlayFS не завершится ошибкой (по крайней мере, из-за неправильного порядка).

Чтобы установить порядок/зависимость монтирования в файле fstab, мы объявим параметр systemd «require», используя синтаксис: x-systemd.require. Аргументом в пользу этой опции является точка монтирования монтирования, которая должна быть успешно смонтирована до данного монтирования (определяется в fstab).

Примере:

Чтобы показать пример (и синтаксис записей fstab), мы покажем случай, когда мы будем накладывать каталог, на который смонтирован iso-образ, в то время как этот конкретный файл образа будет храниться на отдельном жестком диске, который будет должны быть смонтированы, прежде чем мы получим доступ к файлу образа. Таким образом формируется требуемый порядок событий:

mount hdd -> mount iso image -> mount OverlayFS

Для данного случая записи fstab будут выглядеть так:

# 1. mount hdd partition
# 2. mount iso image from hdd partition, but only if/after hdd is mounted
# 3. overlay iso image, but only if/after iso image is mounted
#
/dev/hdb1            /mnt/hdd      ext4     errors=remount-ro                 0  2  
/mnt/hdd/linux.iso   /mnt/iso      auto     x-systemd.requires=/mnt/hdd,ro    0  0
overlay              /mnt/merged   overlay  x-systemd.requires=/mnt/iso,lowerdir=/mnt/iso,upperdir=/overlay/lower,workdir=/overlay/working  0 0
                                                                            

Если какие-либо монтирования в цепочке завершатся неудачей, зависимые монтирования не будут выполняться.

Заметка:

На Вики Arch Linux есть пример использования fstab для монтирования OverlayFS, в котором используются следующие параметры:

noauto,x-systemd.automount

Это приведет к тому, что оверлейная файловая система будет просто не смонтирована во время загрузки (опция noauto), что позволит избежать возможного сбоя, если предыдущие монтирования не были выполнены. готов. При первом доступе к каталогу оверлея файловая система будет смонтирована (параметр x-systemd.automount). У этого подхода есть два недостатка:

  1. Если необходимые нижние/верхние каталоги не готовы, это монтирование завершится ошибкой.
  2. Смонтировать удастся, даже если нижние/верхние каталоги не заполнены (например, ISO не смонтирован)

Мы можем избежать этого позже, добавив x-systemd.require в список опций.

2
ksk0 29 Июн 2021 в 17:51

Пример минимального запуска

# Create the filesystems.
dd if=/dev/zero of=lower.ext4 bs=1024 count=102400
mkfs -t ext4 lower.ext4
cp lower.ext4 upper.ext4
mkdir lower upper overlay
sudo mount lower.ext4 lower
sudo mount upper.ext4 upper
sudo chown "$USER:$USER" lower upper
printf lower-content > lower/lower-file
# Upper and work must be on the same filesystem.
mkdir upper/upper upper/work
printf upper-content > upper/upper/upper-file
# Work must be empty. E.g. this would be bad:
#printf work-content > upper/work/work-file
# Make the lower readonly to show that that is possible:
# writes actually end up on the upper filesystem.
sudo mount -o remount,ro lower.ext4 lower

# Create the overlay mount.
sudo mount \
  -t overlay \
  -o lowerdir=lower,upperdir=upper/upper,workdir=upper/work \
  none \
  overlay \
;

# Interact with the mount.
printf 'overlay-content' > overlay/overlay-file
ls lower upper/upper upper/work overlay

# Write to underlying directories while mounted
# gives undefined behaviour.
#printf lower-content-2 > lower/lower-file-2
#printf upper-content-2 > upper/upper-file-2

# Unmount the overlay and observe state.
sudo umount overlay
ls lower upper/upper upper/work

# Cleanup.
sudo umount upper lower

GitHub upstream.

Вывод первого ls с монтированием:

lower:
lost+found  lower-file

overlay:
lost+found  lower-file  overlay-file  upper-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Вывод второго ls без крепления:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Толкование:

  • нижний: не изменился после записи в оверлей
  • верхний: получил модификацию наложения
  • наложение: показывает файлы как с верхнего, так и с нижнего
  • work: содержит некоторый случайный контент (каталог work/), который нас не должен волновать

Пример взят из: Пример использования OverlayFS

Вот более сложный пример с несколькими нижними уровнями: >Overlayfs перезагружается с несколькими слоями (миграция от aufs)

Проверено на Ubuntu 18.04, ядро ​​Linux 4.15.0.

5
Ciro Santilli 新疆再教育营六四事件法轮功郝海东 13 Окт 2018 в 17:25