MINIX-3

Sistema Operativo Libre de Código abierto, muy confiable, abierto y seguro

Minix 3 se liberó públicamente el 24 de Octubre del 2005 por *Andrew Tanenbaum*, durante su discurso en la Conferencia de Principios de Sistemas Operativos Symposium ACM. A pesar de que todavía sirve como un ejemplo para la nueva edición del libro de texto de Tanenbaun y Woodhull, se ha rediseñado integralmente para ser utilizado *como un sistema serio para computadoras de recursos limitados y computadores embebidos y para aplicaciones que requieren alta confiabilidad*.

La confiabilidad de MINIX-3

Uno de los principales objetivos de MINIX-3 es la confiabilidad. Discutiremos a continuación algunos de los principios más importantes que mejoran la fiabilidad de MINIX-3.

Tamaño Reducido del Kernel

Los sistemas operativos monolíticos como Linux y FreeBSD, y los híbridos como Windows, tienen millones de líneas de código en el kernel. Al contrario de ellos MINIX-3 tiene sólo alrededor de 6.000 líneas de código en el núcleo, lo que permite encontrar y resolver problemas en el código en forma más fácil.

Enjaulando los Bugs

En los kernel monolíticos, los controladores de dispositivos se encuentran en el propio kernel. Esto significa que cuando se instala un nuevo dispositivo o periférico puede haber código no confiable que se *inserta* en el núcleo. Una única línea de código mal escrita en un driver de dispositivo puede comprometer al sistema.

En MINIX-3 cada controlador de dispositivo es un proceso independiente en modo usuario. Los drivers no pueden ejecutar instrucciones privilegiadas, cambiar las tablas de paginamiento, realizar entradas y salidas arbitrarias de I/O o escribir directamente en la memoria real. Tienen que hacer llamadas o solicitudes a kernel para realizar estas acciones y el kernel chequea cada llamada para autorizarlo.

Limitado Acceso a Memoria de los Drivers

En los kernel monolíticos, un drivers puede escribir en cualquier parte de la memoria y por lo tanto puede escribir cualquier basura accidentalmente en los programas de usuario.

En MINIX-3 cuando un usuario espera datos desde, por ejemplo, el Sistema de Archivos, se construye un descriptor que indica quien tiene acceso y para que direcciones. A continución pasa un indice de este descriptor para el Sistema de Archivos, el cual puede pasar a un driver. El Sistema de Archivos o el Drivers le solicitan al núcleo escribir mediante el descriptor, por lo que es imposible para ellos escribir fuera de la memoria intermedia.

Sobreviviendo a malos Punteros

Referenciar un puntero errado dentro de un driver, bloqueará el proceso del drivers, pero no tendrá ningún efecto sobre el sistema operativo. El servidor de *Reencarnación* reiniciará automáticamente el driver bloqueado. Para algunos controladores (por ejemplo discos o red), la recuperación es transparente para los procesos de usuario. Para otros (por ejemplo impresoras o sonido), el usuario lo puede notar. En los kernels monolíticos, referenciar a un puntero errado en un driver conduce normalmente a un fallo de sistema.

Controlando Loops Infinitos

Si un drivers se mete en un *loops infinito*, el controlador de procesos (scheduler) bajará su prioridad gradualmente hasta que se vuelva inactivo. Eventualmente el servidor de reencarnación detectará que el driver-loop no responde a las solicitudes de estado, por lo que matará al proceso y lo reiniciará. En un kernel monolítico, un driver en loop puede llegar a bloquear el sistema.

Limitando los daños por Buffer Overflows

MINIX-3 utiliza mensajes de largo fijo para las comunicaciones internas, lo que elimina los desbordamientos de memoria y los problemas de administración de memoria. Además, muchos exploits trabajan sobre los *overrunning* de los buffers para engañar al programa al regresar de una llamada de función usando una dirección de retorno sobre escrita en el stack que retorna un puntero que ataca al controlador de memoria, normalmente sobre escribiendo el mismo buffer.

En MINIX-3 este ataque es mitigado porque el espacio de instrucciones y datos son divididos y sólo el código instrucciones de sólo lectura pueden ser ejecutados, técnica conocida comunmente como Prevención de Ejecución de Datos. Sin embargo, los ataques que se basan en la lejitima ejecución en memoria en forma malintensionada (return-to-libc, programación return-oriented), no son resueltas en esta mitigación.

Restringiendo Acceso a la Funciones del Kernel

Los controladores de dispositivos obtienen los servicios del núcleo (como copiar datos al espacio de direcciones de los usuarios) al hacer llamadas al kernel. El kernel de MINIX-3 tiene un mapa de bits para cada controlador especificando que llamadas tiene autorizadas a realizar. En un kernel monolítico, cualquier diver puede llamar a cualquier función del kernel, este autorizado a no.

Restricción de Acceso de los puertos de I/O

El kernel también mantiene una tabla de los puertos de I/O que pueden acceder cada driver. Como resultado, un driver sólo puede usar sus propios puertos de I/O. En los núcleos monolíticos, un driver puede tener acceso a los puertos de I/O que pertenecen a otros dispositivos.

Restricción de las Comunicaciones con los componentes del S.O.

No todos los Drivers y el Server deben comunicarse con otro Drivers o Servidor. Por consecuancia se hace un mapa de bits por proceso que determina que proceso puede comunicarse con cual otro.

Reencarnación de Drivers Muertos o Enfermos

Un proceso especial, llamado servidor de encarnación, hace un ping periódicamente a cada driver de dispositivo. Si el Driver muere o no responde correctamente a los pings, el servidor de reencarnación reemplaza automáticamente al Drivers con una nueva copia. La detección y sustitución de los Drivers que no funcionan es automática y no se requiere ninguna intervención por parte del usuario. Esta característica no funciona para los controladores de discos en la actualidad pero en la próxima versión del sistema operativo será capaz de recuperar incluso los controladores de disco, que serán compartidos en la memoria RAM. La recuperación no afecta a los procesos que se encuentran en ejecución.

Mensajes e Interrupciones Integradas

Cuando se produce una interrupción, esta se convierte a un low-level para enviar una notificación al Driver apropiado. Si el Drivers está esperando por un mensaje, este obtiene la interrupción en forma inmediata; de lo contrario, se hace la notificación la próxima vez que lo hace un RECEIVE que hace llegar el mensaje. Este esquema elimina las interrupciones anidadas y hace más fácil la programación del Drivers.

Características Generales

  • Sistema Operativo compatible con POSIX con un espacio de usuario de NetBSD.
  • Es un Sistema de Código abierto con licencia BSD.
  • Se ejecuta en máquinas PC x86, así como en máquinas virtuales x86.
  • Se ejecuta en ARM Cortex A8 (por ejemplo en BeagleBoard XM, Beaglebones).
  • Trabaja con redes TCP/IP
  • Manejo de Memoria Virtual
  • Sistema de Archivos Virtuales
  • Bloque de caché unificado compartido por Memoria Virtual y Sistema de Archivos.
  • Vinculación Dinámica.
  • Ocupa poco espacio de memoria (kernel son 600KB; completo es 25)

Características Específicas de MINIX

  • Microkernel muy pequeño que se ejecuta en modo kernel.
  • La mayor parte del Sistema Operativo se ejecuta en procesos protegidos en modo usuario.
  • Cada Drivers de dispositivo es un proceso separado en modo usuario.
  • El Servidor de Encarnación puede recargar drivers fallidos.

Características de Confiabilidad

  • Reducido tamaño del kernal
  • Los errores son enjaulados
  • Se limita el acceso a memoria de los Drivers.
  • Las referencias a punteros erroneos, no siempre son fatales.
  • Se restringen el acceso a las llamadas de funciones del kernel.
  • Se restringen los accesos a los puertos de I/O.
  • Las comunicaciones con componentes son restringidas.
  • Los Drivers muertos o enfermos pueden ser reencarnados.
  • Se integran las Interrupciones y los Mensajes.
  • Compiladores y lenguajes.
  • Lenguajes: C, C++, clisp, mawk, Perl, Python, TCL, etc.
  • Compiladores: GCC y Clang/LLVM.
  • Compilación Nativa (sin alojamiento) en x86.
  • Compilación cruzada para x86 y ARM.

Paquetes

  • Shells como bash, mksh, mudsh, pdksh, zsh.
  • Editores como elvis, joe, jove, pico, uemacs, vim.
  • Juegos como crafty, exchess, ioquake.
  • Correo Electrónico, fetchmail, getmail, mutt, thunderbird.
  • Más de 4.000 otros paquetes de NetBSD.

Instalando MINIX-3 en Virtualbox

Se describe el proceso de instalación de MINIX-3 en una Virtualbox.

Consiguiendo MINIX

Descargue la última ISO de MINIX-3, en este documento hemos utilizado la versión minix_R3.3.0-588a35b.iso

Version Medio Imagen Torrent md5sum
:——–:—–::——::——-::——-
3.3.3 (stable release) CD-ROM 288MB Torrent 3234ffcebfb228069cf3def41c95dec
3.2.1 (previous CD-ROM 256MB Torrent 4c91ba7822cfa441d27755a7e7c4711d
  • Descomprimir el archivo descargado para obtener un archivo ISO y la guía de instalación (al igual al anterior).
  • Grabar el archivo ISO en un CD-ROM para arranque del sistema.
  • Vuelva arrancar el computador con el CD instalado en la lectora de CD, e indique que parta del CD-ROM, siga las instrucciones que aparecen en la guía de instalación.

Preliminares

Primero que todo usted necesita instalar [Virtualbox](https://www.virtualbox.org), los binarios se pueden descargar de su página web. Sis está ejecutando alguna distribución de Linux, puede instalar VirtualBox a traves de su gestor de paquetes.

Configuración de su Máquina Virtual

Antes de instalar MINIX-3 tendrá que crear una nueva máquina virtual. La configuración de la VM especifica los parámetros de la máquina virtual, por ejmplo, la cantidad de memoria que le asignará a la VM, debe definir el tamaño del disco virtual que le asignará, etc. Para las instrucciones detalladas, vea esta [Guía](http://wiki.minix3.org/doku.php?id=usersguide:hardwarerequirements).

En la pantalla principal de VirtualBox, presione el botón de Nueva.

  1. En la pantalla de Nombre del Sistema Operativo, para nombre escriba “MINIX 3” (nada va a pasar), para la versión seleccione “Otro”.
  2. En la pantalla “Tamaño de la Memoria”, seleccione el tamaño de la memoria de la máquina virtual.
  3. En la pantalla de disco duro, defina el tamaño y las propiedades del disco duro virtual. Está bien que se modifiquen las opciones de por defecto, usted puede requerir otras.
  4. Al presionar *create* se crearán la imagen del disco y la máquina virtual que vamos a ejecutar.
  5. Ahora selecciones *MINIX-3* en la lista de la izquierda.
  6. Haga *click* en el botón de configuración de pantalla principal de VirtualBox. A continuación haga click en Sistema en la lista de la derecha y dela señal de reloj de hardware en el tiempo UTC.
  7. Ahora haga *click* en *OK* y estará listo para instalar MINIX-3

Instalación de MINIX-3 en VirtualBox

Suponiendo que usted ha descargado y descomprimido una imagen ISO de MINIX-3 desde [download](http://www.minix3.org/download), usted puede montar el archivo ISO.

  1. Seleccione Seleccione MINIX-3 en la lista de la izquierda.
  2. Haga *click* en *Start*.
  3. Se le pedirá que seleccione un disco de inicio. Busque y seleccione la imagen ISO de MINIX-3 que ha descargado anteriormente.

Instalando

Los siguientes pasos corresponden a los pasos que aparecen en la pantalla de instalación de MINIX-3.

Ejecutando el Script de Setup

Cuando aparece el *prompt* de login, ingrese como *root*. Presione *\<enter\>* cuando el propmt cuando le solicite la password.

Para iniciar la instalación de MINIX en el disco virtual escriba *\<setup\>*.

Esto iniciará un script de instalación del sistema en su disco duro virtual. Si en el proceso su pantalla se pone en blanco (sin imagen), presione las teclas *\<ctrl + F3\>* esto sólo debería pasar en equipos antiguos.

X.org

Las aplicaciones de *Guest* de VirtualBox no se encuentran disponibles para MINIX-3. Por lo tanto MINIX-3 no puede adivinar correctamente la resolución de pantalla. La resolución de pantalla se tiene que configurar manualmenteen el archivo *xorg.conf*

Cambiando la Resolución de Pantalla

Asegúrese que no está ejecutando X.org, para configurar ingrese como *root* y ejecute el siguiente comando:

# Xorg -configure

Este comando debe crear un archivo *xorg.conf.new* en el home de /root.

En la sección *Screen* del archivo *xorg.conf.new*, asegúrese de retirar toda la subsección *Display*, excepto lo que contiene *Depth: 16*.

Añada la resolución de pantalla. La posible resolución de pantalla puede ver encontrada en el archivo */var/log/Xorg.0.log*. Busque los Modes: que contengan *BitsPerPixel:16*, esto es importante.

Ejemplo:

Mode: 117 (1024x768)
    [....]
          XResolution: 1024
          YResolution: 768
    [....]
          BitsPerPixel: 16

Estas resoluciones pueden set añadidas al archivo *xorg.conf.local*, en el ejemplo anterior usamos 1024×768. Añada la resolución correcta de su pantalla en la sección *Display*.

Una vez que terminada la configuración del archivo *xorg.conf.new* debe mover el archivo al siguiente directorio:

# mv xorg.conf.new  /usr/pkg/X11R6/lib/X11/xorg.conf

Para probar la nueva configuración debe arrancar X.org:

# startx

Y debería tener un ambiente gráfico con la reolución que ha definido y con la profundidad de colores que ha indicado en el archivo de configuración.

Port Forwarding

VirtualBox tiene ocho adaptadores de red que se pueden configurar por separado para operar en uno de los siguientes seis modos:

  1. No se adjunta
  2. Usando NAT (Network Address Translation).
  3. En modo Bidge o puente.
  4. Red interna
  5. Red Host-only
  6. Redes ethernet virtuales distribuidas.

Es posible navegar por internet, descargar archivos, ver correo electrónico en MINIX-3 en modo NAT. En este modo por defecto (NAT), el sistema operativo invitado, no puede acceder a la máquina anfitriona o a otros equipos de la misma red y viceversa. Sin embargo, tal como un Router físico, VirtualBox puede hacer que los servicios disponibles puedan ser usados a través del *forwarding* de puertos. Esto significa que VirtualBox escucha a ciertos puertos en el anfitrión y redirecciona los paquetes que llegan a ese puerto y los envía al *huésped*, al mismo puerto o a un puerto diferente.

Por ejemplo para enviar el tráfico SSH desde el anfitrión al huésped por el puerto 2222:

VBoxManage modifyvm "VM_name" --natpf1 "guestssh, tcp,,2222,,22"

El “VM_name” es el nombre de la Máquina Virtual en la pantalla de administración del VirtualBox y “guestssh” es un nombre descriptivo y será generado automáticamente si se omite. Conectando la máquina huésped con el siguiente comando en el anfitrión:

ssh -P 2222 localhost

El sistema operativo invitado está disponible para la máquina anfitriona y otras máquinas de la red a través del puerto 2222 a través de la dirección IP del anfitrión (siempre que el firewall lo permita). Esto es útil para desarrollo remoto y navegación con sistema Remoto con explorador de Eclipse.

informatica/unix_minix/minix-so.txt · Última modificación: 2022/12/19 22:03 por 127.0.0.1
Recent changes RSS feed Creative Commons License Donate Minima Template by Wikidesign Driven by DokuWiki