Diseño

Muchos desarrolladores de código abierto están de acuerdo en que el núcleo Linux no fue diseñado, sino que evolucionó a través de una forma de «selección natural». Torvalds considera que, aunque el diseño de Unix sirvió como andamiaje, «Linux creció con muchas mutaciones, y debido a que las mutaciones eran menos que aleatorias, eran más rápidas y más dirigidas que las partículas alfa en el ADN».27​ Raymond considera que los aspectos revolucionarios de Linux son sociales, no técnicos, antes de que el software complejo de Linux fuera diseñado cuidadosamente por grupos pequeños, pero «Linux evolucionó de una manera completamente diferente. Desde casi el principio, fue pirateado de manera bastante casual por un gran número de voluntarios coordinando sólo a través de Internet. La calidad se mantuvo no por estándares rígidos o autocracia, sino por la estrategia ingenuamente simple de publicar cada semana y obtener comentarios de cientos de usuarios en unos días, creando una especie de selección darwiniana rápida sobre las mutaciones introducidas por los desarrolladores».28​ Bryan Cantrill, un ingeniero de un sistema operativo de la competencia, está de acuerdo en que «Linux no se diseñó, evolucionó», pero considera que esto es una limitación, y propone que algunas características, especialmente las relacionadas con la seguridad, no se pueden convertir en, «este no es un sistema biológico al final del día, es un sistema de software».29​ Un sistema basado en Linux es un sistema operativo modular tipo Unix, que deriva gran parte de su diseño básico de los principios establecidos en Unix durante las décadas de 1970 y 1980. Dicho sistema utiliza un kernel monolítico, el núcleo Linux, que maneja el control de procesos, las redes, el acceso a los periféricos y los sistemas de archivos. Los controladores de dispositivos se integran directamente con el kernel o se agregan como módulos que se cargan mientras el sistema está en ejecución.

El espacio de usuario de GNU es una parte clave de la mayoría de los sistemas basados en el núcleo Linux, siendo Android la excepción notable. La implementación del Proyecto de la biblioteca C funciona como un contenedor para las llamadas al sistema del núcleo Linux necesarias para la interfaz kernel-espacio de usuario. La cadena de herramientas es una amplia colección de herramientas de programación vitales para el desarrollo de Linux (incluidos los compiladores utilizados para construir el núcleo Linux así mismo), y las coreutils implementan muchas herramientas básicas de Unix. El proyecto también desarrolla Bash, un popular shell CLI. La interfaz gráfica de usuario (o GUI) que utilizan la mayoría de los sistemas Linux se basa en una implementación del sistema X Window.30​ Más recientemente, la comunidad Linux busca avanzar a Wayland como el nuevo protocolo de servidor de visualización en lugar de X11. Muchos otros proyectos de software de código abierto contribuyen a los sistemas Linux.

Los componentes instalados de un sistema Linux incluyen los siguientes:3031

  • Un cargador de arranque, por ejemplo GNU GRUB, LILO, SYSLINUX o Gummiboot. Este es un programa que carga el núcleo Linux en la memoria principal de la computadora, al ser ejecutado por la computadora cuando se enciende y después de que se realiza la inicialización del firmware.
  • Un programa de inicio, como el sysvinit tradicional y el systemd más nuevo, OpenRC y Upstart. Este es el primer proceso lanzado por el núcleo Linux, y está en la raíz del árbol de procesos: en otros términos, todos los procesos se inician a través de init. Inicia procesos como los servicios del sistema y las solicitudes de inicio de sesión (ya sean gráficos o en modo terminal).
  • Bibliotecas de software, que contienen código que pueden utilizar los procesos en ejecución. En los sistemas Linux que utilizan archivos ejecutables en formato ELF, el enlazador dinámico que gestiona el uso de bibliotecas dinámicas se conoce como ld-linux.so. Si el sistema está configurado para que el usuario compile el software por sí mismo, también se incluirán archivos de cabecera para describir la interfaz de las bibliotecas instaladas. Además de la biblioteca de software más utilizada en los sistemas Linux, la biblioteca GNU C (glibc), existen muchas otras bibliotecas, como SDL y Mesa.
    • La biblioteca estándar C es la biblioteca necesaria para ejecutar programas C en un sistema informático, siendo la biblioteca GNU C el estándar. Para los sistemas embebidos, se han desarrollado alternativas como musl, EGLIBC (una bifurcación glibc usada una vez por Debian) y uClibc (que fue diseñado para uClinux), aunque las dos últimas ya no se mantienen. Android usa su propia biblioteca C, Bionic.
  • Comandos básicos de Unix, siendo GNU coreutils la implementación estándar. Existen alternativas para los sistemas embebidos, como el copyleft BusyBox y el Toybox con licencia BSD.
  • Los kits de herramientas de widgets son las bibliotecas que se utilizan para crear interfaces gráficas de usuario (GUI) para aplicaciones de software. Hay numerosos kits de herramientas de widgets disponibles, incluidos GTK y Clutter desarrollados por el proyecto GNOME, Qt desarrollado por Qt Project y dirigido por Digia, y Enlightenment Foundation Libraries (EFL) desarrolladas principalmente por el equipo de Enlightenment.
  • Un sistema de gestión de paquetes, como dpkg y RPM. Alternativamente, los paquetes se pueden compilar a partir de archivos tar binarios o fuente.
  • Programas de interfaz de usuario como shells de comandos o entornos de ventanas.