Контейнеры¶
Состояние: работает, пока не интегрировано. Контейнеры запускаются — и образы 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 не проверялись.