Суть инновации: один бинарник вместо кучи зависимостей
Bake — это утилита командной строки для Linux, которая решает проблему переносимости микровиртуальных машин (microVM). Вместо того чтобы разворачивать сложную инфраструктуру с отдельными файлами ядра, initrd, бинарником Firecracker и образами дисков, разработчик может создать единый исполняемый файл формата ELF. Этот файл содержит все необходимые ресурсы и логику для запуска изолированной среды.
Ключевое преимущество Bake — работа в пространстве пользователя (userspace) без необходимости получения прав root. Взаимодействие между хостом и гостевой VM происходит через vsock, что обеспечивает безопасность и простоту развертывания в ограниченных средах.
Техническая реализация: как это работает
Процесс работы Bake делится на два основных режима: Build (сборка) и Run (запуск). На этапе сборки утилита принимает входные файлы (ядро, initrd, rootfs, firecracker) и «зашивает» их в исполняемый файл. При запуске бинарник определяет контекст:
- Run Mode (на хосте): Бинарник извлекает ресурсы в память (memfd), настраивает vsock-эндпоинты для сети (SOCKS5 прокси, UDP мост, 9p файловый сервер) и запускает Firecracker.
- VMinit Mode (внутри VM): Если процесс запущен как PID 1, Bake выполняет инициализацию: монтирует файловые системы, настраивает overlay-диск для временных данных, поднимает сеть через tun2socks и запускает контейнер через runc.
Сетевая конфигурация реализована через прокси SOCKS5 на порту vsock 10 и UDP-мост на порту 11, что позволяет гостевой системе иметь доступ к интернету и хосту без сложных правил iptables.
Возможности и метрики
Bake предоставляет гибкое управление ресурсами и доступом. Ниже приведена таблица ключевых параметров, поддерживаемых утилитой:
| Параметр | Описание и пример использования | Значение по умолчанию |
|---|---|---|
--cpus |
Количество виртуальных CPU-ядер | Не указано (зависит от хоста) |
--memory |
Объем оперативной памяти в МБ | 256 MB |
-p, --publish |
Проброс портов: HOST:VM (например, 8080:8080) |
Нет |
-v, --volume |
Маппинг директорий: HOST:VM[:ro] |
Нет |
--allow-net |
Разрешить исходящий трафик на IPv4 CIDR | Заблокировано (если не задано) |
--wireguard-conf-file |
Путь к конфигу WireGuard | Нет |
Пример использования
Разработчики могут собрать самодостаточное приложение, используя Docker-образ Bake. Для сборки бинарника app.elf из образа ghcr.io/losfair/bake и локального корня rootfs.squashfs.img используется следующая команда:
docker run -it --rm \
-v ./rootfs.squashfs.img:/rootfs.img:ro \
-v ./output:/output \
--entrypoint /opt/bake/bake.amd64 \
ghcr.io/losfair/bake \
--input /opt/bake/bake.amd64 \
--firecracker /opt/bake/firecracker.amd64 \
--kernel /opt/bake/kernel.amd64 \
--initrd /opt/bake/initrd.amd64.img \
--rootfs /rootfs.img \
--output /output/app.elf
После сборки полученный файл app.elf можно запустить напрямую. Например, чтобы выполнить команду uname -a внутри изолированной среды:
./output/app.elf -- uname -a
Результат покажет ядро Linux версии 6.1.149-bottlefire, что подтверждает работу внутри микровиртуальной машины.
Почему это важно
Bake устраняет барьеры для внедрения Firecracker в сценариях, где установка Docker или прав root невозможна или нежелательна. Возможность упаковать всю среду выполнения в один файл упрощает CI/CD пайплайны, безопасное выполнение недоверенного кода и развертывание в edge-вычислениях. Поддержка WireGuard и проброса портов делает инструмент готовым к использованию в production-средах с требованиями к сетевой изоляции.
Источник: Github ↗
