Rurima: лёгкий контейнерный рантайм для систем без Docker и Podman
Rurima запускает контейнеры там, где Docker и Podman не работают: на embedded-устройствах, старых ядрах или Android в Termux. Один статический бинарник без демона и cgroups, но с минимальными зависимостями и поддержкой девяти архитектур.
Rurima: контейнерный рантайм для систем, где Docker не запустится
Rurima — не замена Docker. Это инструмент для уголков системного мира, где даже Podman кажется тяжёлым. Один статический бинарник на 10–20 МБ, который не требует демона, обходится без cgroups и namespaces и поддерживает девять архитектур — от x86_64 до riscv64 и loong64. Его мишень — embedded-устройства, старые ядра, Android в Termux или любая среда, где установка Docker заканчивается ошибкой «не хватает места» или «не поддерживаются capabilities».
Но простота оборачивается напряжённостью: rurima даёт запуститься там, где другие отказываются, но не даёт полноценной изоляции. Он не предназначен для production, не обещает rootless-безопасности и не совместим с OCI-стандартом. Для production-систем, Kubernetes и rootless-окружений он не подходит; для одноразовых запусков ARM-контейнеров на маршрутизаторе или Alpine в Termux — вполне.
Как это работает
Rurima состоит из двух частей: встроенного рантайма ruri, который исполняет контейнеры, и обёртки rurima, которая скачивает образы, распаковывает rootfs, делает бэкапы и обновления. Зависимости минимальны — tar, xz, gzip, curl, jq и proot (последний нужен только для запуска без root). На Android proot порой не справляется с mount и сетевыми вызовами — об этом прямо говорят скрипты из устаревшего проекта daijin: fixup.sh для сетевых костылей и proot_start.sh для обёртывания запуска.
При старте rurima проверяет, что бинарник не запущен с suid/sgid или capabilities, и завершает работу с сообщением «this is unsafe desu QwQ». Запрещено распаковывать rootfs в /etc, /usr или /, чтобы не затереть хост-систему.
Функционал и ограничения
Одна команда — и образ на месте:
rurima pull hello-world ./test
Rurima парсит Docker-конфигурацию, скачивает образ, распаковывает rootfs в указанную директорию. Потом контейнер можно запустить:
rurima run hello-world
Встроенный рантайм ruri подхватит entrypoint, CMD, переменные окружения и рабочую директорию — ровно то, что описано в Dockerfile. Есть бэкап/рестор rootfs в tar, встроенная OTA для обновления rurima, и поддержка архитектур от i386 до s390x.
Но за пределами этого списка — ограничения. Нет OCI-совместимости, нет Control Groups для ограничения памяти и CPU, нет встроенной системы сборки контейнеров, нет интеграции с Kubernetes. Rurima не обещает полноценной изоляции — он обещает запуститься там, где Docker не запустится.
Где выигрывает, где проигрывает
Победные сценарии:
- ARM-роутеры с OpenWrt, где места на диске хватает только на прошивку.
- Старые серверы с ядрами ниже 4.0, где cgroups отключены или сломаны.
- Android в Termux, когда нужен быстрый терминал для Alpine без установки Docker/Podman.
- Embedded-платы с LoongArch или RISC-V, где бинарники для Docker недоступны.
Проигрышные сценарии:
- Production-окружения, где нужны Control Groups для памяти и CPU.
- Rootless-режимы с минимальными рисками — Podman делает это безопаснее.
- Android, если контейнер требует сетевых привилегий или mount-точек, с которыми proot не справляется.
Реальный тест: Alpine в Termux на Android без root
Пользователь в Termux устанавливает зависимости: proot, curl, jq. Скачивает статический бинарник rurima для arm64. Запускает:
rurima pull alpine ./alpine-rootfs
Rurima скачивает образ, распаковывает rootfs через proot. Контейнер стартует, но интернета нет — proot не прокидывает сеть. Приходится вручную скачивать fixup.sh из архива daijin и применять его к контейнеру. После этого сеть появляется, но mount внутри контейнера работает криво: некоторые системные вызовы не эмулируются корректно.
Этот сценарий показывает главную проблему rurima: он работает, но требует ручной настройки там, где Docker/Podman делают это автоматически. Rurima — не замена, а обходной путь для систем, где стандартные инструменты не по зубам.
Что упускают в документации
Производительность без cgroups — это не просто «немного медленнее». Контейнеры могут забить всю память, если внутри запустится memhog. В статьях про Docker в LXC прямо пишут, что без Control Groups возможны проблемы со стабильностью и откликом.
Безопасность тоже хромает. Proot — это эмулятор привилегий, а не изоляция. Он не даёт тех же гарантий, что user namespace в Podman или полноценные namespaces в Docker. Rurima запрещает suid/sgid при старте, но запуск через proot всё равно оставляет лазейки для эскалации привилегий на уязвимой системе.
Документация содержит противоречия: то «не требует cgroups», то «работает через proot, который их эмулирует». Нет бенчмарков, нет security-audit, только обещание минимализма.
Для кого и когда стоит попробовать
Rurima стоит попробовать, если:
- Ваша система не тянет Docker или Podman — места нет, ядро старое, архитектура экзотическая.
- Вам нужен одноразовый контейнер для отладки — не для production, не для кластера.
- Вы разрабатываете embedded-прошивку и хотите запустить тестовый контейнер прямо на устройстве.
Если нужна полноценная изоляция, rootless-безопасность или интеграция с Kubernetes — посмотрите сначала на Podman или rootless Docker. Они тяжелее, но делают то, что обещает rurima, только правильно.