Понимание структуры файловой системы Fedora/CentOS bootc

Этот раздел кратко повторяет некоторые положения, содержащиеся в документации по файловой системе bootc от разработчиков. Пожалуйста, обратитесь к ней за более подробной информацией.

composefs

Первое важное отличие Fedora/CentOS bootc от других вариантов на основе ostree в производных Fedora заключается в том, что Fedora/CentOS bootc по умолчанию использует composefs для корневой файловой системы.

Однако использование composefs происходит в «неподписанном» режиме; при работе с файловой системой, в которой включена fs-verity, fs-verity будет включена. Тем не менее, для установок по умолчанию проверка подписей не выполняется.

Доступна для записи при сборке, только для чтения во время выполнения

За исключением двух случаев, перечисленных ниже, все каталоги доступны для записи в процессе сборки контейнера; но после развёртывания (на физической или виртуальной машине) bootc по умолчанию предоставляет содержимое образа только для чтения.

Это похоже на поведение, которое можно получить с помощью podman run --read-only для образов контейнеров приложений.

Монтирование файловой системы: /etc

Каталог /etc по умолчанию является постоянным и изменяемым локальным состоянием машины. Хотя он выглядит как точка монтирования, он всегда является частью локальной корневой файловой системы машины.

Например, если вы задаёте статические IP-адреса через kickstart Anaconda, они будут сохраняться здесь при обновлениях.

При обновлениях применяется трёхстороннее слияние, при котором каждое «развёртывание» имеет свою собственную копию /etc.

Не поддерживается попытка сделать /etc отдельным физическим разделом. Однако его можно сделать явно «временным»; подробнее см. пример transient-etc.

Семантика /etc с контейнерными образами

Когда вы изменяете содержимое /etc в производных контейнерных образах, все добавленные или удалённые файлы будут применены при обновлениях. Например, если вы добавите новый файл в /etc/NetworkManager/conf.d/ в вашем контейнере для настройки сети, это будет применено при обновлениях.

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

Монтирование файловой системы: /var

Точка монтирования /var также является постоянным и изменяемым локальным состоянием машины, но существует только одна физическая копия. Здесь хранятся следующие данные:

  • Состояние образов контейнеров приложений (/var/lib/containers), используемое podman

  • системные журналы в /var/log

  • Домашние каталоги пользователя и root (/var/home и /var/roothome соответственно)

  • Общее состояние приложений, привязанных к хосту, например путь к базе данных по умолчанию /var/lib/postgresql

Семантика /var и контейнерных образов

Поддерживается использование корневого /var в качестве точки монтирования; однако в целом рекомендуется делать точками монтирования подпути /var, например /var/lib/custom-database, или, например, указывать подкаталог /mnt.

При сборке контейнера вы можете записывать данные в /var. Однако это будет иметь семантику, аналогичную инструкции VOLUME в Dockerfile; содержимое из контейнерного образа копируется только при первоначальной установке. При последующих обновлениях системы новые изменения по умолчанию не будут видны.

Вместо этого рекомендуется использовать, например, systemd tmpfiles.d, чтобы обеспечить «согласование» вновь добавленного состояния при обновлениях по желанию.

Динамические точки монтирования с transient-ro

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

Варианты использования

Эта функция решает задачи, когда:

  • Приложениям требуется примонтировать каталоги хоста, соответствующие абсолютным путям хоста

  • Требуются точки монтирования, зависящие от платформы (например, /Users на macOS)

  • Динамические точки монтирования необходимо создавать после развёртывания, но до запуска приложения

  • Файловая система должна оставаться доступной только для чтения для обычных процессов

Конфигурация

Чтобы включить эту функцию, добавьте следующее в /usr/lib/ostree/prepare-root.conf:

[root]
transient-ro = true
При внесении изменений в конфигурацию файловой системы также необходимо перегенерировать initramfs. Дополнительную информацию см. в Начальный RAM-диск (initrd).

Из-за ограничения в util-linux при выполнении операций монтирования с использованием этой функции необходимо установить переменную окружения LIBMOUNT_FORCE_MOUNT2=always. Это проблема (util-linux #2283), которая влияет на функциональность пространства имён монтирования, необходимую для transient-ro.

Полный пример использования этой функции от начала до конца см. в примере transient-root-ro в репозитории примеров.

Как это работает

Когда установлено transient-ro=true:

  1. Верхний каталог overlayfs по умолчанию монтируется только для чтения

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

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

  4. Обычные процессы по-прежнему видят файловую систему только для чтения

Пример: интеграция с Podman machine

Распространённый случай использования — podman machine на macOS, где виртуальной машине необходимо примонтировать пути хоста, например /Users/username, в виртуальную машину. С transient-ro система может:

  1. Динамически создавать каталог /Users во время выполнения

  2. Смонтировать каталог /Users хоста в /Users виртуальной машины

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

Вопросы безопасности

  • Только привилегированные пользователи (root) могут создавать эти точки монтирования

  • Точки монтирования являются временными и не сохраняются после перезагрузок

  • Файловая система остаётся доступной только для чтения для непривилегированных процессов

  • Эту функцию следует использовать с осторожностью в производственных средах

Дополнительную информацию об этой функции см. в документации ostree от разработчиков и в соответствующем обсуждении в проекте bootc.