Пользователь
18,1
рейтинг
17 мая 2011 в 13:41

Администрирование → Эмулятор компьютера с linux на JavaScript

Никакой серверной части. Только JS: полноценный эмулятор компьютера с линуксом на борту.

bellard.org/jslinux
(внимание, только хром и FF4)

Я долго с ним игрался — это не имитация, линукс ведёт себя как настоящий линукс — компилированные программы работают, ошибки в них вызывают segmentation fault, повреждение корневой файловой системы вызывает бурю возмущения в dmesg и т.д.
Эмулятор PC на JS с линуксом на борту

dd показывает при работе с памятью более чем приличную производительность — более 40 мб/с (не забываем, что это эмулятор, и что это JS в вашем браузере!).

Я никогда не думал, что мы доживём до подобного.

… А теперь начинается оргия:

* С использованием локального хранилища мы можем организовать диски (каждый key-value соответствует одному сектору).
* С использованием web-socket мы можем создать паравиртуализированный драйвер сети с выходом на железный машрутизатор и получить нормальную сеть.
* С использованием существующих технологий (NUMA, DRBD, corosync) можно организовать вычислительный кластер из браузеров.

(Кстати, показывать консоль в этом случае не обязательно — вы запускаете виртуальную машину у клиента в бэкграунде, виртуальная машина присоединяется к кластеру, начинает считать, по её аварийному завершению — закрытию браузера — кластер автоматически переконфигурируется).

Я это пишу как хохму, но в реальности, если у вас есть линукс и есть — у вас есть все возможности для работы чего угодно. Любые сетевые приложения, любые системы синхронизации и управления.

Никто не мешает создать паравиртуализированный драйвер видео с помощью canvas, у вас есть webGL, для которого можно написать свой вариант cuda и получить довольно мощную акселерацию вычислений…

Ну и финал — запуск хрома внутри эмулируемой виртуальной машины.

Итак, эмуляция дошла до браузеров…
Георгий Шуклин @amarao
карма
269,0
рейтинг 18,1
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (356)

  • +10
    Браузер с линуксом внутри — это круто!
    • НЛО прилетело и опубликовало эту надпись здесь
      • +9
        А при чём тут java-то? На java совершенно не интересно, так же как и на флеше.
        • НЛО прилетело и опубликовало эту надпись здесь
          • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
  • +4
    Только что постанули — правда менее информативно. См тему ниже — habrahabr.ru/blogs/linux/119422/
    И поправьте что не только хром работает… У меня FX4 без проблем пашет.
    • +8
      извините, хабр лежал эти 20 минут, а убирать в черновики столько написанного мне не хочется.
      • +1
        Согласен, имеет право на жизнь, хотя информации столько же, плюс домыслы и рассуждения.
    • 0
      Safari 5.1/Mac — тоже без проблем загрузил Linux.
      • 0
        Webkit, хуле.
        • +4
          Тем не менее, js движки в Сафри и Хроме сильно разные.
  • +2
    Отлично подойдет для обучения линуксу не желающим / не имеющим возможность поставить VirtualBox / VMWare и т.д.
    • +2
      Для этого есть ubuntu с wubi.
      • +2
        Ага, конечно, на виртуалку я ставить не хочу, а вот рядом с основной системой — пожалуйста.
        • +1
          Нежелания разные бывают, в данном случае компенсируется лень. Да и что вы имеете ввиду под «рядом с основной системой — пожалуйста» — непонятно.
        • +1
          Она устанавливается не «рядом», а «внутри» Windows. Отдельный раздел под неё не нужен.
          • 0
            Вот именно, что «внутри» — в кавычках. Отдельный раздел не нужен, но, тем не менее, получается достаточно самостоятельная ОС, только менее надежная из-за такого подхода.
            И не надо говорить, что воспользоваться Wubi проще, чем виртуалкой.
        • –4
          Моя «основная система» не нуждается в эмуляторах и виртуальных машинах, чтобы попробовать Linux. Что и вам советую.
  • –33
    ERROR: your browser is too old to run JS/Linux.
    You should use a recent browser such as Firefox 4.x or Google Chrome.


    Опера 11.10 якобы не поддерживает JavaScript? Ну-ну…
    • +5
      The code is written in pure Javascript using Typed Arrays which are available in recent browsers. It was tested with Firefox 4 and Google Chrome 11 on Linux, Window and Mac (it does not work with Chrome 12 beta. As far as I know, it is a bug in the browser). In any case, a fast Javascript engine is needed to have good performance.
    • +29
      Операфаны плохо понимают по-английски?

      > ERROR: your browser is too old to run JS/Linux.

      Ваш браузер слишком стар чтобы JS/Linux работал в нем.

      Поставьте нормальный браузер, ну? ;)
      • 0
        Это по-типу физических характеристик браузера? xD
        Еще один уровень абстракции?)
        • –1
          HAL не круто, браузер — круто!
          • +2
            Жду, когда КДЕшники подсуетятся, и по примеру HAL-а выпилять браузер, и получим линукс напрямую, без виртуалки о_0
      • +7
        Роман намекает на то, что у него последняя версия его любимого браузера и она ни разу не старая.
        • +4
          ключевое слово — его любимого, а не того, который может по словам разработчиков обработать проект.
          • –5
            Тогда лучше бы выдала: this PoC doesn't work in Opera.
          • –2
            Ключевое слово — слишком стар, что не соответствует действительности. Лучше написали, что не работает с лентой и все.
            • –2
              … с оперой… извиняюсь
              • +10
                При чем тут Опера? Он проверяет наличие window.Uint8Array && window.Uint16Array && window.Int32Array && window.ArrayBuffer
                • +1
                  В лабораторной сборке с их поддержкой ( labs.opera.com/news/2011/02/28/ ) всё равно вылетает с ошибкой:

                  Event thread: load
                  Uncaught exception: [object DOMException]
                  Error thrown at line 9, column 150036 in Je(Ke, ha) in http://bellard.org/jslinux/cpux86.js:
                      Ne=new Uint8Array(Me,0,fd);
                  called from line 9, column 174320 in start() in http://bellard.org/jslinux/cpux86.js:
                      ya.load_binary("vmlinux26.bin",0x00100000);
                  called from line 1, column 0 in <anonymous function>(event):
                      start()
                  
                • +7
                  А причём здесь «слишком старый», в таком случае?
                  Пусть так и пишет: «Ваш браузер не поддерживает Typed Arrays»
                  • +3
                    Видимо, авторы решили, что браузер, не поддерживающий данные фичи, не может называться современным, а следовательно он «too old».
                  • +2
                    Уже исправились — теперь пишет
                    Your browser does not support the W3C Typed Arrays and this version of JS/Linux needs them.
      • +6
        >> Ваш браузер слишком стар чтобы JS/Linux работал в нем

        Ваш браузер SUPER STAR :)
      • 0
        Так в том-то и дело, что операфаны нормально понимают по-английски. Сама формулировочка хромает, разумней было бы просто «ваш браузер не поддерживается», а не «браузер слишком стар/молод/красив»
        • +2
          >> а не «браузер слишком стар/молод/красив»

          стар/молод/красив/хром Ж-)
          • 0
            Да-да, как в старом анекдоте: Ринго — стар, Эдуард — хил, Дитер — болен, а Элтон — вообще джон.
        • 0
          так стар же. ибо в недрах Оперы разрабатывается уже поддержка типизированных массивов, так что надо подождать чутка нового браузера.
          • 0
            Нельзя называть версию Оперы, которая недавно вышла устаревшей. С таким же успехом можно сказать, что в недрах FF разрабыватываются новые версии FF, значит FF 4 устарел.
            • +5
              Можно. Часто недавно или только что вышедшее называют устаревшим (технологически), сравнивая с конкурентами.
            • 0
              Любая программа к моменту ее написания является безнадежно устаревшей ;)
      • 0
        Поддержка typed array — фичи которая противоречит самой сути JavaScript, это характеристика «нормального» браузера? Ну ну.
    • –6
      Думаю, на самом деле оно способно работать в Опере, но там есть проверка на юзерагент, выводящая этот текст.
      • +5
        Нет, неспособно. И даже уже несколько раз писали почему.
        • –4
          Да уже прочел. Качаю новую оперу.
          • –2
            В 11.50 alpha тоже не работает.
            • +1
              Уже работает в опере 11
              • 0
                Ура!
  • +2
    в консоль не пускает ( Хром
    • 0
      >it does not work with Chrome 12 beta. As far as I know, it is a bug in the browser
  • +18
    Первое, что ввели 9/10, это rm / -rf
    • +7
      Ура, я вхожу в 10%!
      • +15
        Не только вы)
        Первым делом — uname -a
        • +1
          Я такой же :)
        • +8
          А я сделал ls, в результате узнал что можно скомпилить C-код. А еще там есть vi и emacs!
          • 0
            Аналогично :)
        • 0
          Я тоже вхожу в 10%)))
          Хотя начал с ввода ls -l / mount fdisk -l df -h
        • +1
          а потом rm / -rf :)
        • 0
          Жаль что startx не заюзаешь(терминал работает по uart-у) =(
      • 0
        Каждый хочет входить в 10%, а по факту, оказывается в остальных 90%.
    • +1
      rm не интересно.

      Интереснее
      dmesg
      dd if=/dev/zero of=/dev/ramdisk
      ls
      dmesg
      
    • +1
      я ввел сперва ls -la, потом uname -a. rm -rf / как-то не подумал ;)
      • 0
        А я подумал, но не ввёл :)

        Начал тоже с ls, что повлекло за собой vi/tcc/hello, и уже после этого дошла очередь до uname -a/df -h/free/cat /proc/cpuinfo и так далее…
    • –1
      да, давно хотел посмотреть что будет, но спецом для этого виртуалку заводить было влом.
      • +1
        ничего интересного. Просто большей части файлов не станет. В конкретно этом случае после кучи сообщений о «нет доступа» вы даже ls сделать не сможете.
    • 0
      Да не, думаю многие покопались в /bin и его содержимым, ну а потом уже… :)
    • +10
      [ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo «Жив»
    • +2
      ls :)
    • НЛО прилетело и опубликовало эту надпись здесь
    • +2
      Вот черт, а я какойто не такой, ввел первым делом ifconfig ))
      • +3
        Похоже, что единственным, кто ввёл rm / -rf был автор корневого комментария ;)
        • +1
          Просто больше никто не признаётся.
  • +4
    А вообще, это на самом деле — очень круто!
  • +3
    Обалдеть
  • +1
    Будущее рядом… Очень интересно наблюдать!
    Правда под Оперу тоже бы допилить. Или Оперу под него…
    Еще бы и синхронизацию между несколькими открытыми браузерами…
    • +5
      Оперу под него. Она не поддерживает typed arrays.
      • +1
        Значит подождем-с)
      • +1
        А для чего, если не секрет?
        • +1
          www.khronos.org/registry/typedarray/specs/latest/#2
          Чтобы проще было читать бинарные данные, насколько я понимаю.
          • 0
            Ну я так понимаю, такое сэмулировать на самом жс нетрудно. Впрочем, после эмуляции проца на жс уже все другое кажется копеечным делом)
            • 0
              Производительность Typed Arrays по сравнению с обычными массивами очень хороша. Боюсь, это было бы жуткое зрелище.
              • –2
                Да, но все же, согласитесь, лучше чем ничего.
      • 0
        Это не единственная проблема:

        habrahabr.ru/blogs/linux/119424/#comment_3903960
        • +2
          Насколько я понимаю драфт на typed arrays с тех пор подрос и переехал из спецификации на webgl в отдельную спеку. Так что не факт, что там полноценная поддержка.
  • +7
    Глянул в исходники и меня охватила вселенская печаль :) Это что-то нереально гениальное.
    • +4
      Автор разработал QEMU, как я узнал из вики :)
      • +3
        Ну после написания QEMU сделать эмулятор простейшего x86 процессора без MMX можно и на Brainfuck'е =)
        • +8
          Ну да, я на это и намекаю — уровень скилла у человека офигенно высок :)
        • 0
          Кстати,
          $ cat /proc/cpuinfo

          выдаёт

          model name: Pentium MMX
          ...
          • –6
            Давайте не будем со мной спорить, ладно?:
            CPU Emulation

            Some of the code is inspired from my x86 dynamic translator present in QEMU, but there are important differences because here it is an interpreter. The CPU is close to a 486 compatible x86 without FPU. The lack of FPU is not a problem when running Linux as Operating System because it contains a FPU emulator. In order to be able to run Linux, a complete MMU is implemented. The exact restrictions of the emulated CPU are:
            No FPU/MMX/SSE
            • +3
              Если вам показалось, что я с вами спорю — то вам действительно показалось. Это было просто замечание «по ходу дела».
              • +2
                Тогда извините, просто посчитал это камнем в свой огород. =)
      • +1
        A еще ffmpeg (создал проект в 2000 и развивал до 2004 года), самый маленький компилятор си (tcc, была версия в 2 кб) и очень быстрые программы для расчета числа пи.
  • +7
    Круто! Для тех кто хочет знать как это работает есть маленькая ссылка внизу

    bellard.org/jslinux/tech.html

    This PC emulator is written in Javascript. The emulated hardware consists in:

    a 32 bit x86 compatible CPU
    a 8259 Programmble Interrupt Controller
    a 8254 Programmble Interrupt Timer
    a 16450 UART.

    The code is written in pure Javascript using Typed Arrays which are available in recent browsers. It was tested with Firefox 4 and Google Chrome 11 on Linux, Window and Mac (it does not work with Chrome 12 beta. As far as I know, it is a bug in the browser). In any case, a fast Javascript engine is needed to have good performance.

  • –3
    Я вот не очень понял. На JS написали конкретон ядро, с которым умудряются работать все GNU-утилиты. Или все команды — тоже реализация JS?
    • +15
      На JS написали эмулятор PC
    • +3
      На JS написали эмулятор x86 процессора (http://bellard.org/jslinux/tech.html). Ядро и комманды — настоящие бинарники.
      • +2
        грубо говоря, на этом полетит что угодно для этого проца. ms-dos, например. можно кваку запустить первую.
        • +4
          Написано же, что 16-и битные режимы пока не поддерживаются, поэтому MS-DOS запустить нельзя. И эмуляции видеокарты нет, поэтому графические игры тоже запустить нельзя (консоль работает через эмуляцию последовательного порта).
          • +3
            Да, вы правы. Тем не менее, я думаю, это не последняя версия эмулятора. Прикрутят 16-битные режимы, прикрутят видео, всё будет. И первая квака тоже будет.
          • +1
            И он так же написал что мог добавить поддержку всего этого, но в демонстрационных целях, решил обойтись необходимым для запуска ядра и приложений минимумом.

            Most of these restrictions are easy to remove, but I decided to implement the strict minimum to be able to use a recent Linux kernel and its user applications.
      • +4
        Причем эмулятор забавный — этот процессор обладает F00F багом =) И линукс его понимает и обходит. Прямо как на первых камнях.
    • +1
      Я так понял, что на JS написан эмулятор железа, поверх которого запускается обычный (чуть подпиленный) linux.
    • 0
      Сейчас я вам объясню… На JS написал эмулятор x86 процессора!
  • –13
    А самое главное — зачем...?
    • +7
      opportunities && incredible mind
    • +6
      Встроить в железо нативную поддержку JS, а затем из Google OS запускать старые игры (которые не поддерживают JavaScript 4.x) через эмулятор PC :)
    • +61
      «Science is not about why, it is about why not» (Portal 2)
      • +2
        да-да, кстати, во время прохождения тоже фраза зацепила :)
    • 0
      чтобы показать возможности виртуальной машины JavaScript?
    • +8
      physics is like sex. sure it may give some practical results but that's not why we do it

      Richard P. Feynman
    • +4
      Этот вопрос уже всех заебал!
      За шкафом!
  • +8
    O_O
  • 0
    Создал диры и файлик /var/spool/cron/crontabs/root
    crontab -e
    запустил crond
    работает.
  • –2
    у меня не работает в нём клавиша Пробел!!!
    • 0
      А у меня — клавиша "".
    • +1
      заработал, надо отключить плагины которые их интеруптят, вобщем в моём случае Smooth scroll
  • –53
    В то время, как дети в Африке голодают, у кого-то находится время на это… ©
    • +22
      Реально, лучше помогите детям, зачем вы это читаете? )
      • –37
        Мнда, скольким же людям, незнакомым с источником цитаты, нужно ставить смайл, чтобы доходила ирония.
        • +5
          Пишите по делу в следующий раз.
          Вас читают сотни людей.
          • –38
            Ваш менторский тон неуместен. Можете дать этот совет половине комментаторов этого топика. Впрочем, любого топика.
    • +19
      Пользы от вашего комментария в миллионы раз меньше, чем от эмулятора PC на Javascript, а дети всё продолжают голодать.
      • –26
        Уважаемые читатели без чувства юмора! Прошу вас воздержаться от дальнейшего комментирования моей ужасно неуместной реплики, самой тупой и бесполезной в этом треде, да и на всём сайте. Минуса в карму будет вполне достаточно. А всем прочим плюсы, чтобы мы знали, что такое хорошо и что такое плохо.
      • +39
        М… А какая польза от голодающих детей? По мне эмулятор полезнее.
  • 0
    После dd if=/dev/zero of=/dev/ram0:
    EXT2-fs error (device ram0): ext2_get_inode: bad inode number: 50
  • +3
    linux+canvas+storage+WebGL = PROFIT
    • +1
      осталось иксы отрисовать)
      • +3
        Если форвардить в WebGL, там ещё и эффекты будут :)
  • +3
    reboot -f работает
    • +2
      тоже первым делом пошёл проверять shutdown \ reboot \ halt.
      reboot -f подвешивает мой хром=)
      • +2
        не только хром, но и ff4 :)
      • 0
        Подвешивается только вкладка с эмулятором.
      • 0
        там должна быть надпись «Теперь питание компьютера можно отключить»
  • +9
    Недалекое будущее. ChromeOS 2.0. Открываешь браузер, идешь по ссылке и запускаешь любую ОС на любом процессоре. Гугл знал.
    • +6
      … а в ней запускаешь ChromeOS и опять по ссылке… :)
      • –2
        Я так в EyeOS делал.
        • –2
          Это комментарий к этому комментарию. Перепутал малость.
      • 0
  • +3
    Буду ждать вебсервер в браузере
    • +2
      Можно провести соревнование на хабре кто первый поднимет сетку(вроде уже подняли) и апач+пхп на этой виртуалке^^
      • 0
        Автор же написал что там только простейшие устройства эмулируются вроде таймера и контроллера прерываний. Поддержки сети нет в самом эмуляторе.
        • 0
          у меня есть некоторые мысли, как поднять сеть:
          поскольку в эмуляторе реализован UART (последовательный порт), значит к нему можно прикрутить виртуальный МОДЕМ, на который потом можно просто отправлять обычные AT-команды, вроде:
          AT+CGDCONT=1,"IP","internet"\r
          ATDT*99***1#\r

          и так далее…
          • 0
            Не, это-то понятно. Только смысл тут не в модеме, а в том что поверх пожно поднять pppd и уже пускать. Только нужно как минимум два порта, чтобы и консоль была. Ну или отвязывать от консоли на момент запуска.
            • 0
              pppd ведь это часть стандартной сборки линукса.
              Например httpd в этом эмуляторе уже встроен, и его запускали
              • +1
                Я в курсе
            • 0
              И, еще, сам UART не зависит от количества последовательных портов.
              Контроллер UART позволяет адресовать одновременно до 256 портов.
              При этом сами «порты» могут быть, как «железными», так и «виртуальными».
      • –1
        >> Можно провести соревнование на хабре кто первый поднимет…
        >>апач+пхп на этой виртуалке
        После добавления буфера обмена с возможностью закачки бинарников в виртуальную машину, установка php — плевое дело!
        Нужно всего лишь скомпилить php из исходников, и залить в нужное место.
        Бросаю вызов Хабрасообществу:
        — поднять пхп
        — запустить апач
        — залить пхпинфо.пхп
        — wget'ом достать выдачу скрипта
        — закачать в /dev/clipboard
        — скопировать содержимое буфера из окна браузера
        — запостить коммент с текстом выдачи (в качестве доказательства)

        ЗЫ: поскольку в выдаче будет html-разметка, перед публикацией коммента разрешается очистить выдачу от html-тегов
    • +2
      Да чё уж там. Ждём браузера в браузере.
      • +3
        Сюжет фильма Начало теперь кажется мне жутко банальным.
    • +25
      Зачем ждать?

      ~ # mkdir /www
      ~ # echo "Hello, habr" >/www/index.html
      ~ # httpd -h /www
      ~ # pwd
      /root
      ~ # wget 127.0.0.1/
      Connecting to 127.0.0.1 (127.0.0.1:80)
      index.html 100% |*******************************| 12 --:--:-- ETA
      ~ # cat index.html
      Hello, habr

      • 0
        А попробуйте ftp-сервер поднять (если есть свободное время) и закинуть туда что-нибудь?
        • 0
          Там нет внешней сети, только локалхост.

          А так — ftpd есть в комплекте. Правда, ftp-клиента нет, с аплодом проблемы (скачивать можно тем же wget'ом)
    • +5
      opera unity?
      • +2
        В смысле Unite?
  • 0
    Странно, у меня идет до

    VFS: Mounted root (ext2 filesystem).
    Freeing unused kernel memory: 124k freed

    и все…

    ни у кого нет такого?
    Chrome 12.0.742.53 beta-m, Win7
    • +3
      Читаем внимательно: (it does not work with Chrome 12 beta. As far as I know, it is a bug in the browser)
    • +1
      Что ж сегодня все такие внимательные. Не работает в 12 Хроме.
      • 0
        Ыть… спасибо! Я так загорелся посмотреть что так и не дочитал внимательно :)

        И все-таки это шедеврально!
    • 0
      Тоже самое, вот перезапускаю на FF4
    • –1
      Сказано же что с 12 Хромом проблемы! Что не понятного?!
    • 0
      писали же, на хроме бетке не работает.
      • +1
        и ведь я нажал Ф5 перед постингом… оО
  • +1
    >компилированные программы работают
    както туда получилось закинуть свои бинарники?
    Или там есть gcc?
    • +3
      Там есть tcc. Подробнее cat hello.c
      • +2
        Спасибо.
        Охренеть, там и vi есть.
    • +2
      там есть tcc, см. файл ~/hello.c
    • +2
      tcc (tiny c compiler) написанный им же

      * Чёрт, не могу комментить чаще чем раз в пять минут =( *
    • +4
      Еще никто об этом не сказал почему-то. Там же есть tcc, соберите им.
      • +1
        :) М-да, иронию то мы и не заметили.
  • +4
    но в реальности, если у вас есть линукс и есть — у вас есть все возможности

    Ехал есть через есть…
    • –2
      Опечатка — сеть.
  • +1
    А, как в него свой софт закачать?
    • +2
      Исходники можно написать через vi и скомпилить через tcc. Но с библиотеками будет напряженка — там даже libc толком нет.
      • –2
        Где-то здесь были статьи как писать без libc. Надо попробовать.
    • +2
      1. написать свой софт.
      2. скомпилировать свой софт.
    • 0
      можно поднять сетку и скачать wget'ом.
      • 0
        нельзя, сеть не эмулируется.
        • 0
          Думаю, можно сэмулировать wget как команду.
          • 0
            wget то там есть.
            • 0
              не-не, чтобы она внешняя была, её логику написать на яваскрипте, чтобы через XMLHttpRequest скачивала поток данных и возвращала уже внутрь основной системы. Тогда можно обойтись без эмуляции сети.
              • 0
                Тогда нужно вводить в эмулятор какую-то особую инструкцию, что бы можно было «выпрыгнуть» из sandbox'a. Текущий Linux выполняется как x86-код и ничего о браузере не знает. Лучше эмуляцию сетевого адаптера.
                • 0
                  вебсокеты кроме того что пока вырублены по дефолту, не обеспечивают нужный функционал для драйвера сетевой карты.
                  они не позволяют работать с raw-сокетами.
                  • 0
                    Тогда эмулятор вполне мог бы попробовать редиректить TCP-поток на openvpn-сервер, например.

                    Но если вопрос о «втаскивании» данные — то, наверное, действительно лучше сделать волшебный набор инструкций (как у VMWare). Или zmodem & sz/rz :)
                    • –6
                      какие умные комментарии)
    • +1
      модифицировать функцию load_binary() так чтоб она качала через AJAX образы с твоего сервера, и обновить root.bin так как надо.
      • 0
        Здорово!
  • +3
    btw, tcc тоже написал этот же человек :)
    • +3
      И зачинатель ffmpeg…
  • 0
    хехе

    ~ # ls -la                                                                      
    total 6                                                                         
    drwxr-xr-x    2 root     root          1024 May 17 10:56 .                      
    drwxr-xr-x   13 root     root          1024 May 16 16:33 ..                     
    -rw-------    1 root     root             7 May 17 10:56 .ash_history           
    -rw-r--r--    1 root     root           166 May 15 22:15 hello.c                
    ~ # cc hello.c -o h                                                             
    sh: cc: not found                                                               
    ~ # gcc hello.c -o h                                                            
    sh: gcc: not found                                                              
    ~ # tcc hello.c -o h                                                            
    ~ # ./h                                                                         
    Hello World                                                         
    
    • +3
      # cat hello.c

      сэкономил бы вам пару неудачных вызовов компилятора ;)
  • +20
    Всё, я фанат этого человека.
    • –7
      «Не сотвори себе кумира»
      • 0
        Ты же сам не понимаешь, что это значит…
        • –2
          о, самый умный, объясните в таком случае :)
          • 0
            Библия классическая, что тут взять.
            Как сказал мой знакомый, эмоции, терминология и предвзятость.
  • 0
    Круто, даже цвета поддерживает!
  • 0
    Жалко сеть не работает. А вообще js просто поражает, это нереально круто! Может лет через {n} увидим пингвина с иксами в браузере))
  • +6
    На Андроиде не взлетело
    • +29
      У меня мозг ломается, когда представляю такую цепочку абстракций.
    • +1
      Fennec пробовали?
    • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Ребята уже портировали линукс на калькуляторы и казалось бы куда стремиться дальше.
  • +2
    Однозначно — в избранное!
  • +1
    Интересно, а на этот эмулятор можно дугую операционку поставить? Например, PC-DOS?
    • 0
      ну это же эмулятор проца. конечно, можно.
      • +1
        16 bit не поддерживается, так что PC-DOS пока нет.

        И линукс там немного подпиленный.
  • –2
    wget только у меня не работает?
    • 0
      Сеть не эмулируется
      • +4
        Не эмулируются сетевые адаптеры, отличные от loopback. Но внутри сеть работает. Пример с httpd выше я привел.
  • 0
    Теперь осталось подключить сеть и научиться сохранять образы системы на диск.
    • 0
      тогда компания vmware не на шутку испугается:)
      • 0
        vmware это не только виртуализация как таковая, вы же отдаете себе отчет.
  • +1
    / # ls bin
    addgroup dnsdomainname iplink mt setarch
    adduser dumpkmap iproute mv sh
    ash echo iprule netstat sleep
    base64 ed iptunnel nice stat
    busybox egrep kill pidof stty
    cat false linux32 ping su
    catv fdflush linux64 ping6 sync
    chattr fgrep ln pipe_progress tar
    chgrp fsync login powertop touch
    chmod getopt ls printenv true
    chown grep lsattr ps umount
    cp gunzip lzop pwd uname
    cpio gzip makemime reformime usleep
    cttyhack hostname mkdir rev vi
    date hush mknod rm watch
    dd ionice mktemp rmdir zcat
    delgroup iostat more rpm
    deluser ip mount run-parts
    df ipaddr mountpoint scriptreplay
    dmesg ipcalc mpstat sed

    Интересно, и где это все хранится?
    Или же оно по-кусочкам через AJAX подгружается?
    • 0
      Хранилище же в js нынче есть. При старте системы можно видеть что аллоцируется 2 метра. Так же при старте грузятся 3 бинарника.
    • 0
      root.bin через ajax.
    • +1
      ls -la /dev/ramdisk
      mount /dev/ramdisk /mnt
      ls /mnt

      а сам ramdisk грузится вместе с ядром и кодом эмулятора при загрузке страницы.
    • 0
    • 0
      на ramdisk'e:
      The disk image is just a ram disk image loaded at boot time. It contains a filesystem generated with Buildroot containing BusyBox. I added my toy C compiler TinyCC and my unfinished but usable emacs clone QEmacs.
      • НЛО прилетело и опубликовало эту надпись здесь
  • +5
    Да это же Fabrice Bellard — никто иной как создатель qemu! Крутой дядька.
    • +2
      Он же основатель FFMPEG и автор рекорда 2009 года по числу вычисленных знаков числа Пи.
      Вот это Человечище!
    • +3
      гг, а кто-то его ещё помнит по LZEXE
      • 0
        Я помню. Да, дядька реально монстр
  • +1
    / # cowsay Hi
    sh: cowsay: not found

    :((((
    • 0
      ./cowsay Hi может сработать.
      • –1
        Нет, в корне его тоже нет :)
    • 0
      Есть tcc => почти есть и cowsay.
  • 0
    Эх, в браузере на N900 не стартует, жаль, былобы прикольно ))
    • 0
      там же и так полноценная линуха:)
  • 0
    такс а загрузчик как работает?
    • 0
      Загрузите cpux86.js в jsbeautifier.org/, там это видно.

      Бинарники (взятые по HTTP) загружаются в память, после чего выставляется регистр instruction pointer и дело передается эмулятору.
  • –2
    Очень удобно будет когда там будут утилита nmap. Огромный плюс в том что весь набор диагностики серверов может быть в одном месте и использовать его можно не через ssh а просто отрыв страничку.
    • 0
      С nmap не все просто, ведь JS не обеспечит low-level выход к сетевому адаптеру (nmap использует эту возможность для ручного формирования пакетов в некоторых режимах); если честно, я вообще не уверен, что в JS хватит прав написать хотя бы TCP/UDP-редиректор.
  • +2
    ~ # echo "#include int main(int argc, char **argv){ printf(\«Hello HA
    BRAHABR.RU\»); return 0;}" > habr.c
    ~ # tcc habr.c -o habr
    ~ # ./habr
    Hello HABRAHABR.RU~ #
    • +9
      ~# sed s/World/Habrahabr.ru/ -i hello.c
      ~# tcc -o hello hello.c
      ~# ./hello
      Hello Habrahabr.ru
      • +2
        tcc стайл же

        tcc -run - << EOF
        #include <tcclib.h>
        int main(int ac, char**av){ printf("Hello habrahabr\n"); return 0; }
        EOF
  • +3
    это круче чем виртуалка на флешке
  • –8
    Теперь разводить ботнеты станет как никогда легко и приятно.
    /антивирусные компании радостно потирают руки/
    • 0
      Как вы себе это представляете?
      • –4
        Пока не представляю, так как не занимаюсь разведением ботнетов.
        Но исполнить код в браузере намного легче, чем на самом хосте, вы согласны?
        • 0
          При чем тут проект эмулятора x86 cpu на js?
          • –9
            Как причем? Если технология станет популярной, то у многих в браузерах появится такой эмулятор. Значит в него начнут подсаживать всякую дрянь.
            • +6
              Мне кажется, Вы зря добавили слово «Hacker» к нику :-)
              • +1
                Надо было «X4k33r» — так бы хоть вопросов не возникало :)
  • 0
    Есть забавная идея, специалисты по JScript, подскажите, в стандарте ECMA 262 Typed Arrays есть? Не могу получить вразумительный ответ от спецификации.
  • –4
    ботнет на линуксах внутри браузера, я знал, что доживу
  • 0
    echo '#include <tcclib.h>; int main(int argc, char **argv) {printf(«hello ha
    br!\n»); return 0; }' > h5.c && tcc -o h5 h5.c && ./h5
    • +3
      Вы таки первый…
      • +2
        Да я открыл топик, когда небыло ниодного комменатрия. Потом отвлекли, вернулся — опубликовал коммент. Я так понял именно так я не один написал коммент.
  • +1
    теперь можно писать на ассемблере прям из-под браузера. брр
  • +1
    habrahabr.ru/blogs/programming/105028/

    хм…

    ~ # cat bf.c
    #include <tcclib.h>

    s[999],*r=s,*d,c;main(a,b){char*v=1[d=b];for(;c=*v++%93;)for(b=c%7?a&&(c&17?c&1
    ?(*r-=c-44):(r+=c-61):c&2?putchar(*r):(*r=getchar()),0):v;b&&c|a**r;v=d)
    main(!c,&b-1);d=v;}
    ~ # tcc -o bf bf.c
    bf.c:3: warning: assignment makes pointer from integer without a cast
    bf.c:3: warning: assignment makes pointer from integer without a cast
    bf.c:4: warning: assignment from incompatible pointer type
    bf.c:5: warning: assignment from incompatible pointer type
    ~ # ls -l bf
    -rwxr-xr-x 1 root root 2372 May 17 13:52 bf
    ~ # echo '++++++++++.' | ./bf
    Segmentation fault
  • 0
    Это круто!!!

    По сути теперь можно запускать в среде браузера программы на любом языке. На Си уже сейчас можно (даже компилировать).

    Пока это выглядит как for fun. Но если развить идею — она может стать революционной.
    • +2
      Ну запускать уже дано можно, используя тот же ideone.com/. Правдаон не на чистом JS работает.
    • +4
      На одном языке программирования можно написать интерпретатор другого.

      И правда, революция. Тьюринг торжествует.
  • 0
    Иксы запускаются? :D
  • –1
    А там система пакетов есть какая-нибудь? Хотелось бы попробовать загнать gcc и собрать какой-нибудь проект.
    • –1
      Там tinycc есть — через tcc запускается. Скачать что-то можно через ftpget, распаковать — через tar или unzip.
      • 0
        Скачать вряд ли получится — внешняя сеть не работает. А вот поднять ftp-сервер (ftpd там есть) на локалхосте и закинуть сорцы из основной системы — надо попробовать.
        • 0
          Через lo вы ничего не передадите. localhost в этой виртуалке и localhost на вашем компьютере — это разные локалхосты.
      • 0
        Только сеть пока не работает, чтобы скачивать…
      • 0
        Т.е. установить dpkg и apt теоретически возможно? tcc способно компилить большие пакеты? Есть аналог make?
        • 0
          Стоп. Это «обычный» линукс (busybox based), ваши вопросы с таким же успехом можно адресовать любому дистрибутиву. Будет глупо звучать, да? И, да, внешней сети нет и не предвидится пока что.
        • 0
          Теоретически можно собрать с помощью buildroot свой образ в котором будет gcc. Сети, увы, нет.
  • –1
    Вижу потенциальное применение для защиты исходников клиентского кода.
    И это не очень радует в плане безопасности.
    • 0
      Расшифруйте, что имеется в виду под «защитой исходников клиентского кода»?
      • 0
        JS-код загружается на клиента в исходном виде, а не компилированном. А тут появляется возможность загружать и исполнять бинарники, то есть скрывать исходный код.

        Но у меня есть подозрение, что вы меня сразу поняли :)
        • 0
          То есть сейчас так никто не делает, да? Просто вместо полноценного x86, эмулируется то что надо. Мы вот Forth-машину как-то сделали простую для этих целей.
          • –1
            Сейчас делает кое-кто. А скоро смогут все.
            Писать на C++ гораздо проще, чем делать/покупать Форт-машину, не так ли?
            • +3
              Фортмашина веселее :)
            • 0
              Смотря что писать. Можно эту же Форт-машину :)
  • НЛО прилетело и опубликовало эту надпись здесь
  • НЛО прилетело и опубликовало эту надпись здесь
    • НЛО прилетело и опубликовало эту надпись здесь
    • +4
      Аррргх! DileSoft, милый, вы топик и комментарии читали? :)
  • НЛО прилетело и опубликовало эту надпись здесь
    • +2
      а никак. сами подумайте, откуда там буфер? =)
      • НЛО прилетело и опубликовало эту надпись здесь
        • +2
          Это эмулятор проца. Он ничего про винду не знает. И про её буфер тоже.
          • НЛО прилетело и опубликовало эту надпись здесь
            • –2
              С точки зрения браузера — там просто текст. Как он туда может что-то вставить?)
              • НЛО прилетело и опубликовало эту надпись здесь
                • –1
                  И в любом случае — все нажатия передаются виртуальной машине. ИМХО, перехватывать часть их на уровне браузера — неправильно.
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • 0
                      Исходный код, конечно, не читал, но глянул. Причем здесь как это реализовано?
                      Нажатия Ctrl+C, Ctrl+V, Shift+Ins, etc обрабатывает виртуальная машина. И ИМХО неправильно какие-то из нажатий подменять на что-то другое на уровне браузера.
                      • НЛО прилетело и опубликовало эту надпись здесь
                        • +3
                          Нет, не смущает. Там все-таки ssh, а не виртуальная машина.
                          • НЛО прилетело и опубликовало эту надпись здесь
                            • +3
                              ИМХО, возможно, стоило бы сделать соответствующую кнопку (благо консоль не на всю страницу). Но реализовывать доступ к внешнему буфферу закрывая часть хоткеев для машины — на мой взгляд, неправильно с точки зрения идеалогии.
                              Впрочем, этот спор действительно бессмысленен — всё будет так, как решит Беллард)
                              • 0
                                То, что в любом ssh/rdp/vnc-клиенте поддерживается вставка из клиентского клипборда — это тоже идеологически неправильно? Сделайте, в конце концов, кнопку «Paste» под терминалом, если у нас такие строгости…
                                • 0
                                  Нельзя.
                                  • 0
                                    Но можно сделать отдельное поле, куда можно будет вставить текст, а потом отправить его кнопкой на консоль.

                                    (Насколько я знаю.)
                                    • 0
                                      Именно так вчера (по многочисленным просьбам трудящихся) и сделал многоуважаемый автор эмулятора, добавив доступ к витруальному устройству /dev/clipboard через поле в окне браузера
                      • +3
                        Вообще-то, в данном случае терминал и эмулируемый комп соединены по com-порту. И идеологически комбинацию Ctrl-V получает терминал. А потом он уже может передать коды клавишь в виртуальную машину.
    • +1
      тут написано: bellard.org/jslinux/faq.html
      вкратце — справа от эмулятора текстовое поле, в него вставляешь текст, потом cat /dev/clipboard
      • НЛО прилетело и опубликовало эту надпись здесь
        • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Вообще супер!
        А то я уж было хотел искать подходящий плагин к фаерфоксу, который вставлял бы содержимое буфера обмена в окно браузера, эмулируя нажатия клавиш.
        И даже хотел бинарники закачивать, предварительно преобразовав их в base64.
        И у меня тогда оставалась нерешенной лишь проблема экспорта данных из виртуальной машины.
        Теперь же все гораздо проще и прозрачнее стало.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      При чем тут политики браузера?
      • НЛО прилетело и опубликовало эту надпись здесь
        • +8
          DileSoft, расскажите немного о себе, прошу вас.
          • НЛО прилетело и опубликовало эту надпись здесь
        • –1
          Простите за сарказм выше. Линукс ничего не знает о вашей сети, о вашем браузере и т.д., он запущен в рамках «простейшего» (ну относительно остальных) эмулятора x86 процессора. Видение вашей сети в конкретном случае — задача далеко не тривиальная. Как минимум нужна низкоуровневая прослойка между ОС в песочнице и какими-либо технологиями (выше в комментариях дело писали) уже на стороне браузера.
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Тогда и скрипт придется запускать с этого же порта. И это уже все слишком сложно становится…
  • –10
    И все таки.
    Зачем?
    • +3
      В таких топиках этот вопрос еретический:)
      • –9
        Это должно влиять на мою свободу слова?
        Я задал вопрос. Где ответы? Пусть аргументированно ответит тот, кто минус поставил ни за что. Мне кажется, ему слабо )
        «В таких топиках» обычно распределение обязанностей: 9 срут минусами из всех дыр неудавшейся жизни, 1 за них пишет что-нибудь, о чем они и не знали )
        • +2
          Это перефразированная цитата с заседания ММО (московского математического общества).
          -Да, интересный результат. А зачем он нужен?
          -Это еретический вопрос. Пытаясь ответить на него, мы неизбежно упремся в неразрешимый вопрос «зачем заниматься математикой».


          Я имел в виду, что такие вещи интересны и сами по себе. Понятно, что на ранних этапах практического смысла они иметь не могут.
          В перспективе — возможность быстренько воспользоваться чем-нибудь linux only. Или демонстрация и обучение.
    • +1
      вы абсолютно правы, все тщетно, все зря.
      • –9
        Ну я ж говорил, внятно ответить хер кто сможет, да и не захочет. Отвечает один нормальный человек, а остальные комменты — с полезностью ниже нуля, от быдлошкололо, единственная цель которых — высраться )
        • 0
          задам вам наводящий вопрос, а зачем люди дома делают мебель/посуду?
          • +1
            зачем собирают марки, ходят в горы, пишут картины/стихи?
            • +1
              Продолжая мысль: зачем пишут статьи и комментарии на хабре?
        • +1
          В перспективе можно фигачить нативные приложения в браузере (Google вон уже не первый год мучается с NaCl для этих целей). А тут proof of concept, что, в прицнипе, эмулятор + sandbox можно замутить на чистом JS (кроссбраузерно же!). Это же дико круто. Тут идей можно плодить и плодить.
        • +3
          Ну вот не удержался — покормил.
  • +1
    Прочитал заголовок, первая мысль: JUnix откопали. А тут такое!
  • –4
    Пора пересмотреть политики браузеров по защите всего и вся.
  • –3
    Мега охренеть! Чуваку Нобелевскую неменьше!
  • 0
    А есть какой — ниубдь чёрный ход в этой штуке? Потому — что затащить какой — нибудь файл туда, кроме как наклацать его в vi, способа пока не вижу.
    • 0
      В принципе, можно посмотреть в сторону ya.load_binary в cpux86.js и заливать бинарные данные либо в память (а затем считывать изнутри), либо поменять содержимое бинарника с линуксом, добавив нудные файлы.

      Но, все таки, хочется полноценную сеть :)
      • 0
        Полноценная сеть вряд ли будет. Ибо нужен более-менее низкий уровень, который не получить ни через js, ни даже (скорее всего) через плагины к браузеру.
        Разве что какая-нибудь java или native client, но это уже не то...)
        • +1
          мне видится такое развитие: магическая инструкция, выполняющая произdольный js на «низком уровне», библиотека к tcc на базе неё, пара утилит, ну а потом уже можно и блочное устройство забабахать с XMLHttpRequest к локалхосту :)
        • 0
          С использованием web-socket мы можем создать паравиртуализированный драйвер сети с выходом на железный машрутизатор и получить нормальную сеть

  • 0
    Если запустить на нём спеки — пройдёт несколько лет пока они добегут — и к этому моменту и браузер, и железо успеют устареть! :)
  • 0
    Мужик просто монстр!!! Сделать такое на javascript нужно быть минимум гением!!!
  • +1
    Это всё взаправду? Меня не покидает ощущение обмана, и в голове вертятся фантастические сценарии. Что, например, используются уязвимости браузеров, чтобы запустить процесс с виртуальтной машиной из под клиенсткой операционкой. Ну или виртуалка крутится на сервере, а JScript через ajax просто транслирует её вывод. Я несерьёзно, просто тяжело поверить что кто-то написал эмулятор PC на JS.
    • 0
      опечатался: из-под клиентской операционки
    • +1
      Оно на армном кирпиче завелось, так что опасения беспочвенны.
    • +3
      Меня удивляет другое. Почему Вы так удивлены?
  • 0
    Идея действительно потрясающая )
    Скажите, а почему грузится vmlinux.bin, root.bin, linuxstart.bin? Может же грузится только жесткий диск (hardware.img) и загрузка начинаться именно с жесткого диска?
    Если бы это был только один файл системы, то возможно было бы немного модифицировать клиентский JS код, чтобы загружать с какого-то своего жесткого диска, с ftp, к примеру.
    А еще лучше, можно было делать hibernate и обмениваться (сохранять, загружать) жесткие диски.
    • +2
      У этого процессора нет реального режима, в котором работает загрузчик с «жёсткого диска». Ядро кладётся прямо в память и оттуда же исполняется, сразу в защищённом.
  • 0
    Ладно, колемся. Кому-то удалось уже запустить на локалхосте?
    • +2
      А в чём проблема? Я скачал cpux86.js index.html linuxstart.bin root.bin term.js vmlinux26.bin, работает. Ещё root.bin раcширил немного, думаю как бы ещё увеличить, ато 4 мегабайта потолок на ramfs — это не ок, а ядро это лень пересобирать :)
      • 0
        Плохо что при инициализации рам диска данные из root.bin перемещаются в памяти, а то можно было бы сделать сохранение образа по быстрому. А так у меня слишком руки кривые.

        Фактически с помощью ya.ld8_phys($addr) можно сдампить хоть всю память, а это дает возможность делать простенькие «драйвера», что бы можно было изнутри вылезти наружу. Хотя бы в браузер.
      • 0
        Да в том и проблема. Скачал тоже все эти файлы, запустил, доходит до собственно выполнения linuxstart.bin и там виснет в цикле «интерпретатора»( Иначе бы и не спрашивал.
  • 0
    Тяжко было выключать крестиком вкладки браузера…
  • 0
    У одного меня зеленый курсор мигает в левом верхнем углу. И… всё!
    • 0
      В моём firefox6 то же самое. В firefox4 всё работает.
      • 0
        Хром 11 — Аналогично.
  • +1
    даешь клауды на броузерах клиентов
  • 0
    кто нибуть уже KDE пробовал ставить? :)
  • +2
    Приятная новость!
    Вчера был добавлен долгожданный текстовый буфер обмена.
    Несмотря на то, что он текстовый, есть возможность загружать в виртуальную машину произвольные бинарники.
    А, теперь, самое вкусное: появилась возможность выгружать любые файлы из виртуальной машины назад, в окно браузера!
  • 0
    Opera 11.11, работает! На андроиде в стандартном (Desire, 2.3) тоже, Опера Мобайл помучилась, после чего схлопнулась :)
    • 0
      Автор уже сделал поддержку браузеров без TypedArrays. Запустил локально. Просто изумительно!
  • 0
    WOW! Я новенький в мире Linux. Такой тренажер — то, что нужно в данный момент. Буду тренироваться на работе. Спасибо автору поста и создателю этого чуда!
  • 0
    Работает на Safari в iOS 4.3.5. Жаль, но не удалось вызвать клавиатуру для ввода в терминал.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.