Как мне использовать OverlayFS?

54

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

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

ændrük
источник
1
Ты и я оба, брат. Я сталкивался с этим до сих пор mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Помимо этого я невежественен. Я работаю с ним в живой системе, но мне пока не удалось заставить его работать. Хотелось бы мне узнать, что именно означают «upperdir» и «lowerdir». Я ничего не нашел
Чак Р

Ответы:

63

Изменить: После написания этого ответа некоторые вещи изменились в overlayfs, а именно добавление обязательного параметра workdir, см . Ответ Totti ниже для подробного описания этого нового параметра.

Мне наконец удалось найти это. Я нашел ссылки на него в исходном коде ядра, но по какой-то причине он не отображается в дереве 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: lowerdir - это каталог, в который вы собираетесь заложить свою новую файловую систему, если есть дубликаты, которые перезаписываются (на самом деле, скрыты в пользу) версии upperdir
  • upperdir = somedir: upperdir - это каталог, с которым вы хотите наложить lowdir. Если дублирующиеся имена файлов существуют в lowerdir и upperdir, версия upperdir имеет приоритет.
  • стандартные варианты крепления. Единственное, что я видел из кода, это ro / rw, но вы можете поэкспериментировать.

Поначалу меня смутила одна вещь, поэтому я должен пояснить, что монтирование оверлеев фактически не монтирует файловую систему. Я пытался смонтировать файловую систему squashfs с помощью монтирования overlayfs, но это не так. Сначала вы должны смонтировать (в моем случае squashfs) файловую систему в произвольный каталог, а затем использовать overlayfs для объединения точки монтирования (каталога) и другого каталога в третичный каталог (точку монтирования overlayfs) (edit: этот «третичный» каталог) на самом деле может быть каталогу 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 /

Обратите внимание, что файл filesystem.squashfs выше - это каталог, созданный casper, а не файл.

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

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

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

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

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

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

Чак Р
источник
3
«но по какой-то причине он не появляется в дереве git на kernel.org» - это потому, что overlayfs не в ядре upstream, как aufs (и никогда не будет). Такие объединенные файловые системы интегрированы Ubuntu Kernel Team.
MestreLion
2
OverlayFS, очевидно, входит в ядро ​​3.10.
Дэвид С. Епископ
8
Наконец, следует зайти в 3.18 lwn.net/Articles/617099
Rmano
4
@Rmano: на моей машине это работает только с overlayне сoverlayfs
Янус Троелсен
1
Спасибо @austinmarton, я тоже нашел это некоторое время назад и полностью изложил это ниже, прежде чем обновил свой ответ, поэтому я отдал должное его ответу наверху.
Чак Р
20

С https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt :

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

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

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

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

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

Справочники

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

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

Во время монтирования две директории, указанные как опции монтирования «lowerdir» и «upperdir», объединяются в объединенную директорию:

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

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

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

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

Тотти
источник
4
Спасибо за разъяснения по workdir. Это было довольно недавним изменением, и по какой-то причине я так и не смог найти документацию о том, что на самом деле сделал «рабочий каталог». Это не было в справке ядра или в прошлый раз, когда я смотрел. Добавляет слой путаницы в оверлейные функции IMO, если бы новые версии могли использоваться без него - это как бы портит мой рабочий процесс.
Чак Р
7

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

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

Floyd42
источник
1
Благодаря работе, которую проделали другие, мы с Дастином добавили банальный пакет с именем 'overlayroot' в количественный, который является частью исходного пакета cloud-initramfs-tools . Смотрите документацию по использованию в /etc/overlayroot.conf
smoser
2

Минимальный исполняемый пример

# 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 вверх по течению .

Выход первого 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/каталог), о котором мы не должны заботиться

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

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

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

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник