trynix: любой пакет Nix запускается прямо в браузере

· Linux и open source
Фарид Закария представил trynix — сервис, который загружает Linux-машину в вкладке браузера и позволяет запустить любую из более чем 310 тысяч версий пакетов nixpkgs без единой установки на хосте.

cover.svg

Фарид Закария, известный своими экспериментами вокруг экосистемы Nix, называет новый проект своим magnum opus. trynix (trynix.dev) позволяет открыть в браузере полную историю nixpkgs — свыше 310 083 версий пакетов — и запустить любую из них в виртуальной машине, которая загружается прямо во вкладке. Никаких серверов: страница состоит из статических файлов, а всё остальное берётся из общедоступных кэшей.

Как это устроено

Автор соединил несколько своих прежних наработок. Проекты nixpkgs-multiverse, grail и omniflake научились индексировать каждую версию каждого пакета и обходиться без этапа сборки: вместо долгой оценки выражений сервис сразу запрашивает готовый store-path, который когда-то собрала Hydra. Если бинарник есть — его можно запустить.

Недостающим звеном была среда исполнения: store-path'ы — это ELF-файлы для x86-64 или aarch64. Решением стал Linux-ядро, скомпилированное в WebAssembly: настоящее x86_64-ядро загружается в браузере, ему подсовывают файловую систему с Nix-хранилищем, а нужные пути дотягиваются из кэша. Получается полноценный Nix-клиент внутри вкладки — Nix-хранилище в памяти, ядро на WebAssembly и эмулятор терминала на странице.

Любопытный поворот: пять лет назад Закария сам просил, чтобы cache.nixos.org отдавал заголовок access-control-allow-origin: * — тогда ради работы с OpenAPI. Теперь именно этот CORS-заголовок делает возможным весь фокус. Он же есть у GitHub Pages и Cachix, так что запустить в браузере можно даже пакет, которого нет в публичном кэше, — достаточно поделиться ссылкой на собственный store-path.

Чтобы всё казалось мгновенным

Загрузка ядра под эмуляцией медленна, и без ухищрений сервисом никто бы не пользовался. Поэтому trynix заранее подтягивает движок и снимок ВМ, а саму машину никогда не грузит с нуля — она резюмируется из снапшота, снятого в момент перед монтированием хранилища. При повторных визитах остаётся дотянуть лишь замыкание нужного пакета.

Мгновенным это всё же не становится: первый запуск бинарника требует трансляции x86_64 в WebAssembly, последующие — быстрее за счёт кэша. Размер замыкания ограничен памятью вкладки (около 1,5 ГиБ) и 32-битной адресацией WebAssembly (максимум 4 ГиБ). Часть оптимизаций автор нашёл с помощью языковых моделей.

Не только забавный трюк

Закария видит и практическую пользу. Ревью pull request'а превращается в клик по ссылке, которая загружает ровно те артефакты, что собрал CI, — без клонирования и сборки. Баг-репорты могут нести собственное окружение: «работает у меня» становится URL для воспроизведения. Документация обретает запускаемые примеры с навсегда зафиксированной версией инструмента. Наконец, археология: можно вживую погонять Python из 2017 года или hello из 2005-го.

Исходники доступны на GitHub. Как замечает автор, открытый CORS-заголовок годами тихо ждал, когда его наконец «употребят».


Источник: Lobsters

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.