Capítulo 1. Introducción a Linux

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Linux es el sistema operativo más extendido, utilizado en todo, desde dispositivos móviles hasta la nube.

Puede que no estés familiarizado con el concepto de sistema operativo. O puede que estés utilizando un sistema operativo como Microsoft Windows sin darle demasiada importancia. O puede que seas nuevo en Linux. Para preparar el terreno y ponerte en situación, en este capítulo vamos a echar un vistazo a los sistemas operativos y a Linux.

Primero discutiremos qué significa moderno en el contexto del libro. A continuación, repasaremos a grandes rasgos la historia de Linux, examinando los acontecimientos y fases importantes de los últimos 30 años. Además, en este capítulo aprenderás cuál es el papel de un sistema operativo en general y cómo Linux cumple este papel. También echaremos un vistazo rápido a qué son las distribuciones de Linux y qué significa la visibilidad de los recursos.

Si eres nuevo en los sistemas operativos y en Linux, querrás leer todo el capítulo. Si ya tienes experiencia con Linux, tal vez te interese pasar a"Una visión de diez mil pies de Linux", que proporciona una visión general y un mapa de los capítulos del libro.

Pero antes de entrar en los tecnicismos, retrocedamos un poco y centrémonos en lo que queremos decir cuando hablamos de "Linux moderno". Esto es, sorprendentemente, una cuestión no trivial.

¿Qué son los Entornos Modernos?

El título del libro especifica moderno, pero ¿qué significa eso realmente? Bueno, en el contexto de este libro, puede significar cualquier cosa, desde la computación en nube hasta una Raspberry Pi. Además, el reciente auge de Docker y las innovaciones relacionadas en infraestructura han cambiado drásticamente el panorama tanto para los desarrolladores como para los operadores de infraestructura.

Echemos un vistazo más de cerca a algunos de estos entornos modernos y al destacado papel que Linux desempeña en ellos:

Dispositivos móviles

Cuando digo "teléfono móvil" a nuestros hijos, dicen: "¿En contraste con qué?" Con toda justicia y seriedad, hoy en día muchos teléfonos -dependiendo de a quién preguntes, hasta el 80% o más-, así como tabletas, ejecutan Android, que es unavariante de Linux. Estos entornos tienen requisitos agresivos en cuanto a consumo de energía y robustez, ya que dependemos de ellos a diario. Si estás interesado en desarrollar aplicaciones para Android, considera la posibilidad de visitar elsitio para desarrolladores de Android para obtener más información.

Computación en nube

Con la nube, vemos a escala un patrón similar al del espacio móvil y micro. Hay arquitecturas de CPU nuevas, potentes, seguras y que ahorran energía, como las exitosas ofertas deAWS Graviton basadas en ARM, así como la ya establecida externalización del trabajo pesado a los proveedores de la nube, especialmente en el contexto del software de código abierto.

Internet de las Cosas (Inteligentes)

Seguro que has visto muchos proyectos y productos relacionados con el Internet de las Cosas (IoT), desde sensores hasta drones. Muchos de nosotros ya hemos estado expuestos a electrodomésticos y coches inteligentes. Estos entornos tienen requisitos aún más exigentes en torno al consumo de energía que los dispositivos móviles. Además, puede que ni siquiera estén funcionando todo el tiempo, sino que, por ejemplo, sólo se despierten una vez al día para transmitir algunos datos. Otro aspecto importante de estos entornos sonlas capacidades en tiempo real. Si te interesa iniciarte en Linux en el contexto del IoT, ten en cuenta el AWS IoT EduKit.

Diversidad de arquitecturas de procesador

Durante los últimos 30 años aproximadamente, Intel ha sido el principal fabricante de CPU, dominando el espacio de los microordenadores y los ordenadores personales. La arquitectura x86 de Intel se consideraba el estándar de oro. El enfoque abierto que adoptó IBM (publicar las especificaciones y permitir que otros ofrecieran dispositivos compatibles) fue prometedor, lo que dio lugar a clones x86 que también utilizaban chips Intel, al menos al principio.

Aunque Intel sigue siendo ampliamente utilizado en los sistemas de sobremesa y portátiles, con el auge de los dispositivos móviles hemos asistido a la creciente adopción de laarquitectura ARM y, recientemente, RISC-V. Al mismo tiempo, los lenguajes y herramientas de programación multiarquitectura, como Go o Rust, están cada vez más extendidos, creando una tormenta perfecta.

Todos estos entornos son ejemplos de lo que yo considero entornos modernos. Y la mayoría de ellos, si no todos, funcionan o utilizan Linux de una forma u otra.

Ahora que conocemos los sistemas modernos (hardware), te preguntarás cómo hemos llegado hasta aquí y cómo surgió Linux.

La historia de Linux (hasta ahora)

Linux cumplió 30 añosen 2021. Con miles de millones de usuarios y miles de desarrolladores, el proyecto Linux es, sin duda, una historia de éxito mundial (de código abierto). Pero, ¿cómo empezó todo esto y cómo hemos llegado hasta aquí?

1990s

Podemos considerar el correo electrónico de Linus Torvalds del 25 de agosto de 1991 al grupo de noticiascomp.os.minix como el nacimiento del proyecto Linux, al menos en términos de registro público. Este proyecto aficionado pronto despegó, tanto en términos de líneas de código (LOC) como de adopción. Por ejemplo, después de menos de tres años, se publicó Linux 1.0.0 con más de 176.000 LOC. Para entonces, el objetivo original de poder ejecutar la mayoría del software Unix/GNU ya se había alcanzado con creces. Además, en los años 90 apareció la primera oferta comercial: Red Hat Linux.

2000 a 2010

Como "adolescente", Linux no sólo estaba madurando en cuanto a características y hardware compatible, sino que también estaba creciendo más allá de lo que UNIX podía hacer. En este periodo de tiempo, también fuimos testigos de una enorme y creciente adopción de Linux por parte de los grandes, es decir, la adopción por parte de Google, Amazon, IBM, etc. También fue el punto álgido de lasguerras de distribuciones, lo que provocó que las empresas cambiaran derumbo.

Desde 2010 hasta ahora

Linux se estableció como el caballo de batalla en los centros de datos y la nube, así como para cualquier tipo de dispositivos IoT y teléfonos. En cierto sentido, se puede considerar que la guerra de distribuciones ha terminado (hoy en día, la mayoría de los sistemas comerciales están basados en Red Hat o Debian), y en cierto sentido, el auge de los contenedores (a partir de 2014/15) es responsable de este desarrollo.

Con este repaso histórico superrápido, necesario para establecer el contexto y comprender la motivación del alcance de este libro, pasamos a una pregunta aparentemente inocente: ¿Por qué necesita alguien Linux, o un sistema operativo en absoluto?

¿Por qué un sistema operativo?

Supongamos que no dispones de un sistema operativo (SO) o que no puedes utilizar uno por el motivo que sea. En ese caso, tendrías que hacerlo casi todo tú mismo: gestionar la memoria, manejar las interrupciones, hablar con los dispositivos de E/S, gestionar los archivos, configurar y gestionar la pila de red... y la lista continúa.

Nota

Técnicamente hablando, un SO no es estrictamente necesario. Existen sistemas que no tienen SO. Suelen ser sistemas embebidos con una huella diminuta: piensa en una baliza IoT. Simplemente no disponen de los recursos necesarios para mantener nada más que una aplicación. Por ejemplo, con Rust puedes utilizar su núcleo y su biblioteca estándar para ejecutar cualquier aplicación sobremetal desnudo.

Un sistema operativo se encarga de todo este trabajo pesado e indiferenciado, abstrayendo los distintos componentes de hardware y proporcionándote una Interfaz de Programación de Aplicaciones (API) (normalmente) limpia y bien diseñada, como es el caso del núcleo de Linux, que veremos más detenidamente en el Capítulo 2. Solemos llamar a estas API que expone un SO llamadas al sistema, o syscalls para abreviar. Los lenguajes de programación de alto nivel como Go, Rust, Python o Java construyen sobre esas llamadas al sistema, envolviéndolas potencialmente en bibliotecas.

Todo esto te permite centrarte en la lógica de negocio en lugar de tener que gestionar tú mismo los recursos, y también se ocupa del diferente hardware en el que quieras ejecutar tu aplicación.

Veamos un ejemplo concreto de llamada al sistema. Supongamos que queremos identificar (e imprimir) el ID del usuario actual.

En primer lugar, examinamos la llamada al sistema de Linuxgetuid(2):

...
getuid() returns the real user ID of the calling process.
...

Vale, esta llamada al sistema getuid es la que podríamos utilizar mediante programación, desde una biblioteca. Hablaremos de las syscalls de Linux con más detalle en"syscalls".

Nota

Quizá te preguntes qué significa (2) en getuid(2). Es una terminología que la utilidad man (piensa en las páginas de ayuda incorporadas) utiliza para indicar la sección del comando asignada en man, algo parecido a un código postal o de país. Este es un ejemplo en el que el legado de Unix es evidente; puedes encontrar su origen en elManual del Programador Unix, séptima edición, volumen 1 de 1979.

En la línea de comandos (shell), utilizaríamos el comando equivalente id que, a su vez, utiliza la llamada al sistema getuid:

$ id --user
638114

Ahora que tienes una idea básica de por qué utilizar un sistema operativo, en la mayoría de los casos, tiene sentido, pasemos al tema de las distribuciones de Linux.

Distribuciones Linux

Cuando decimos "Linux", puede que no quede inmediatamente claro a qué nos referimos. En este libro, diremos "núcleo Linux", o simplemente "núcleo", cuando nos refiramos al conjunto de llamadas al sistema y controladores de dispositivos. Además, cuando nos referimos adistribuciones de Linux(o distros, para abreviar), nos referimos a un conjunto concreto de componentes del núcleo y otros relacionados, como la gestión de paquetes, la distribución de archivos, el sistema de inicio y un intérprete de comandos, preseleccionados para ti.

Por supuesto, podrías hacer todo esto tú mismo: podrías descargar y compilar el núcleo, elegir un gestor de paquetes, etc., y crear (o rodar) tu propia distro. Y eso es lo que hizo mucha gente al principio. Con los años, la gente se dio cuenta de que es un mejor uso de su tiempo dejar este empaquetado (y también el parcheado de seguridad) a los expertos, privados o comerciales, y simplemente utilizar la distro Linux resultante.

Consejo

Si te inclinas por crear tu propia distribución, quizá porque eres un manitas o porque tienes que hacerlo debido a ciertas restricciones empresariales, te recomiendo que eches un vistazo a Arch Linux, que te da el control y, con un poco de esfuerzo, te permite crear una distro Linux muy personalizada.

Para hacerte una idea de la inmensidad del espacio de las distros, incluidas las distros tradicionales (Ubuntu, Red Hat Enterprise Linux [RHEL], CentOS, etc., como se comenta en el Capítulo 6) y las distros modernas (como Bottlerocket y Flatcar; véase el Capítulo 9), echa un vistazo a DistroWatch.

Con el tema de la distro fuera del camino, pasemos a un tema totalmente distinto: los recursos y su visibilidad y aislamiento.

Visibilidad de los recursos

Linux ha tenido, en buena tradición UNIX, una vista global por defecto sobre los recursos. Esto nos lleva a la pregunta: ¿qué significa vista global (en contraste con qué?), y qué son dichos recursos?

Nota

¿Para empezar, por qué hablamos aquí de la visibilidad de los recursos? La razón principal es concienciarte sobre este tema y ponerte en el estado de ánimo adecuado para uno de los temas importantes en el contexto del Linux moderno: los contenedores. No te preocupes si ahora no entiendes todos los detalles; volveremos sobre este tema a lo largo del libro y, concretamente, en el Capítulo 6, en el que tratamos con más detalle los contenedores y sus componentes básicos.

Puede que hayas oído decir que en Unix, y por extensión en Linux, todo es un archivo. En el contexto de este libro, consideramos que los recursos son cualquier cosa que pueda utilizarse para ayudar a la ejecución del software. Esto incluye hardware y sus abstracciones (como CPU y RAM, archivos), sistemas de archivos, unidades de disco duro, unidades de estado sólido (SSD), procesos, cosas relacionadas con redes como dispositivos o tablas de enrutamiento, y credenciales que representan a los usuarios.

Advertencia

No todos los recursos en Linux son archivos o se representan a través de una interfaz de archivos. Sin embargo, hay sistemas, como Plan 9, que llevan esto mucho más lejos.

Veamos un ejemplo concreto de algunos recursos de Linux. En primer lugar, queremos consultar una propiedad global (la versión de Linux) y, a continuación, información específica de hardware sobre las CPU en uso (salida editada para ajustarse al espacio):

$ cat /proc/version 1
Linux version 5.4.0-81-generic (buildd@lgw01-amd64-051)
(gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04))
#91~18.04.1-Ubuntu SMP Fri Jul 23 13:36:29 UTC 2021

$ cat /proc/cpuinfo | grep "model name" 2
model name      : Intel Core Processor (Haswell, no TSX, IBRS)
model name      : Intel Core Processor (Haswell, no TSX, IBRS)
model name      : Intel Core Processor (Haswell, no TSX, IBRS)
model name      : Intel Core Processor (Haswell, no TSX, IBRS)
1

Imprime la versión de Linux.

2

Imprime información relacionada con la CPU, filtrando por modelo.

Con los comandos anteriores, supimos que este sistema dispone de cuatro núcleos Intel i7. Cuando inicies sesión con un usuario diferente, ¿esperarías ver el mismo número de CPUs?

Consideremos otro tipo de recurso: los archivos. Por ejemplo, si el usuario troycrea un archivo en /tmp/myfile con permiso para hacerlo ("Permisos"), ¿podría otro usuario, worf, ver el archivo o incluso ser capaz de escribir en él?

O, tomemos el caso de un proceso, es decir, un programa en memoria que dispone de todos los recursos necesarios para ejecutarse, como CPU y memoria. Linux identifica un proceso mediante su ID de proceso, o PID para abreviar ("Gestión de procesos"):

$ cat /proc/$$/status | head -n6 1
Name:   bash
Umask:  0002
State:  S (sleeping)
Tgid:   2056
Ngid:   0
Pid:    2056
1

Imprime el estado del proceso -es decir, detalles sobre el proceso actual- y limita la salida para mostrar sólo las seis primeras líneas.

¿Puede haber varios procesos con la misma PID en Linux? Lo que puede parecer una pregunta tonta o inútil resulta ser la base de los contenedores (ver "Contenedores"). La respuesta es sí, puede haber múltiples procesos con el mismo PID, en diferentes contextos llamados namespaces(ver "Espacios de nombres en Linux"). Esto ocurre, por ejemplo, en una configuración en contenedores, como cuando ejecutas tu aplicación en Docker o Kubernetes.

Cada proceso puede pensar que es especial, ya que tiene PID 1, que en una configuración más tradicional está reservado para la raíz del árbol de procesos del espacio de usuario (para más detalles, consulta "El proceso de inicio de Linux" ).

Lo que podemos aprender de estas observaciones es que puede haber una vista global sobre un recurso determinado (dos usuarios ven un archivo exactamente en la misma ubicación), así como una vista local o virtualizada, como en el ejemplo del proceso. Esto plantea la pregunta: ¿es todo global por defecto en Linux? Spoiler: no lo es. Veámoslo más de cerca.

Parte de la ilusión de tener varios usuarios o procesos ejecutándose en paralelo es la visibilidad (restringida) sobre los recursos. La forma de proporcionar una vista local sobre (ciertos recursos soportados) en Linux es mediante los espacios de nombres (ver "Espacios de nombres Linux").

Una segunda dimensión independiente es la del aislamiento. Cuando utilizo aquí el términoaislamiento, no lo califico necesariamente, es decir, no hago suposiciones sobre lo bien que están aisladas las cosas. Por ejemplo, una forma de pensar en el aislamiento de procesos es restringir el consumo de memoria para que un proceso no pueda matar de hambre a otros procesos. Por ejemplo, le doy a tu aplicación 1 GB de RAM para usar. Si utiliza más, será eliminadapor falta de memoria. Esto proporciona un cierto nivel de protección. En Linux utilizamos una función del núcleo llamada cgroups para proporcionar este tipo de aislamiento, y en"Linux cgroups" aprenderás más sobre ella.

Por otro lado, un entorno totalmente aislado da la apariencia de que la aplicación está completamente sola. Por ejemplo, se puede utilizar una máquina virtual (VM; consulta también"Máquinas virtuales") para proporcionarte un aislamiento total.

Una visión de diez mil pies sobre Linux

Vaya, ya nos hemos metido bastante en la maleza. Es hora de respirar hondo y volver a centrarnos. En la Figura 1-1, he intentado ofrecerte una visión general de alto nivel del sistema operativo Linux, asignándola a los capítulos del libro.

lmlx 0101
Figura 1-1. Asignación del sistema operativo Linux a los capítulos del libro

En su núcleo, cualquier distro Linux tiene el núcleo, que proporciona la API sobre la que se construye todo lo demás. Los tres temas centrales de archivos, redes y observabilidad te siguen a todas partes, y puedes considerarlos los bloques de construcción más básicos por encima del núcleo. Desde una perspectiva de uso puro, pronto aprenderás que la mayoría de las veces tratarás con el shell (¿Dónde está el archivo de salida de esta aplicación?) y con cosas relacionadas con el control de acceso (¿Por qué se bloquea esta aplicación? ¡Ah, el directorio es de sólo lectura, doh!).

Como apunte: he recopilado algunos temas interesantes, desde máquinas virtuales a distros modernas, en el Capítulo 9. Llamo a estos temas "avanzados" principalmente porque los considero opcionales. Es decir, podrías pasar sin aprenderlos. Pero si de verdad, de verdad, de verdad quieres beneficiarte de toda la potencia que puede proporcionarte el Linux moderno, te recomiendo encarecidamente que leas el Capítulo 9. Supongo que no hace falta decir que, por su diseño, el resto del libro -es decir, del Capítulo 2 al Capítulo 8- soncapítulos esenciales que debes estudiar sin falta y aplicar el contenido a medida que avanzas.

Conclusión

Cuando llamamos "moderno" a algo en el contexto de este libro, nos referimos al uso de Linux en entornos modernos, como teléfonos, centros de datos (de proveedores de nubes públicas) y sistemas integrados como una Raspberry Pi.

En este capítulo, he compartido una versión de alto nivel de la historia de Linux. Hablamos del papel de un sistema operativo en general -abstraer el hardware subyacente y proporcionar un conjunto de funciones básicas como la gestión de procesos, memoria, archivos y red a las aplicaciones- y de cómo Linux lleva a cabo esta tarea, concretamente en lo que respecta a la visibilidad de los recursos.

Los siguientes recursos te ayudarán a seguir poniéndote al día, así como a profundizar en los conceptos tratados en este capítulo :

Títulos O'Reilly
Otros recursos

Y ahora, sin más preámbulos: ¡empecemos nuestro viaje por el Linux moderno con el núcleo, erm, kernel, del asunto!

Get Aprender Linux moderno now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.