Перейти к содержанию

Контейнеры

Состояние: работает, пока не интегрировано. Контейнеры запускаются — и образы FreeBSD, и образы Linux, — но управляются из командной строки: веб-интерфейс о них не знает.

FreeBSD 15 поставляет рабочий OCI-стек — podman со средой запуска ocijail — и BSDnas включает его. Контейнеры здесь внутри — джейлы, а не виртуальная машина с линуксовым ядром.

Проверено на работающей системе

Проверялось на свежеустановленном образе BSDnas, а не на машине, подготовленной руками:

  • podman и ocijail едут в образе — доставлять ничего не нужно;
  • в ядре включены VIMAGE, racct и rctl;
  • контейнер FreeBSD запускается;
  • контейнер Linux запускаетсяpodman run --os=linux alpine сообщает PRETTY_NAME="Alpine Linux v3.24";
  • kldload linux64 срабатывает и подтягивает mqueuefs — ниже о том, почему это предложение здесь вообще есть.

Linux-образам нужен один модуль ядра

Запуск Linux-образов опирается на эмуляцию Linux во FreeBSD, а она в унаследованной конфигурации оказалась сломанной:

# podman run --rm --os=linux docker.io/library/alpine cat /etc/os-release
ocijail: error executing container command: Exec format error

# kldload linux64
KLD linux64.ko: depends on mqueuefs - not available or version mismatch

linux64.ko в образе был, но не загружался: его зависимость mqueuefs не собиралась. В унаследованном от TrueNAS списке модулей есть linux, linux64, linux_common, linprocfs и linsysfs — замысел был, — но нет mqueuefs. Остальные зависимости (sysvmsg, sysvsem, sysvshm, netlink) вкомпилированы в ядро; эта — нет.

BSDnas добавляет модуль mqueue в сборку ядра. Для NAS это важно: большинство полезных контейнерных образов — линуксовые. Проверено на собранном образе — оба модуля грузятся, Linux-контейнеры работают.

Хранилище — только на пуле

/var в этой системе — tmpfs. Хранилище podman по умолчанию живёт в /var/db/containers/storage, то есть жило бы в памяти и исчезало при перезагрузке.

Направьте хранилище на датасет — /usr/local/etc/containers/storage.conf:

[storage]
driver = "zfs"
graphroot = "/mnt/tank/containers"
runroot = "/var/run/containers/storage"

предварительно создав датасет:

# zfs create tank/containers

Учтите: пулы монтируются под altroot=/mnt, поэтому zfs create -o mountpoint=/var/db/containers/storage даёт не тот путь, что вы попросили, — он оказывается под /mnt. Используйте естественную точку монтирования датасета и укажите её в graphroot.

Чего пока не хватает

  • Нет интеграции с веб-интерфейсом. Контейнеры управляются из командной строки.
  • Нет приёмочного теста на контейнеры, поэтому ничто здесь не гарантировано переживает обновление.
  • Эмуляцию Linux надо включать сознательно: sysrc linux_enable=YES && service linux start.
  • Сеть сложнее моста по умолчанию, публикация портов и NAT не проверялись.