После полутора лет разработки опубликован выпуск проекта MirageOS 4.0, позволяющего формировать операционные системы одного приложения, в которых приложение поставляется как самодостаточный “unikernel”, способный выполняться без применения операционных систем, отдельного ядра ОС и каких-либо прослоек. Для разработки приложений применяется язык OCaml. Код проекта распространяется под свободной лицензией ISC.
Вся низкоуровневая функциональность, свойственная операционной системе, реализована в форме библиотеки, прикрепляемой к приложению. Приложение может быть разработано в любой ОС, после чего компилируется в специализированное ядро (концепция unikernel), которое может запускаться напрямую поверх гипервизоров Xen, KVM, BHyve и VMM (OpenBSD), поверх мобильных платформ, в форме процесса в POSIX-совместимом окружении или в облачных окружениях Amazon Elastic Compute Cloud и Google Compute Engine.
Сгенерированное окружение не содержит ничего лишнего и взаимодействует непосредственно с гипервизором без драйверов и системных прослоек, что позволяет добиться существенного снижения накладных расходов и повышения безопасности. Работа с MirageOS сводится к трём стадиям: подготовка конфигурации с определением используемых в окружении OPAM-пакетов, сборка окружения и запуск окружения. Runtime для обеспечения работы поверх гипервизоров построен на базе ядра Solo5.
Несмотря на то, что приложения и библиотеки формируются на высокоуровневом языке OCaml, итоговые окружения демонстрируют достаточно неплохую производительность и минимальный размер (например, DNS-сервер занимает всего 200 КБ). Упрощается и сопровождение окружений, так как при необходимости обновления программы или изменения конфигурации, достаточно создать и запустить новое окружение. Поддерживается несколько сотен библиотек на языке OCaml для выполнения сетевых операций (DNS, SSH, OpenFlow, HTTP, XMPP, Matrix, OpenVPN и т.п.), работы с хранилищами и обеспечения параллельной обработки данных.
Ключевые улучшения:
- Изменён процесс компиляции проектов и unikernel. Вместо ранее применявшейся сборочной системы ocamlbuild задействован инструментарий dune и локальные репозитории (monorepo). Для формирования подобных репозиториев добавлена новая утилита opam-monorepo, позволившая разделить управление пакетами от сборки из исходных текстов. Утилита opam-monorepo выполняет такую работу, как создание lock-файлов для связанных с проектом зависимостей, загрузка и извлечения кода зависимостей и настройка окружения для применения сборочной системы dune. Непосредственно сборка выполняется инструментарием dune.
- Предоставлен повторяемый процесс сборки. Использование lock-файлов обеспечивает привязку к версиям зависимостей и позволяет в любой момент полностью повторить процесс сборки с тем же кодом.
- Реализован новый процесс кросс-компиляции и обеспечена возможность кросс-компиляции для всех поддерживаемых целевых платформ из одного общего сборочного окружения, в котором в том числе выполняется кросс-компиляция зависимостей и библиотек, имеющих привязки на языке Си, без необходимости добавления этих привязок в основной пакет. Кросс-компиляция организована с использованием рабочих пространств, предоставляемых сборочной системой dune.
- Добавлена поддержка новых целевых платформ, например, предоставлена экспериментальная возможность сборки самодостаточных приложений для работы на платах Raspberry Pi 4.
- Проведена работа по интеграции частей MirageOS в экосистемы, связанные с разработкой на языке OCaml, для упрощения сборки приложений в форме unikernel. Многие пакеты MirageOS портированы для сборочной системы dune. Утилита opam-monorepo доступна для установки при помощи пакетного менеджера opam и может использовать в проектах, применяющих сборочную систему dune. Для сопровождения патчей, решающих проблемы со сборкой зависимостей в dune, создано два репозитория dune-universe/opam-overlays и dune-universe/mirage-opam-overlays, которые включены по умолчанию при использовании CLI-утилиты mirage.
- Упрощена интеграция MirageOS с библиотеками на языках C и Rust.
- Предложен новый OCaml runtime, позволяющий обойтись без libc (libc-free).
- Предоставлена возможность использования сервиса Merlin для интеграции с типовыми интегрированными средами разработки.