trynix: любой пакет Nix запускается прямо в браузере
Фарид Закария, известный своими экспериментами вокруг экосистемы 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
Комментарии
Войдите, чтобы комментировать.