Вопрос или проблема
Можно ли присоединить существующий образ диска, содержащий корневую файловую систему, к 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, не затрагивая основную структуру старого образа.
Таким образом, создается возможность обновления существующих скриптов для работы на новых версиях ядра с минимальными изменениями в их логике и максимальной совместимостью, без изменения структуры корневого образа.