NodeOS: el sistema operativo basado en JavaScript

Publicado: 2022-03-11

Estoy seguro de que la mayoría de los programadores han oído hablar de Node.js, pero ¿qué pasa con NodeOS? Sí, NodeOS, un sistema operativo escrito en Node.js. Bueno, algo así. NodeOS usa el kernel de Linux para la mayoría de las cosas críticas de rendimiento como, por ejemplo, las interacciones de hardware, pero para todo lo demás usa Node.js. El desarrollo de NodeOS comenzó hace dos años y fue creado por personas que compartieron una idea simple pero intrigante: "¿Es posible crear un sistema operativo usando solo Node.js?"

Tabla de evolución de Darwin

¿Es posible crear un sistema operativo usando solo Node.js?
Pío

¿Cuál es el problema?

En primer lugar, piense en el progreso que ha hecho Node.js en el poco tiempo que ha existido. Ahora, piense en lo mismo que sucede con un sistema operativo. Luego, agreguemos algunas cosas geniales.

Sistema de archivos raíz aislado e independiente por usuario

NodeOS introdujo un paradigma interesante: si todos los usuarios tienen un sistema de archivos aislado, les brinda una jerarquía de sistema de archivos simple con la que trabajar. Dado que su "carpeta de inicio" es, de hecho, la raíz de su propia jerarquía del sistema de archivos, pueden instalar paquetes globalmente sin requerir permisos especiales y no necesitan configurar nada, ya que están instalados en su directorio de inicio de forma predeterminada. Además, proporciona mucha seguridad; si un pirata informático encuentra una manera de ingresar a una cuenta en particular en el sistema operativo, la única partición a la que puede acceder es la partición de ese usuario. El resultado final es que el hacker no puede comprometer todo el sistema.

Node.js y NPM

Si lo piensas bien, un sistema operativo que usa Node.js significa que cualquier paquete disponible en NPM es, al mismo tiempo, también un paquete de NodeOS. Al momento de escribir, hay 210,735 paquetes; dado que la cantidad de paquetes NPM crece cada minuto, no sería extraño que, en unos años, NodeOS tenga un millón de aplicaciones.

Está basado en el kernel de Linux.

Esto puede no parecer un gran problema, pero Linux es el sistema operativo de servidor más utilizado. Dado que NodeOS se basa en el kernel de Linux, puede ejecutar todas las aplicaciones escritas para otras distribuciones de Linux con cambios mínimos.

las desventajas

Por mucho que me gustaría un NodeOS terminado, todavía no está allí. Todavía le faltan muchas funciones clave para un sistema operativo de servidor. Por ejemplo, falta todo el conjunto de herramientas BASH, incluidos ps, tail, nano y grep. Además, no puede ejecutarlo como un sistema operativo de escritorio ya que no tiene GUI. Claro, puede implementar algunas de las funciones que faltan con bastante facilidad usando un poco de JavaScript, pero el hecho de que todas las funciones mencionadas no estén disponibles de forma predeterminada no es bueno.

Entonces, ¿cómo puedo probar NodeOS?

Uso de la ventana acoplable

La forma más fácil y rápida de probar NodeOS es usando lo siguiente:

  1. Una computadora con Mac OSX o Linux. Podría funcionar con Windows, pero no lo probé.
  2. Estibador.

Una vez que instaló Docker, ejecutar una instancia de NodeOS es fácil. Todo lo que necesita hacer es ejecutar el siguiente comando, y Docker hace toda la magia:

 sudo docker run -t -i nodeos/nodeos 

La forma más fácil y rápida de probar NodeOS es usando Docker

La forma más fácil y rápida de probar NodeOS es mediante Docker.
Pío

Cuando ejecuta el comando mencionado anteriormente, Docker descarga automáticamente la imagen de disco para NodeOS desde un repositorio y realiza la instalación de NodeOS dentro de una máquina virtual. Una vez que se completa la instalación, abre una sesión SSH en el shell de NodeOS.

sin ventana acoplable

Hay algunas razones por las que querría evitar el uso de Docker, y una de ellas es la última versión de NodeOS. Al momento de escribir este artículo, el último cambio en la imagen de Docker de NodeOS se realizó hace dos meses, mientras que la versión de desarrollo se actualizó hace seis días. Por lo tanto, si desea utilizar la última versión, definitivamente debe obtener el código fuente. Eso no es demasiado difícil, pero lleva mucho tiempo. Necesitará:

  1. Una computadora con Linux. Puede compilarlo en OS X, pero llevará más tiempo ya que tiene que hacer una compilación cruzada. Lo mismo ocurre con Windows.
  2. Las utilidades de construcción de Linux (make, g++, gcc, autoconf).
  3. Qemu.
  4. Hora. En serio, mucho.

Una vez que tenga todo, puede continuar con la compilación del código fuente:

  1. Descargue el código fuente del proyecto: bash git clone [email protected]:NodeOS/NodeOS.git .
  2. Compílelo ejecutando los siguientes comandos: cd NodeOS y npm install .
  3. Voy a citar, palabra por palabra, la documentación oficial: “Toma palomitas de maíz para microondas y ve a ver una película. No, de verdad, hazlo. . Sí, tomará mucho tiempo, así que haz algo interesante mientras tanto.
  4. Ejecute bash npm start para ejecutar NodeOS dentro de Qemu.

¿Está funcionando?

Una vez finalizada la instalación, podemos comprobar si está funcionando ejecutando dentro del shell de NodeOS el comando ls . Debería aparecer una salida como esta:

 [ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]

Si es así, significa que algunos comandos básicos están funcionando. Pero, ¿y si queremos mostrar la dirección IP de la tarjeta de red? Bajo Linux, hay un comando llamado ifconfig que hace precisamente eso; Vamos a intentarlo:

 command not found: ifconfig

Parece que falta el comando ifconfig . Esto se debe a que NodeOS no tiene un comando ifconfig predeterminado. ¿Ahora que? Bueno, es simple; NodeOS tiene un administrador de paquetes integrado (como apt o yum ), llamado npkg , que se basa en NPM de Node y es fácil de usar. Instalar ifconfig es tan simple como ejecutar el siguiente comando:

 npkg install bin-ifconfig

Si todo salió bien, el comando ifconfig ahora debería estar disponible en el shell. Si intentamos ejecutarlo nuevamente, aparece una salida como esta (puse una dirección MAC y una dirección IP aleatorias por razones obvias):

 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

Si su salida se ve así, entonces está funcionando. Ha instalado con éxito su primera aplicación NodeOS: ifconfig .

Está funcionando. Sin embargo, ¿qué hacemos ahora con el sistema operativo?

¿De qué sirve tener un sistema operativo escrito en Node.js si puedes hacer las mismas cosas (o incluso menos cosas) que puedes hacer en Ubuntu o cualquier otra distribución de Linux? Bueno, el punto es que todo se desarrolla usando nada más que Node.js. También significa que podemos desarrollar nuestras aplicaciones usando nada más que Node.js. Por ejemplo, NodeOS no tiene una implementación predeterminada para el comando man , que se usa en Linux para mostrar páginas de manual de otros comandos. No temas, implementarlo es fácil. ¿Cómo, te escucho preguntar? Sencillo.

Construyendo una aplicación NodeOS con Node.js

Primero, instalemos un editor de texto llamado Hipster para que podamos crear y editar archivos ejecutando el siguiente comando: npm install -g [email protected] . Este editor de archivos es simple, y definitivamente no es algo que usaría como editor para otra cosa, pero es lo suficientemente bueno en este caso. Crear archivos con Hipster es realmente simple, simplemente ejecute hip filename , como hip package.json ; para guardar presione Ctrl + s y para salir presione Ctrl + q . Para este ejemplo, voy a usar un código desarrollado por uno de los principales desarrolladores de NodeOS, en realidad no lo he implementado yo mismo. El código original de nuestro ejemplo se puede encontrar en el repositorio Git de node-bin-man.

Volvamos a crear nuestra primera aplicación NodeOS. Como con cada aplicación Node.js (o paquete NPM), comenzamos creando un archivo package.json , como en el siguiente ejemplo:

 { "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" } }

Los parámetros name , version , author , repository , license y description se explican por sí mismos. La colección bin es un objeto de clave/valor JSON que contiene el nombre del comando y un archivo JavaScript asociado. En nuestro ejemplo, el comando man está asociado con el archivo man.js La colección, dependencies , contiene una lista de paquetes NPM que se necesitan para usar esta aplicación. En nuestro ejemplo, el autor del código incluyó a Blessed, una biblioteca similar a curses con una API de interfaz de terminal de alto nivel para Node.js.

Ahora vayamos a la parte principal, el código real.

 #!/usr/bin/env node

Esta parte se llama "shebang". En realidad, NodeOS no lo requiere, pero le dice a un sistema operativo cómo ejecutar el siguiente código. En nuestro caso, le dice al intérprete que todo debe ejecutarse con el comando /usr/bin/env node .

 var fs = require('fs'); var blessed = require('blessed');

Al igual que en Node.js, la función require() carga el paquete seleccionado en la memoria y lo guarda en la variable especificada.

 var arg = process.argv[2] || 'bin-man';

El comportamiento estándar de un comando man es informar a un manual sobre sí mismo si no se especifica ningún otro comando. Nuestro ejemplo de código está haciendo lo mismo: si no se especifica ningún argumento para el segundo parámetro (el primero es el propio hombre), el valor predeterminado es 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); }

En este punto, el programa verifica si existe un archivo Léame para la aplicación dada. En NodeOS, la ruta de instalación de cada aplicación es el directorio de inicio (o / ) seguido del directorio lib/node_modules . Si el archivo README.md existe, guarda su contenido dentro de la variable readme . De lo contrario, muestra un error y sale del proceso.

 // 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 tiene una API realmente simple; mostrar el contenido de un archivo es tan fácil como decirle que cree un box y cargar el contenido.

 screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });

Ahora, creemos una forma de salir de la aplicación man . Combinamos las teclas escape , q o la combinación estilo emacs Cc para salir del proceso.

 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(); });

Usamos las teclas direccionales para desplazarnos hacia arriba o hacia abajo una fila y las teclas space , f , j o n para desplazarnos hacia abajo una página (tantas líneas como haya en pantalla). Use b , k o p para hacer lo contrario.

 box.focus(); screen.render();

Finalmente, le decimos a la aplicación que se concentre en el box que creamos y renderice todo. Pongamos esos archivos en el directorio /lib/node_modules/bin-man y agreguemos un README.md simple, algo como esto:

 # Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```

Casi hemos terminado con nuestra primera aplicación personalizada para NodeOS. Sólo queda un último pequeño paso; necesitamos crear un archivo de configuración ya que es un requisito para las aplicaciones de NodeOS. Es tan sencillo como crear un archivo en la ruta /etc/bin-man/config.json con el siguiente contenido: {} , un objeto JSON vacío. Ahora, podemos probar nuestra nueva aplicación. Ejecutar man dentro del shell de NodeOS debería mostrar el archivo Léame que creamos anteriormente.

Conclusión

Como puede ver con nuestro ejemplo de código simple, implementar cualquier cosa en NodeOS es una tarea fácil, solo necesita conocer Node.js.

NodeOS tiene mucho potencial y creo que podría convertirse en un gran sistema operativo una vez que se implementen funciones adicionales. Todavía necesita trabajo, pero como resultado de la popularidad de todo el ecosistema basado en Node.js, no me sorprendería si se convierte rápidamente en un sistema operativo popular. ¿Qué piensa usted al respecto? Házmelo saber en los comentarios.