Jesús Leganés Combarro

piranna@gmail.com

Móstoles, 25 de mayo de 2016

¿Qué es NodeOS?

  • Sistema operativo minimalista basado en Linux , Node.js y npm
  • Originalmente desarrollado por Jacob Groundwater
  • Actualmente, soy el desarrollador principal del proyecto

¿Qué tiene de especial?

  • Diseño minimalista
    • kernel Linux + Node.js
    • Altamente personalizable
  • Seguro
    • máquina virtual = aislado del sistema subyacente
    • Permisos de archivos (demasiado) restrictivos
      • Usuarios aislados entre sí y del sistema
      • No hay usuarios privilegiados

¿A quién va dirigido?

  • Cloud computing
    • Menos recursos = más instancias
    • Fácil administración (npm)
    • Sistemas solo con las aplicaciones necesarias
  • Educación y "Homebrew"
    • Todo el código es accesible directamente
    • Fácil de aprender, entender y programar
    • Altamente personalizable y "hackeable"

Arquitectura de NodeOS

Capa 0: cross-toolchain

  • Basada en Cross Linux from Scratch
    • usando musl en vez de glibc
    • menos memoria y más rendimiento
  • Totalmente automatizado
    • Descarga, parchea y compila automáticamente las cabeceras de Linux y los fuentes GCC y musl
    • Solo necesario definir la plataforma de destino (por defecto, la actual)
  • Integrado como paquete npm
    • usable por otros módulos

Capa 1: barebones

Capa 1: barebones

  • Linux 4.5
    • Compilado estáticamente (sin módulos)
    • Configuración por defecto para cada plataforma
    • Eliminados componentes superfluos
      • Sistemas de archivos (minixfs, amiga...)
      • debug, profiling...
    • Añadidos FUSE, CUSE y OverlayFS
    • CJKTTY patch
  • Node.js v4.4.0 LTS
    • Añadida version de NodeOS

Capa 1: barebones

  • nodeos-init
    • proceso /init minimalista
    • "red de seguridad" ante procesos huerfanos
    • montar /dev (necesario para Node.js)
    • apagar el sistema limpiamente cuando no hay más procesos ejecutandose
  • Arranca directamente un intérprete Javascript

Capa 2: initramfs

Capa 2: initramfs

  • Prepara un entorno básico y monta la partición con los directorios de los usuario
  • Ejecuta los 'init' de los usuarios
  • /usr/bin/env esta hecho en Javascript

Capa 3: rootfs

Capa 3: rootfs

  • Genera la partición de arranque (solo lectura) con el kernel de Linux y el initramfs
    • VFAT para Raspberry Pi (genfatfs)
    • ISO9660 para CD y USB (IsoHybrid)
  • Después se combina con la partición de usuarios para hacer un sistema persistente
    • pendrive USB
    • disco duro
  • En una futura versión se eliminará esta capa y se integrará con el sistema de generación global

Capa 4: usersfs

Capa 4: usersfs

  • Genera una partición de demo para los usuarios del sistema (lectura-escritura)
  • Permite persistencia de los datos en un USB
  • Fácilmente sustituible por un sistema en red
    • Dropbox, Google Drive, Amazon S3...
  • Dos usuarios de ejemplo: root y nodeos

root

  • Opcional, solo usado para inicializar servicios
    • bin-getty: manejador de pseudo-terminales
    • ExclFS: acceso exclusivo a los dispositivos en /dev, un usuario cada vez
    • logon: gestión de acceso de los usuarios
      • datos de acceso en el directorio del usuario
      • acceso a cualquiera, protección de los archivos
      • se puede sustituir por un sistema externo como Facebook Connect, Google Account...
  • Único con acceso a los directorios de los demás
    • necesario para logon y administración del sistema
    • solo accesible arrancando en modo administrador
      • deshabilita el resto de usuarios

nodeos

Proyectos propios

  • NodeOS
     
  • nodeos-cross-toolchain
  • nodeos-mount-filesystems
  • nodeos-reverse-proxy
  • Davius
  • ExclFS
  • logon
  • nodeos-init
  • oneshoot
  • usrbinenv
  • nodeos-media
  • nodeos-console-font
  • nodeos-mount-utils
  • coverdeeps
  • download-checksum
  • download-manager
  • coreutils.js
  • cpio2tar
  • DebugFS
  • pstree
  • recv
  • blessed
  • noGUI
  • cpio-stream
  • prompt
  • node-kexec
  • decompress-tar
  • download
  • jsdiff
  • node-scanf
  • tar-fs
  • tar-stream
  • cjktty-patch
  • fuse-bindings
  • GitBlog
  • ifconfig
  • node-canvas

Contribuciones

  • node-bin-getty
  • node-dhcpjs
  • nodeos.github.com
  • nodeos-mount
  • sockios
  • vinyl-fs
  • node
  • node-lib-pathsearch
  • npm-remote-ls
  • npm-path
  • nsh
  • prebuild
  • publish-release
  • serve-static
  • node-byline
  • node-suppose

NodeOS en 4 pasos

  1. Descarga el código desde GitHub
  2. Instalar dependencias del sistema
    bin/install-dependencies
  3. Generar imagen
    npm install
  4. Ejecutar imagen
    npm start

Conclusiones

  • 3891 stargazers en GitHub... y subiendo
  • Colaboraciones externas, proyectos independientes, artículos en portales de tecnología...

Final del 9º Concurso Universitario de Software Libre

Futuro

  • Interfaz gráfica en HTML5
  • Compilar en Mac y Windows (vagrant)
  • Contenedores LXC para cada usuario
  • "Sabores" : mainframe y workstation
  • Soporte de Unicode en el terminal
  • Múltiples framebuffers en Linux
  • Reducir consumo de memoria
  • Usar kernels alternativos
  • ARM y MIPS

Más información

NodeOS - pfc

By Jesús Leganés-Combarro