Olvidar la Historia de Unix Nos Está Encerrando en un Callejón Sin Salida

Olvidar la Historia de Unix Nos Está Encerrando en un Callejón Sin Salida

FOSDEM 2024 Hay lecciones vitales que aprender de la historia de Unix, pero se están olvidando. Esto está llevando a cantidades verdaderamente vastas de esfuerzo desperdiciado.

Este artículo es el segundo de una serie basada en la charla del escritorio FOSS de The Reg en FOSDEM 2024.

FOSDEM es una conferencia sobre software libre y de código abierto, y en estos días, quizás lamentablemente, el software libre y de código abierto se trata de Unix. Cada vez más, Unix hoy en día es Linux. El problema es que todos están olvidando lo que realmente es UNIX y conocer tu historia es esencial. Como dijo George Santayana, a menudo mal citado:

El progreso, lejos de consistir en el cambio, depende de la retentividad. Cuando el cambio es absoluto, no queda ser para mejorar y no se establece ninguna dirección para una posible mejora: y cuando la experiencia no se retiene, como entre los salvajes, la infancia es perpetua. Aquellos que no pueden recordar el pasado están condenados a repetirlo.

A menudo es mal citado, lo que puede ser por qué Henry Spencer (quien hizo la implementación original de FOSS de regex) lo parafraseó así:

Aquellos que no entienden Unix están condenados a reinventarlo, pobremente.

Lo que Santayana predijo se está cumpliendo en todo el mundo hoy, y también lo que predijo Spencer. Hay otras opciones, pero pocos las miran. ¿Por qué es eso?

¿Qué es ‘Unix’ de todos modos? Primero lo primero, no significa nada relacionado con el código original de AT&T. Esa definición no ha sido cierta desde 1993. Novell compró Unix a AT&T hace 31 años, mantuvo el código y donó la marca comercial UNIX al Open Group. Desde entonces, el nombre «Unix» ha significado «pasa las pruebas del Open Group», que es ampliamente lo que solía significar POSIX. La base de código original está efectivamente desaparecida. Xinuos, una derivación de SCO Group, todavía vende cosas basadas en ella, pero su producto principal está basado en FreeBSD.

Pero junto con macOS en x86-64 y Arm64 y un puñado de otros sistemas operativos, como HP/UX e IBM AIX, en el registro del Grupo Abierto de productos certificados UNIX®, solían haber dos distribuciones diferentes de Linux, Huawei EulerOS e Inspur K/UX, ambos derivados chinos de CentOS Linux. Les guste o no, esto significa que Linux ya no es «un sistema operativo similar a Unix». Es un Unix.

Es miembro de una gran familia de Unix. Incluso la versión simplificada de la Universidad de Cambridge muestra casi 30 ramas. El árbol genealógico de Wikipedia muestra muchas ramas y líneas: Versión 1 a 4, luego Versión 5 a 6, luego Versión 7, System III y System V… además de muchas, muchas derivaciones, en su mayoría propietarias, y todos los BSD. Y por supuesto, Linux, sin código compartido, pero con un diseño compartido.

Pero si das otro paso atrás, dado que Unix ahora significa compatibilidad, todos son una rama. Ya no se trata de líneas de descendencia, porque en cierto sentido, lo que una vez fue la definición de POSIX se convirtió en Unix. Pero si tu objetivo es simplemente pasar pruebas de compatibilidad, puedes hacerlo con un adaptador, algún tipo de capa de compatibilidad. Es por eso que varias versiones de IBM z/OS están en la lista del Open Group. Eso parece extraño porque no se parecen en nada a Unix.

Esto plantea otras preguntas, como ¿qué constituye de todos modos un sistema operativo «similar a Unix»? Cualquiera que tenga una idea básica de cómo trabajar con Linux o macOS desde la terminal, sabe cómo es un Unix. Algunas características identificativas son:

Un sistema de archivos, con raíz en /. Un shell. (No importa cuál: bash, tcsh, zsh). Comandos como ls, cat, echo, mkdir, rmdir, touch. Un sistema de archivos sensible a mayúsculas y minúsculas. Archivos de texto plano, y comandos conectados con redirección y tuberías. Ciertamente, puede haber excepciones a estas reglas. Por ejemplo, macOS es un Unix™. Pasa las pruebas y Apple paga por la certificación. Pero oculta la mayor parte del árbol de directorios de Unix real, su /etc está relativamente vacío, no tiene un servidor X; es un extra opcional. Y sobre todo, no es sensible a las mayúsculas y minúsculas.

Pero aun así, sigue siendo reconociblemente un Unix.

Entonces, tomando esa lista de características generales, y agregando una menos visible: que está programado principalmente en C o algo similar a C, y requiriendo que el sistema operativo se vea como Unix y nada más, lo que significa que no hay otra capa nativa debajo, entonces la familia es más grande.

Entonces, si se trata solo de compatibilidad y ya no nos importa quién heredó el código de dónde, esto plantea otras preguntas. ¿Cómo podemos categorizarlos? ¿Qué es de todos modos un sistema operativo similar a Unix?

Generaciones y las brechas entre ellas Examinar los proyectos sucesivos en la familia original de Unix dentro de AT&T es muy instructivo. Durante su primera década, Unix fue un proyecto de investigación, no un producto comercial, y en ese tiempo pasó por unas siete generaciones.

La cuestión es que incluso cuando otros proyectos comenzaron a ramificarse y a seguir su propio camino entre Unix V4 y V8, el proyecto original de investigación siguió adelante. Tanto los árboles genealógicos de Wikipedia como los de Cambridge muestran que la línea de AT&T se detiene después de la Décima Edición. Pero en realidad, hubo dos generaciones más.

Si consideramos a toda esa familia extendida como una unidad, una caja en el gráfico, eso deja algunos valores atípicos. Linux es uno. Minix es otro. Hay otros que no se muestran, y toda una categoría de ellos son sistemas muy similares a Unix: los microkernels.

El microkernel original, CMU Mach, llevó a un montón de sistemas operativos Unix, incluyendo el OSF/1 de Open Group y el DEC Tru64, así como MkLinux y famosamente el GNU HURD. El único que no es una curiosidad histórica o un nicho pequeño descuidado es la familia macOS de Apple, que incluye iOS, iPadOS, etc.

El Minix del Dr. Andy Tanenbaum, que fue un antepasado indirecto de Linux en sí mismo, es otro, aunque Minix 1 y 2 eran en gran parte monolíticos. Minix 3, sin embargo, es un verdadero microkernel, y una versión se ejecuta dentro de la mayoría de los procesadores de gestión modernos de Intel.

Hay otros. La investigación sobre Mach llevó a L4 y otros, y el trabajo sigue en curso. QNX es un sistema operativo comercial tipo Unix de microkernel, y se usa en miles de millones de dispositivos integrados… aunque la única vez que podrías haber jugado con él fue en Blackberry 10.

Aunque han tenido más éxito del que podrías pensar, los microkernels son difíciles de hacer funcionar bien. Los núcleos pequeños con muchos procesos de espacio de usuario haciendo cosas no son tan difíciles; AmigaOS hizo esto con éxito a mediados de los años 80. El problema es mantener aislados los diversos procesos, pero capaces de comunicarse entre sí. AmigaOS se ejecutaba en máquinas sin hardware de gestión de memoria, todo estaba en un solo espacio de direcciones. Es fácil comunicarse con otro proceso cuando puedes leer y escribir en su memoria.

La idea de un verdadero microkernel es que el núcleo se ejecute en el anillo 0, en modo supervisor. Programa procesos, asigna memoria, y eso es todo. Todo lo demás se implementa en «servidores» en el espacio de usuario. Hacer que hablen entre sí rápidamente es el problema difícil.

Por ejemplo, macOS usa Mach, pero para proporcionar API compatibles con Unix para que parezca un Unix, tomó una gran parte del núcleo BSD y lo llamó «servidor Unix». Mach todavía administra los procesos, no este servidor Unix, pero aun así, el servidor es grande y complicado. Y aún así, no era tan rápido, así que NeXT lo movió dentro del núcleo de Mach, lo que significa que también está en el espacio del núcleo, ejecutándose en el mismo espacio de memoria que el núcleo Mach, que ya no es tan micro.

Esto nos deja con dos familias de sistemas operativos similares a Unix. Núcleos monolíticos, que incluyen casi todos los antiguos Unix comerciales propietarios y todos los BSD, además de Linux. Además, los microkernels, que podemos agrupar muy vagamente en dos familias. Uno es comercial, y hoy en día principalmente significa los sistemas operativos de Apple y QNX. QNX es propietario, mientras que el kernel y el espacio de usuario de Apple son de código abierto pero no han influido mucho en nada más.

Y una familia de código abierto, que incluye Minix 3, el GNU Hurd, L4, seL4, y muchos otros. Algunos se usan en sistemas de control integrados, como ME de Intel, pero hay poco uso visible en la corriente principal.

Pero eso no es el final de la línea. Es todo lo que la mayoría de las historias muestran, pero hay una tercera línea de descendencia. El trabajo de Dennis Ritchie y Ken Thompson no terminó en 1979 con Unix 7, aunque es de donde se originó la mayoría de los Unix comerciales.

Sube al 11 Las versiones de Unix después de la Séptima Edición a veces se llaman colectivamente Unix de Investigación, y cuando pregunté sobre esto en línea, resultó más en personas diciéndome que estaba mal que en información útil.

Aun así, las ediciones menos conocidas dentro de los Laboratorios de Sistemas Unix de AT&T fueron la Octava Edición en 1985, la Novena Edición en 1986 y en 1989 la Décima Edición. Hay un código fuente fragmentario disponible, pero poca información. (¡Los enlaces funcionales o las referencias a lo que había en estos son bienvenidos!)

Lo que vino después de la Décima Edición es, para este escritor, donde se pone interesante. Para 1992, Unix era noticia comercial importante, por supuesto. FreeBSD y NetBSD estaban sucediendo, y Linux estaba llamando la atención.

Mientras tanto, Bell Labs hizo otra cosa.

Piensa en lo que constituye Unix tradicional, antiguo. Se trata de «todo es un archivo», flujos de bytes, el shell familiar, y así sucesivamente. Pero hay cosas importantes en todas las computadoras modernas que no están cubiertas por esto.

Los gráficos, notablemente, realmente no forman parte del núcleo clásico de Unix. macOS y Linux son ambos Unix, al igual que BSD, pero tienen capas GUI radicalmente diferentes. Esto se debe a que Unix era un sistema operativo para minicomputadoras. Como el propio Dennis Ritchie describió, fue escrito en un DEC PDP-7, y más tarde portado al DEC PDP-11 más grande.

Estas eran computadoras a escala departamental, multiusuario. Una máquina host, más terminales de texto tontas en conexiones seriales, sin gráficos y sin redes; aun así, un equipo de gama alta para la década de 1970.

Durante el período en que Unix comercial floreció, en la década de 1980 había estaciones de trabajo muy caras: efectivamente, minicomputadoras personales de un solo usuario. Se necesitó hasta finales de la década de 1980 para que el equipo como computadoras baratas de 32 bits con gráficos incorporados, buses de expansión razonablemente rápidos (y por lo tanto, redes razonablemente rápidas como una opción bastante barata) comenzara a ser algo común. Luego Unix adquirió soporte de redes, como todavía tiene. Pero formas para que una máquina Unix hable con otra no se consideraron en el diseño original. En cambio, tiene archivos de definiciones de tipo de terminal. Incluso hoy, décadas después, las redes y los gráficos necesitan herramientas auxiliares, como NFS, SSH, X11, y así sucesivamente. Funciona, y funciona muy bien, pero estas son extras agregados que aparecieron años después de que se estableciera el diseño.

Este es el punto en que apareció la Décima Edición de Unix, en 1989, cuando la proliferación de redes y GUI estaba en todas partes.

Hoy en día, a los entusiastas de Wayland les gusta hablar sobre cómo están modernizando el stack gráfico de Linux. Pero Linux es un Unix, y en Unix, todo se supone que es un archivo. Entonces, cualquier evangelista de Wayland ahí fuera, díganos: ¿dónde en el sistema de archivos puedo encontrar los archivos que describen una ventana en la pantalla bajo el protocolo Wayland? ¿Qué archivo contiene las coordenadas de la ventana, su posición en el orden Z, su profundidad de color, su contenido?

Si estas cosas no están en el sistema de archivos, ¿estás seguro de que esta es una herramienta Unix?

Unix de Investigación 10 comenzó a abordar algunas de estas cuestiones, pero fue demasiado poco, demasiado tarde. La industria había tomado versiones mucho más antiguas y simples, las había comercializado, y los resultados estaban mutando y metastatizando en todo el mundo.

Así que Dennis Ritchie y Ken Thompson hicieron lo que Niklaus Wirth hizo con Modula-2 y más tarde con Oberon. Ignoraron lo que la industria estaba haciendo, volvieron a sus ideas originales y siguieron trabajando en perfeccionarlas.

El resultado es el próximo paso en el desarrollo de Unix, y en esta era de complejidad y bloat de software en espiral, es hora de examinarlo de nuevo y ver si los genios que inventaron Unix no tenían las ideas correctas, justo cuando se estaba creando Linux.