Могу ли я использовать образ файловой системы с правами на чтение и запись в качестве верхнего каталога OverlayFS?

Вопрос или проблема

Можно ли присоединить существующий образ диска, содержащий корневую файловую систему, к upperdir монтирования overlayfs для доступа на запись?

Я пытаюсь присоединить несколько старых образов дисков к директории /tmp/ на машине с Ubuntu 16.04, используя уже существующие скрипты (изначально написанные на Ubuntu 12.04 и перенесенные на 14.04).

Старые скрипты автоматизации использовали overlayfs для создания и соединения записываемых образов дисков ext2/3 поверх образов squashfs — нечто вроде этого:

cd /tmp
mkdir lower upper union
losetup /dev/loop1 /tmp/image.sfs
losetup /dev/loop2 /tmp/image.ext2
mount -t squashfs -o ro /dev/loop1 /tmp/lower
mount -t ext2 -o rw /dev/loop2 /tmp/upper
mount -t overlayfs -o rw,lowerdir=/tmp/lower,upperdir=/tmp/upper overlayfs /tmp/union

Они использовались в последний раз на ядре версии 3.x (вероятно, до 3.18), и этот метод, похоже, больше не работает. Теперь для overlay требуется опция workdir — например:

mount -t overlay -o rw,lowerdir=/tmp/lower,upperdir=/tmp/upper,workdir=/tmp/work overlay /tmp/union

Вопрос: Можно ли изменить скрипты автоматизации таким образом, чтобы монтировать и использовать существующие образы в записываемом состоянии на ядре 4.x? Могу ли я избежать их переформулирования, чтобы содержать такие директории как root и work? В некоторых случаях это может нарушить их использование в других местах.

Согласно документации, workdir должен быть пустым каталогом в той же файловой системе, что и upperdir для обеспечения атомарной записи. Это звучит так, будто невозможно соединить образы корневой файловой системы как читаемо-записываемые. workdir должен существовать внутри образов (отдельно от их каталога данных), что невозможно в образе корневой файловой системы.

Я рассматривал возможность загрузить стандартный Ubuntu 14.04 в виртуальной машине для нескольких однократных операций, но это не долгосрочное решение.


Лучший пока что вариант:

Единственное решение, которое я придумал, чтобы избежать двойной записи одних и тех же данных на диск, состоит в том, чтобы монтировать оба образа как значения lowerdir, с upperdir и workdir, расположенными на монтировании tmpfs. Затем я могу использовать rsync для копирования изменений из локального размещения tmpfs в смонтированный образ ext2/3 после завершения автоматизированной записи и размонтирования объединения overlay — то есть:

mount -t overlay -o rw,lowerdir=/tmp/upper:/tmp/lower,upperdir=/tmp/tmpfs/root,workdir=/tmp/tmpfs/work overlay /tmp/union

...выполнить автоматизированные чтение/запись...

umount /tmp/union

...скопировать содержимое из /tmp/tmpfs/root в /tmp/upper...

Это строго ограничено доступной оперативной памятью, и это некрасивый хак, который нужно добавить ко всем скриптам автоматизации.

Создать дополнительный уровень вложенности в файле образа:

mkdir   /tmp/upper/upper
mkdir   /tmp/upper/work
mount -t overlay -o rw,lowerdir=/tmp/lower,upperdir=/tmp/upper/upper,workdir=/tmp/upper/work overlay /tmp/union

Ответ или решение

Вопрос: Можно ли использовать образ диска с файловой системой корня в режиме чтения-записи в качестве upperdir для OverlayFS?

Теория: OverlayFS — это файловая система, которая позволяет объединять две и более файловых систем, так что одна из них является базовой (lowerdir), а другая содержит изменения (upperdir). Основное назначение — это создание надстроек поверх неизменяемых файловых систем. В более новых версиях ядер Linux (начиная с 3.18) для работы OverlayFS требуется дополнительный параметр workdir, который должен находиться на одном файловом разделе с upperdir и быть пустым.

Пример: В системах с ядром версии 4.x, чтобы корректно использовать OverlayFS, необходимо придерживаться определенных требований. Ваши старые скрипты, рассчитанные на более ранние версии ядра, сначала монтируют SquashFS как lowerdir и Ext2/3 как upperdir, а затем пытаются объединить с помощью OverlayFS. На современных системах вам нужно дополнительно указать рабочую директорию workdir.

Решение в примере, предложенном вами, заключается в использовании временной файловой системы (tmpfs) для обеспечения нужной структуры, что неэффективно в долгосрочной перспективе из-за ограниченности свободного места в RAM.

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

mkdir /tmp/upper/upper
mkdir /tmp/upper/work
mount -t overlay -o rw,lowerdir=/tmp/lower,upperdir=/tmp/upper/upper,workdir=/tmp/upper/work overlay /tmp/union

Таким образом, вы создаете дополнительные каталоги upper и work внутри образа upperdir. Это решение позволяет соблюдать требования OverlayFS, не изменяя саму файловую систему корня, и сохраняет возможность записи. Логика заключается в том, что эти новые директории будут использоваться для обработки изменений и рабочих операций, необходимых OverlayFS, не затрагивая основную структуру старого образа.

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

Оцените материал
Добавить комментарий

Капча загружается...