- PVSM.RU - https://www.pvsm.ru -

Рабочий стол Linux в браузере

Рабочий стол Linux в браузере - 1


Первый в мире браузер (1993 года) выполнял две функции:

  • рендеринг HTML;
  • переход по гиперссылкам (навигация, браузинг — отсюда и название «браузер»).

Всё было предельно просто. Но те времена давно ушли.

Современный браузер эволюционировал в сложнейшую мета-систему, которая по объёму кода превосходит ядра многих ОС. Более того, браузер де-факто может работать как операционная система. И не только в Linux-виртуалке (как ChromeOS), но как реальная платформа для запуска настоящих приложений, в том числе нативных программ на C, C++, Go и Node.js.

Запуск Unux-процессов внутри браузера


Для доказательства этой концепции был разработан экспериментальный проект Browsix [1]. Мотивы создания Browsix и архитектура системы описаны в научной статье [2] (doi: 10.1145/3037697.3037727 [3]). Очень странно, но этот уникальный проект 2017 года ни разу не упомянут на Хабре [4].

Если в двух словах, Browsix запускает оригинальные, немодифицированные программы C, C++, Go и Node.js в браузере клиента как процессы Web Workers [5] в окружении POSIX, работающие параллельно друг с другом и с основным браузерным потоком, который рендерит страницы.

Рабочий стол Linux в браузере - 2
Browsix перехватывает системные вызовы и обеспечивает программам доступ к стандартным сервисам ОС, таким как общая файловая система и процессы. Есть также ограниченная поддержка синхронного I/O и сокетов TCP/IP.

В отличие от интерпретаторов типа Cygwin [6], сам Browsix не выполняет интерпретацию кода. Он предоставляет общее ядро и примитивы вроде системных вызовов для существующих интерпретаторов и режимов выполнения, ориентированных на JavaScript.

Основные модули Browsix написаны на TypeScript (первые три строки в таблице).

▍ Компоненты Browsix

Компонент Строк кода
Ядро 2249
Модификации BrowserFS 1231
Общий модуль syscall 421
Интеграция с Emscripten (поддержка С/С++) 1557
Интеграция с GopherJS (поддержка Go) 926
Интеграция с Node.js 1742
Всего 8126

Например, разработчики расширили компиляторы GopherJS [7] и Emscripten, чтобы они могли работать с их общим ядром, так что процессы, написанные на C и Go, могут работать параллельно (в отдельных веб-воркерах) и взаимодействовать через каналы, сокеты и файловую систему в браузере (как в стандартной среде Unix).

Зачем это нужно?


В современной концепции разработки интерактивные веб-приложения обычно разделяются на серверную и клиентскую части:

  1. Бэкенд (выполняется на сервере).
  2. Фронтенд (выполняется у клиента).

Browsix позволяет всё выполнять в браузере у клиента, без традиционного бэкенда. Теоретически — такой цельный подход без разделения приложения на две части способен упростить веб-разработку и сократить издержки на поддержку бэкенда.

Вместо того чтобы поддерживать серверную часть приложения из существующих Unix-программ, разработчик просто переносит их в браузер клиента. Кроме всего прочего, это устраняет целый класс проблем безопасности (программы явно будут иметь доступ только к данным текущего пользователя на вкладке браузера) и масштабирования.

▍ Примеры


Посмотрим на примеры приложений, которые работают внутри Browsix.

  • Терминал [8] даёт доступ к внутренностям Browsix через стандартную консоль POSIX (по крайней мере, так было задумано, в реальности многое сейчас не работает):

    Консоль Browsix

    Исходный код [9]

  • Редактор LaTeX [10] просто берёт дистрибутив TeX Live [11] и загружает его в браузер, а PDF генерируется с помощью pdflatex и bibtex, см. исходный код приложения [12]. Для запуска LaTeX нужно дождаться загрузки нескольких сотен файлов. Но затем всё должно работать в браузере клиента.

    Рабочий стол Linux в браузере - 4
    (скриншот с офсайта)

    Сейчас редактор запускается не во всех браузерах (у нас не загрузилось в Firefox Nightly 105.0a1 и Chrome 104.0.5112.81). Но по старым скриншотам видно, что его функциональность сравнима с коммерческими веб-редакторов LaTeX, таких как Overleaf [13]:

    Рабочий стол Linux в браузере - 5
    Overleaf

Теоретически, в Browsix можно загрузить любую программу. Хотя разработчики давно не обновляли движок и он сейчас немного глючит. Но это эксперимент, который демонстрирует, что запуск произвольных бинарников в принципе возможен.

Консоль в браузере


Терминал Browsix — не единственная реализация консоли Unix в браузере. Из известных разработок вспоминается утилита GoTTY [14], которая отправляет выдачу консоли в браузер клиента:

Рабочий стол Linux в браузере - 6

А если объединить этот инструмент с эмулятором операционной системы в браузере, то получается нечто такое [15].

Десктоп на JavaScript


JavaScript позволяет реализовать в браузере вполне правдоподобное десктопное окружение. Это отличная демонстрация современных веб-технологий. Хотя понятно, что JS работает на порядок медленнее, чем любой нативный код.

Среди таких любительских проектов — DaedalOS [16], написанный одним программистом в течение года [17], см. исходный код [18].

Если развернуть на весь экран и пощёлкать по иконкам, то создаётся смутное впечатление обычного десктопа Windows, только на очень старом железе (из-за больших лагов). А так тут есть меню «Пуск», папки, рабочий софт, игры.

Рабочий стол Linux в браузере - 7

Ещё один похожий проект — Puter [19], тоже сделанный за год [20] одним человеком. Только здесь GUI рабочего стола больше напоминает macOS или Linux, и кажется немного симпатичнее. Создаётся ощущение, что здесь лаги поменьше. Например, изменение размера окон и перемещение их по экрану вообще не тормозит. Правда, встроенный набор приложений гораздо более скудный. Ни игр, ни другого софта, только консоль.

Рабочий стол Linux в браузере - 8

В отличие от разработчиков консоли Browsix, здесь автор реально принимает баги, извиняется [21] и исправляет ошибки. Десктоп нормально работает во всех основных браузерах последних версий.

Браузер — это операционная система


Примеры создания полноценных десктопных окружений внутри браузера демонстрируют в том числе невероятную сложность современного браузера. То есть браузер — это альтернативная (универсальная) платформа для разработки приложений. Там можно реализовать все функции нативных программ Linux, Windows или macOS.

В принципе, в браузере можно запустить эмулятор конкретной операционной системы — и уже в нём запускать все нативные программы, в том числе другие браузеры, а в них другие операционные системы и так далее. Как шутят на реддите, главное — не гуглить Google, запустив браузер внутри браузера, и не вешать чужие терминалы командой rm -rf /.

Ещё в далёком 2012 году JSLinux [22] от Фабриса Беллара стал первым эмулятором, способным загружать в браузер произвольные операционные системы. Он изначально поддерживал следующие ОС:

CPU ОС Интерфейс Доступ к VFsync [23] Ссылка на загрузку Конфигурация TEMU [24] Комментарий автора
x86 Alpine Linux 3.12.0 Консоль Да нажмите здесь [25] url [26]
x86 Alpine Linux 3.12.0 X Window Да нажмите здесь [27] url [28] Правая кнопка мыши вызывает меню.
x86 Windows 2000 Graphical Нет нажмите здесь [29] url [30] Дисклеймер о снятии ответственности [31]
x86 FreeDOS Текстовый VGA Нет нажмите здесь [32] url [33]
riscv64 Buildroot (Linux) Консоль Да нажмите здесь [34] url [35]
riscv64 Buildroot (Linux) X Window Да нажмите здесь [36] url [37] Правая кнопка мыши вызывает меню.
riscv64 Fedora 33 (Linux) Консоль Да нажмите здесь [38] url [39] Предупреждение: долгое время загрузки.
riscv64 Fedora 33 (Linux) X Window Да нажмите здесь [40] url [41] Предупреждение: долгое время загрузки. Правая кнопка мыши вызывает меню.

Более современная версия этого эмулятора — виртуальный x86 [42], на который можно загрузить 25 разных операционных систем, включая Arch Linux [43] и Damn Small Linux [44]. Всё это работает чисто в браузере.

Для удалённого управления другим компьютером тоже не требуется ничего, кроме браузера — см. Apache Guacamole [45], который поддерживает все стандартные протоколы типа VNC, RDP и SSH.

Видео с демонстрацией [46]

В принципе, через Guacamole можно управлять «настольными компьютерами», которые физически даже не существуют, а живут в облаке или в контейнере на каком-нибудь хостинге [47], то есть виртуальными системами.

Кстати, из этой невероятной функциональности современного браузерного движка следует вывод, что разработать с нуля ещё одну махину, сравнимую с Chromium, очень трудно. И если исчезнет единственный на платформе x86 альтернативный движок Gecko [48] (Firefox, FirefoxOS), то уже никто не сможет составить ему конкуренцию.

Ну а по сути современный браузер — уже сам по себе операционная система. Программы любой сложности при желании можно переписать на WebAssembly, asm.js или скомпилировать в JavaScript — и они будут работать в браузере.

Автор: Анатолий Ализар

Источник [49]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/virtualizatsiya/378182

Ссылки в тексте:

[1] Browsix: https://github.com/plasma-umass/browsix

[2] научной статье: https://browsix.org/powers2017-browsix.pdf

[3] 10.1145/3037697.3037727: https://dl.acm.org/doi/10.1145/3037697.3037727

[4] ни разу не упомянут на Хабре: https://www.google.com/search?q=browsix+site%3Ahabr.com

[5] Web Workers: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

[6] Cygwin: https://www.cygwin.com/

[7] GopherJS: https://github.com/bpowers/browsix-gopherjs

[8] Терминал: https://unix.bpowers.net/

[9] Исходный код: https://github.com/plasma-umass/browsix/tree/master/app/elements/browsix-terminal

[10] Редактор LaTeX: https://browsix.org/latex-demo-sync/

[11] TeX Live: https://www.tug.org/texlive/

[12] исходный код приложения: https://github.com/plasma-umass/browsix/tree/master/examples/latex-editor

[13] Overleaf: https://www.overleaf.com/

[14] GoTTY: https://github.com/yudai/gotty

[15] нечто такое: https://rkeene.dev/js-repl/?arg=bash

[16] DaedalOS: https://dustinbrett.com/

[17] одним программистом в течение года: https://news.ycombinator.com/item?id=29783914

[18] исходный код: https://github.com/DustinBrett/daedalOS

[19] Puter: https://puter.com/

[20] за год: https://www.reddit.com/r/programming/comments/v45rb6/i_spent_a_year_building_a_desktop_environment/

[21] извиняется: https://www.reddit.com/r/programming/comments/v45rb6/comment/ib6q5xr/

[22] JSLinux: https://bellard.org/jslinux/

[23] VFsync: https://vfsync.org

[24] TEMU: https://bellard.org/tinyemu

[25] нажмите здесь: http://vm.html?url=alpine-x86.cfg&mem=192

[26] url: http://alpine-x86.cfg

[27] нажмите здесь: http://vm.html?url=alpine-x86-xwin.cfg&mem=256&graphic=1

[28] url: http://alpine-x86-xwin.cfg

[29] нажмите здесь: http://vm.html?url=win2k.cfg&mem=192&graphic=1&w=1024&h=768

[30] url: http://win2k.cfg

[31] Дисклеймер о снятии ответственности: http://disclaimer.html

[32] нажмите здесь: http://vm.html?url=freedos.cfg&mem=64&graphic=1&w=720&h=400

[33] url: http://freedos.cfg

[34] нажмите здесь: http://vm.html?cpu=riscv64&url=buildroot-riscv64.cfg&mem=256

[35] url: http://buildroot-riscv64.cfg

[36] нажмите здесь: http://vm.html?cpu=riscv64&url=buildroot-riscv64-xwin.cfg&graphic=1&mem=256

[37] url: http://buildroot-riscv64-xwin.cfg

[38] нажмите здесь: http://vm.html?cpu=riscv64&url=fedora33-riscv.cfg&mem=256

[39] url: http://fedora33-riscv.cfg

[40] нажмите здесь: http://vm.html?cpu=riscv64&url=fedora33-riscv-xwin.cfg&graphic=1&mem=256

[41] url: http://fedora33-riscv-xwin.cfg

[42] виртуальный x86: https://copy.sh/v86/

[43] Arch Linux: https://copy.sh/v86/?profile=archlinux

[44] Damn Small Linux: https://copy.sh/v86/?profile=dsl

[45] Apache Guacamole: https://guacamole.apache.org/

[46] Видео с демонстрацией: https://player.vimeo.com/video/116207678

[47] хостинге: https://www.reg.ru/?rlink=reflink-717

[48] Gecko: https://developer.mozilla.org/en-US/docs/Glossary/Gecko

[49] Источник: https://habr.com/ru/post/682782/?utm_source=habrahabr&utm_medium=rss&utm_campaign=682782