RavnOS

Imagen creada con Stable Diffusion 2.1

RavnOS, (del noruego; raven), es un sistema operativo programado en Rust. Tiene como objetivo ser minimalista, estable, seguro y moderno (esto tal vez lo conozcas como “estado del arte”).

Es mi proyecto personal de crear un sistema operativo desde cero, lo considero un hobby y no algo profesional.

Ejecutar sobre un sistema operativo existente

Para ejecutar el sistema sobre un sistema operativo existente, el kernel debe tener soporte para POSIX.

Los pilares de RavnOS son:

  • Minimalismo

    No hay software innecesario en el código o en el sistema. Solo lo necesario para hacer el trabajo (producto mínimo viable).

    El minimalismo también afecta el alcance del sistema, verifica ese punto.

  • Estabilidad y seguridad sobre características

    La estabilidad y la seguridad del sistema tendrán prioridad absoluta sobre una característica “X”.

  • Aislamiento y portabilidad

    Cada parte del sistema debe ser portable en las plataformas admitidas por Rust.

    Cada parte del sistema debe ser autoalojada, no se permiten dependencias externas (a través de Internet). Todo debe ser local, ¿cómo puedes estar seguro de que la dependencia remota es segura? ¿cómo puedes estar seguro de que la dependencia remota se desarrollará hasta el final de los tiempos? ¿cómo puedes estar seguro de que la dependencia remota no romperá la compatibilidad?

    Cada parte del sistema distribuida en forma binaria debe hacerse como estática, desde 2022, la mejor manera de lograrlo es utilizando la biblioteca estándar C MUSL (en el caso del kernel Linux).

  • Claves - Datos

    La información se imprime en la pantalla y se maneja con la siguiente sintaxis:

    [clave] {
       	[dato]
    }
    

    Esto permite trabajar con datos agrupados por claves y evita problemas al extraer datos cuando se utilizan caracteres como “”, ‘’, , , y otros.

  • Imagen del SO - Contenedor

    La distribución final debe utilizar el esquema de “imagen del SO”; la parte base del sistema es inmutable y la parte mutable se utiliza a través del esquema de contenedores.

Requisitos

  • Rustc

  • Un terminal

  • Cargo con la cadena de herramientas (‘toolchain’) objetivo que desees/necesites:

    Esto no es obligatorio, pero te ayudará a compilar con un solo comando.

  • Objetivo de Musl:

    Esto no es obligatorio, pero te recomiendo utilizarlo para compilar de forma estática en el caso de que se ejecute sobre Linux.

Versionado

El esquema de versionado para las versiones sigue la especificación de Versionado Semántico v2 ( https://semver.org/spec/v2.0.0.html ), aquí tienes un resumen;


Dado un número de versión MAJOR.MINOR.PATCH, se incrementa:

    - la versión MAJOR cuando se realizan cambios incompatibles en la API/programa,
    - la versión MINOR cuando se agregan funcionalidades de manera retrocompatible,
    - la versión PATCH cuando se realizan correcciones de errores retrocompatibles.

Etiquetas adicionales para versiones previas y metadatos de compilación están disponibles como extensiones del formato MAJOR.MINOR.PATCH.

Un cambio desde el desarrollo temprano es que cada versión MINOR también indica cada característica nueva/existente dentro de los programas internos. Y las correcciones de rendimiento se incluyen en la sección “PATCH” en lugar de la sección “MINOR”.

Con este esquema de versionado, sabes que dentro de cada versión MAJOR el sistema siempre es compatible con las versiones más antiguas.

Documentación

Esta web está creada con el progrmaa “mdbook” (Markdown Book) y sirve como toda la documentación del sistema operativo.

Compilación

Hay dos formas de compilar RavnOS:

  1. Cargo

Recuerda reemplazar [x86_64/aarch64] por tu caso.

Recomiendo utilizar esta configuración dentro de “~/.cargo/config”;

[build]
target= "[x86_64/aarch64]-unknown-linux-musl"
jobs=20
rustflags = ["-C","opt-level=2","-C","debuginfo=0","-C", "target-feature=+crt-static","-C","target-cpu=native"]

Agrega el objetivo construido con Musl;


rustup toolchain add --force-non-host stable-x86_64-unknown-linux-musl && rustup target add [x86_64/aarch64]-unknown-linux-musl

Para compilar;

cargo build --release --target [x86_64/aarch64]-unknown-linux-musl

Todos los binarios se encontrarán en “target/[TARGET]/release”.

Si tienes restricciones de espacio, utiliza “strip” en los binarios finales. Esto se debe a que incluso con el objetivo “–release” aún se pueden encontrar símbolos de depuración en el binario final.

  1. Rustc

Para cada librería de RavnOS, primero debes compilarla como un archivo de objeto y luego puedes usarla en el proceso de compilación;

rustc --crate-type=rlib --crate-name libconfarg [PATH_TO_LIBCONFARG]/src/lib.rs -o libconfarg.rlib
rustc --crate-type=rlib --crate-name libstream [PATH_TO_LIBSTREAM]/src/lib.rs -o libstream.rlib
rustc --crate-type=rlib --crate-name libfile [PATH_TO_LIBFILE]/src/lib.rs -o libfile.rlib

Luego puedes enlazarla en la compilación del binario;

rustc --target=[x86_64/aarm64/etc]-unknown-linux-musl -C opt-level=2 -C target-feature=+crt-static --extern libconfarg=libconfarg.rlib --extern libfile=libfile.rlib --extern libstream=libstream.rlib [COMPONENT]/src/main.rs -o [final_name]

Con el comando anterior, obtendrás el binario final de [COMPONENT] en forma final estática (es decir, enlazada estáticamente) con nivel de optimización 2 y librerías (crates) específicas.

Al igual que con cargo, te recomiendo utilizar “strip” en los binarios finales para eliminar los símbolos de depuración.

Antes - Después de “strip” en el binario

Antes de “strip”;

f: ls 	[10/4/2023 10:44:0 UTC-0]	["sticky bit", "rwx", "r-x", "r-x"]	[uid=1000(shyanjmc) gid=1000(shyanjmc)] 4M

Después de “strip”;

f: ls 	[10/4/2023 10:49:11 UTC-0]	["sticky bit", "rwx", "r-x", "r-x"]	[uid=1000(shyanjmc) gid=1000(shyanjmc)] 542K

El comando “strip” elimina los símbolos de depuración, que ocupan el 86.45% del espacio.

Derechos de autor

Yo, Joaquin Manuel ‘ShyanJMC’ Crespo, soy el principal desarrollador y creador de este proyecto.

  • 2023-02-13; Tengo un acuerdo firmado de renuncia de derechos de autor con mi empleador, en el que la empresa renuncia a los derechos de autor de este proyecto.

  • 2023-02-13; Estoy en proceso de registrar el software a mi nombre en la República Argentina.

  • 2023-03-13; Este proyecto está registrado en la República Argentina a mi nombre.

Licencia

RavnOS y todas sus partes están licenciadas bajo GPLv3.

Contacto

Si quieres contactarme, puedes hacerlo a través de:

Correo electrónico:

  • shyanjmc@proton.me
  • shyanjmc@protonmail.com
  • joaquincrespo96@gmail.com

Linkedin:

  • https://www.linkedin.com/in/joaquin-mcrespo/

Contribuciones y soporte

Por ahora soy el principal y único desarrollador de este proyecto, tal vez en el futuro permita colaboraciones.

Si quieres apoyar este proyecto, puedes:

  • Unirte a mi Patreon:

    https://patreon.com/shyanjmc

  • Si preferís donarme crypto:

    • DAI (ERC-20) - La crypto estable preferida;

      0x27219354cC70dE84e7fae0B71E9e2605026b10B2

    • Bitcoin (BTC);

      16n6GP4XkZiyoGCZei6uxdpohCkPm7eQ7L

    • Ethereum (ETH);

      0x27219354cC70dE84e7fae0B71E9e2605026b10B2

Tu apoyo financiero es muy valioso y me ayuda a seguir trabajando en el desarrollo de RavnOS. ¡Gracias!

También acepto hidromiel como apoyo personal al proyecto, mujer/hombre de honor :)