NodeOS: операционная система на основе JavaScript
Опубликовано: 2022-03-11Я уверен, что большинство программистов слышали о Node.js, но как насчет NodeOS? Да, NodeOS, операционная система, написанная на Node.js. Ну типа. NodeOS использует ядро Linux для большинства критичных к производительности вещей, таких как, например, взаимодействие с оборудованием, но для всего остального использует Node.js. Разработка NodeOS началась два года назад и была создана людьми, которые поделились простой, но интригующей идеей: «Можно ли создать операционную систему, используя только Node.js?»
В чем проблема?
Прежде всего, подумайте о прогрессе, достигнутом Node.js за короткое время. Теперь подумайте о том же, что происходит с операционной системой. Тогда давайте добавим к нему кое-что интересное.
Независимая от пользователя и изолированная корневая файловая система
NodeOS представила интересную парадигму: если у всех пользователей есть изолированная файловая система, она дает им простую иерархию файловой системы для работы. Поскольку их «домашняя папка» фактически является корнем их собственной иерархии файловой системы, они могут устанавливать пакеты глобально, не требуя специальных разрешений, и им не нужно ничего настраивать, поскольку по умолчанию они устанавливаются в свой домашний каталог. Кроме того, он обеспечивает хорошую безопасность; если хакер находит способ проникнуть внутрь определенной учетной записи в операционной системе, единственный раздел, к которому он/она может получить доступ, — это раздел этого пользователя. Конечным результатом является то, что хакер не может скомпрометировать всю систему.
Node.js и NPM
Если подумать, операционная система, использующая Node.js, означает, что любой пакет, доступный в NPM, одновременно является пакетом NodeOS. На момент написания было 210 735 пакетов; поскольку количество пакетов NPM растет каждую минуту, не будет ничего странного, если через несколько лет в NodeOS будет миллион приложений.
Он основан на ядре Linux
Это может показаться не таким уж большим делом, но Linux — наиболее часто используемая серверная операционная система. Поскольку NodeOS основана на ядре Linux, вы можете запускать любое приложение, написанное для других дистрибутивов Linux, с минимальными изменениями.
Недостатки
Как бы мне ни хотелось готовой NodeOS, ее пока нет. В нем по-прежнему отсутствуют многие ключевые функции для серверной операционной системы. Например, отсутствует весь набор инструментов BASH, включая ps, tail, nano и grep. Кроме того, вы не можете запустить его как настольную операционную систему, поскольку у нее нет графического интерфейса. Конечно, вы можете довольно легко реализовать некоторые недостающие функции, используя немного JavaScript, но тот факт, что все упомянутые функции недоступны по умолчанию, не очень хорош.
Итак, как я могу попробовать NodeOS?
Использование Докера
Самый простой и быстрый способ опробовать NodeOS — использовать следующее:
- Компьютер с Mac OSX или Linux. Возможно, это работает с Windows, но я не пробовал.
- Докер.
После того, как вы установили Docker, запустить экземпляр NodeOS очень просто. Все, что вам нужно сделать, это выполнить следующую команду, и Docker сделает всю магию:
sudo docker run -t -i nodeos/nodeos
Когда вы запускаете вышеупомянутую команду, Docker автоматически загружает образ диска для NodeOS из репозитория и выполняет установку NodeOS внутри виртуальной машины. После завершения установки открывается сеанс SSH с оболочкой NodeOS.
Без докера
Есть несколько причин, по которым вам следует избегать использования Docker, и одна из них — последняя версия NodeOS. На момент написания последнее изменение Docker-образа NodeOS было выполнено два месяца назад, а версия для разработки была обновлена шесть дней назад. Итак, если вы хотите использовать последнюю версию, вам обязательно нужно получить исходный код. Это не слишком сложно, но занимает много времени. Тебе понадобится:
- Компьютер с линуксом. Вы можете скомпилировать его в OS X, но это займет больше времени, так как придется выполнять кросс-компиляцию. То же самое касается Windows.
- Утилиты сборки Linux (make, g++, gcc, autoconf).
- Кему.
- Время. Серьезно, много.
Когда у вас есть все, вы можете приступить к компиляции исходного кода:
- Загрузите исходный код проекта:
bash git clone [email protected]:NodeOS/NodeOS.git
. - Скомпилируйте его, выполнив следующие команды:
cd NodeOS
иnpm install
. - Я собираюсь дословно процитировать официальную документацию: «Возьми попкорн для микроволновки и иди в кино. Нет, правда, сделай это». . Да, это займет столько времени, так что займитесь чем-нибудь интересным.
- Запустите
bash npm start
, чтобы запустить NodeOS внутри Qemu.
Это работает?
После завершения установки мы можем проверить, работает ли она, выполнив внутри оболочки NodeOS команду ls
. Должен появиться такой вывод:
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
Если это так, это означает, что некоторые основные команды работают. Но что, если мы хотим отобразить IP-адрес сетевой карты? В Linux есть команда ifconfig
, которая делает именно это; давай попробуем:
command not found: ifconfig
Похоже, команда ifconfig
отсутствует. Это связано с тем, что в NodeOS нет команды ifconfig
по умолчанию. Что теперь? Ну, это просто; NodeOS имеет встроенный менеджер пакетов (например, apt
или yum
), называемый npkg
, который основан на Node NPM и прост в использовании. Установить ifconfig
так же просто, как выполнить следующую команду:
npkg install bin-ifconfig
Если все прошло хорошо, команда ifconfig
теперь должна быть доступна в оболочке. Если мы попытаемся выполнить его снова, появится вывод, подобный этому (я поставил случайный MAC-адрес и IP-адрес по понятным причинам):
eth0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 01:23:45:67:89:ab inet6 f0cd::ef01:0203:0405:181%en1 prefixlen 64 scopeid 0x5 inet 192.168.0.21 netmask 0xffffff00 broadcast 192.168.0.21 nd6 options=1<PERFORMNUD> media: autoselect status: active
Если ваш вывод выглядит примерно так, то он работает. Вы успешно установили свое первое приложение NodeOS: ifconfig
.
Это работает. Однако что нам теперь делать с ОС?
Какой смысл иметь операционную систему, написанную на Node.js, если вы можете делать то же самое (или даже меньше), что и в Ubuntu или любом другом дистрибутиве Linux? Ну, все дело в том, что все разрабатывается с использованием только Node.js. Это также означает, что мы можем разрабатывать наши приложения, используя только Node.js. Например, в NodeOS нет стандартной реализации команды man
, которая используется в Linux для отображения справочных страниц других команд. Не бойтесь, реализовать это просто. Как, я слышу, вы спрашиваете? Простой.

Во-первых, давайте установим текстовый редактор под названием Hipster, чтобы мы могли создавать и редактировать файлы, выполнив следующую команду: npm install -g [email protected]
. Этот файловый редактор прост, и я определенно не стал бы использовать его в качестве редактора для чего-либо еще, но в данном случае он достаточно хорош. Создавать файлы с помощью Hipster очень просто, просто запустите hip filename
, например hip package.json
; для сохранения нажмите Ctrl + s
и для выхода нажмите Ctrl + q
. В этом примере я собираюсь использовать код, разработанный одним из основных разработчиков NodeOS, но сам я его фактически не реализовывал. Исходный код для нашего примера можно найти в Git-репозитории node-bin-man.
Вернемся к созданию нашего первого приложения NodeOS. Как и в случае любого приложения Node.js (или пакета NPM), мы начинаем с создания файла package.json
, как в следующем примере:
{ "name": "bin-man", "version": "0.0.1", "description": "Format and display manual pages", "bin": { "man": "man.js" }, "repository": "https://github.com/groundwater/node-bin-man", "author": "groundwater", "license": "MIT", "dependencies": { "blessed": "~0.0.22" } }
Параметры name
, version
, author
, repository
, license
и description
говорят сами за себя. Коллекция bin
— это объект типа ключ/значение JSON, содержащий имя команды и связанный файл JavaScript. В нашем примере команда man
связана с файлом man.js
Коллекция dependencies
содержит список пакетов NPM, которые необходимы для использования этого приложения. В нашем примере автор кода включил Blessed, похожую на curses библиотеку с высокоуровневым API интерфейса терминала для Node.js.
Теперь давайте перейдем к основной части, собственно коду.
#!/usr/bin/env node
Эта часть называется «шебанг». На самом деле это не требуется для NodeOS, но сообщает операционной системе, как выполнить следующий код. В нашем случае он сообщает интерпретатору, что все нужно выполнить командой /usr/bin/env node
.
var fs = require('fs'); var blessed = require('blessed');
Как и в Node.js, функция require()
загружает выбранный пакет в память и сохраняет его в указанной переменной.
var arg = process.argv[2] || 'bin-man';
Стандартное поведение команды man
состоит в том, чтобы сообщить руководству о себе, если никакая другая команда не указана. Наш пример кода делает то же самое: если для второго параметра не указан аргумент (первым является сам man), по умолчанию используется bin-man.
var path = process.env.HOME + "/lib/node_modules/" + arg + "/README.md"; try{ var readme = fs.readFileSync(path, 'utf-8'); }catch(e){ console.log('No README.md for Package ',arg); process.exit(-1); }
На этом этапе программа проверяет, существует ли файл readme для данного приложения. В NodeOS путь установки каждого приложения — это домашний каталог (или /
), за которым следует каталог lib/node_modules
. Если файл README.md
существует, он сохраняет свое содержимое внутри переменной readme
. В противном случае он показывает ошибку и завершает процесс.
// Create a screen object. var screen = blessed.screen(); var box = blessed.box({ content: readme, alwaysScroll:true, scrollable: true, }); // Append our box to the screen. screen.append(box);
У Blessed очень простой API; показать содержимое файла так же просто, как сказать ему создать box
и загрузить содержимое.
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
Теперь давайте создадим способ выхода из приложения man
. Мы комбинируем клавиши escape
, q
или комбинацию Cc
в стиле emacs, чтобы выйти из процесса.
screen.key(['space','f','j','n'], function(ch, key) { box.scroll(box.height); screen.render(); }); screen.key(['down'], function(ch, key) { box.scroll(1); screen.render(); }); screen.key(['up'], function(ch, key) { box.scroll(-1); screen.render(); }); screen.key(['b','k','p'], function(ch, key) { box.scroll(-box.height); screen.render(); });
Мы используем клавиши направления для прокрутки вверх или вниз на одну строку и клавиши space
, f
, j
или n
для прокрутки страницы вниз (столько строк, сколько есть на экране). Используйте b
, k
или p
, чтобы сделать обратное.
box.focus(); screen.render();
Наконец, мы говорим приложению сфокусироваться на созданном нами box
и визуализировать его целиком. Давайте поместим эти файлы в каталог /lib/node_modules/bin-man
и добавим простой README.md
, что-то вроде этого:
# Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```
Мы почти закончили с нашим первым пользовательским приложением для NodeOS. Остается только один последний маленький шаг; нам нужно создать файл конфигурации, так как это требование для приложений NodeOS. Это так же просто, как создать файл по пути /etc/bin-man/config.json
со следующим содержимым: {}
, пустой объект JSON. Теперь мы можем попробовать наше новое приложение. Запуск man
внутри оболочки NodeOS должен показать файл readme, который мы создали ранее.
Заключение
Как видно из нашего простого примера кода, реализация чего-либо в NodeOS — простая задача, вам нужно только знать Node.js.
У NodeOS большой потенциал, и я думаю, что после реализации дополнительных функций она может стать отличной операционной системой. Над ней все еще нужно работать, но в результате популярности всей экосистемы на основе Node.js я не удивлюсь, если она быстро станет популярной операционной системой. Что вы думаете об этом? Дай мне знать в комментариях.