В начале прошлого месяца некто использовал поддержку JavaScript в формате PDF для запуска игры Tetris внутри обычно считающегося статичным текстового документа. Предсказуемо, уже через несколько дней он усовершенствовал этот хак, чтобы запустить Doom внутри PDF-файла. Теперь тот же разработчик пошел ещё дальше и адаптировал код для запуска целой операционной системы Linux.

Linux внутри PDF: как это работает?

Едва ли прошёл месяц после публикации порта Doom, работающего внутри PDF, как старшеклассник и программист под ником Ading2210 успешно эмулировал Linux в популярном формате файлов. Хотя производительность системы остаётся достаточно ограниченой, проект переопределяет границы возможностей инструментов JavaScript в PDF.

Опробовать его можно в браузерах на базе Chromium (Google Chrome, Edge и Opera). Исходный код доступен на странице разработчика на GitHub.

LinuxPDF работает в эмуляторе RISC-V, основанном на TinyEMU. Его внутренняя логика во многом напоминает DoomPDF от того же автора. Например, ввод данных использует трюк, впервые применённый в хаке с Tetris: повторное использование кода порта Doom. Пользователи могут кликать по виртуальным клавишам под основным экраном, но большинство, вероятно, предпочтут использовать клавиатуру, которая работает через интерпретацию ввода в текстовом поле.

Как это возможно?

Несмотря на то, что формат PDF изначально был создан для отображения текста и изображений, он также поддерживает выполнение JavaScript-кода.

PDF-файлы, запускаемые в браузерах, используют более ограниченную версию JavaScript, но её достаточно для запуска игр и даже операционных систем. Ading2210 обнаружил, что старая версия Emscripten (компилятор LLVM-байткода в код JavaScript), ориентированная на asm.js вместо WebAssembly, может компилировать C-код для работы внутри формата PDF.

Ограничения производительности

Как и в случае с DoomPDF, эмуляция Linux страдает от низкой производительности. Загрузка ядра занимает до минуты — примерно в 100 раз дольше, чем на традиционной системе Linux. По словам Ading2210, это нельзя исправить, поскольку Chromium использует версию V8, которая не поддерживает JIT-компилятор.

Видео в Telegram: https://t.me/applespbevent_video/47

Файловая система по умолчанию является 32-битной. Однако пользователи могут собрать 64-битную версию из исходного кода, клонировав репозиторий в реальной системе Linux, изменив строку «BITS» и загрузив Emscripten версии 1.39.20. К сожалению, запуск 64-битной версии удваивает производительностные потери.

Практическое применение

Для тех, кто интересуется более практичными решениями для запуска Linux на слабых устройствах, Ading2210 предлагает свой ChromeOS RMA Shim Bootloader. Этот набор скриптов позволяет запускать полноценную Debian-систему на Chromebook без модификации прошивки. Проект также поддерживает корпоративные устройства, зарегистрированные в системе управления.

Что дальше?

Проект LinuxPDF демонстрирует, насколько гибким может быть формат PDF, если к нему подходить креативно. Несмотря на производительность, оставляющую желать лучшего, сам факт возможности запуска целой операционной системы внутри PDF действительно впечатляет. Возможно, следующим шагом станет эмуляция ещё более сложных систем или приложений — кто знает, какие границы будут преодолены молодым энтузиастом в будущем?


Ещё по теме: