Novedades en Linux 7.0

Linux 7.0 ya está aquí. Pese al cambio de número, es una versión como cualquier otra. Linux siempre incrementa el contador cada 20 versiones. Aun así, esta versión trae mucha limpieza de código que ya no se usa, y soporte para nuevos dispositivos.

Linux 7.0 ya está aquí. Realmente lleva entre nosotros casi dos meses, pero sumando semanas, ya es el momento de sacar la primera versión de Linux 7.0 que no lleva la etiqueta de Release Candidate, así que para mucha gente ahora sí está aquí.

Pese al cambio de número, es una versión como cualquier otra. Linux incrementa el número que va antes del punto cada 20 versiones, de modo que de Linux 6.19 saltamos a Linux 7.0. Pero esto no significa que la 7.0 sea necesariamente más interesante que otras.

Hardware soportado

Por supuesto, no voy a enumerarlo todo. Primero, porque soy más de software que de hardware, así que no soy la mejor persona para hablar de estas cosas. KernelNewbies ya tiene la lista de parches ya enumerados y detallados para quien busque algo en detalle.

Lo más destacado es que esta versión ya trae soporte para Nova Lake de Intel y para el Zen 6 de AMD, que son los próximos procesadores de nueva generación que van a sacar ambas marcas. De hecho, AMD ha integrado un montón de dispositivos nuevos en esta versión.

Hay soporte para nuevos chips Bluetooth de Realtek y Mediatek. Soporte mejorado para el teclado Logitech K980. Y además, el módulo HID de Sony ahora soporta la guitarra del Rock Band 4, uniéndose a la larga lista de guitarras y controladores especializados de juegos de Play Station soportadas por el driver. Perfecto para echarte unos riffs mientras se actualizan paquetes.

No todo es código nuevo. Linux 7.0 elimina el modo portátil (laptop_mode) de su controlador de disco. El modo portátil permitía reducir y agrupar el acceso a disco para mantener los discos de aguja rotando el menor tiempo posible y ahorrar batería. Pero estos discos se han quedado atrás, lo que ha hecho que mantener ese código ya no sea relevante. Así que después de 20 años de servicio, esta característica ha sido eliminada.

Almacenamiento y sistemas de archivos

Linux 7.0 trae un nuevo tipo de sistema de archivos llamado nullfs. Pero no vas a interactuar mucho con él. Es el nuevo pseudo sistema de archivos que se usará durante el arranque como base para montar los discos y sistemas de archivos reales sobre él.

El driver del sistema de archivos XFS ahora tiene un mecanismo para reportar errores y estado de salud al kernel, lo que permite que existan herramientas que detecten estos cambios de estado, para registrarlo o, incluso, para iniciar un proceso de reparación. De hecho, como parte de este cambio, ahora cualquier sistema de archivos puede reportar al kernel información de estado y errores IO.

Se han introducido mejoras que incrementan el rendimiento de sistemas de archivos como ext4 o btrfs, y se han introducido parches que hacen más robustas las particiones NTFS en Linux.

Rust, ciudadano de primera clase

Aunque la forma de comunicarlo fue bastante lamentable, sobre todo por los titulares que nos dejaron esos días, el experimento «Rust en Linux» acabó hace unos meses. El resultado fue positivo, por lo que Rust ha echado raíces en el kernel y ahora está más integrado que nunca.

Por supuesto, cualquier subsistema puede decidir no participar todavía, pero como ya no es ningún tipo de experimento, se invita a desarrolladores y mantenedores de subsistemas a participar e integrar Rust.

Este carácter experimental nunca fue muy respetado porque hubo partes del núcleo que llevaban escritas en Rust desde hace versiones, pero ahora es oficial.

Linux 7.1 empieza a retirar el soporte para 486

El 486 es un procesador de la serie x86 de Intel que salió al mercado en 1989. No hay que confundirlo con el Pentium (de hecho, ése es conocido como 586). Se trata de un procesador mucho más antiguo que, en algunos casos, ni siquiera tenía unidad FPU (la que permite hacer cálculos con decimales). Hasta ahora, Linux todavía le daba soporte, pero todo el código necesario para hacerlo compatible va a empezar a ser retirado.

El parche ha sido propuesto para la próxima versión a recomendación del propio Linus Torvalds. «Creo que va siendo hora de dejar el soporte para el i486 atrás. Hay cero motivos para que nadie gaste un segundo de esfuerzo en este tipo de problemas». En verdad, razón no le falta. Una cosa es arrancar el kernel, otra cosa es conseguir que el userland de GNU y el resto de programas logren funcionar en un procesador tan antiguo sin necesidad de capas y capas de emulación.

Si tienes un ordenador realmente antiguo y te apetece probar cosas que no sea el Windows 95, a partir de ahora tus opciones son versiones antiguas de GNU/Linux, o NetBSD, que no tiene problema en soportar docenas de arquitecturas exóticas y poco conocidas.

¿Para qué sirve Docker?

Quizá hayas escuchado hablar de Docker alguna vez. Se trata de una tecnología que promete permitir ejecutar aplicaciones y programas de ordenador en un lugar conocido como contenedor. A menudo lo usan para ejecutar aplicaciones de red que se ejecutan en servidores, pero en realidad puedes usarlo en tu propio ordenador personal para instalar programas como bases de datos, o aplicaciones alojadas que tengan interfaz web, de forma rápida y limpia.

Docker facilita el uso de cgroups

Docker se aprovecha de una tecnología presente en el núcleo Linux denominada cgroups. Esta tecnología permite limitar la cantidad de recursos que recibe un proceso en Linux, como el tiempo de CPU que recibe, la cantidad de RAM que puede usar, o incluso directorios de sistema a los que puede entrar.

Lo normal en tu ordenador es que cuando ejecutes un programa, éste tenga acceso a todos los recursos de la máquina. Eso significa que un proceso podría empezar a buscar el último decimal de pi y empezar a consumir un porcentaje importante de CPU que deje hambrientos otros programas en ejecución. O podría reservar suficiente memoria RAM como para dejar tiritando tu sistema. O entrar a cualquier directorio del disco duro para el que tenga permiso y consultar información.

Con cgroups, precisamente puedes aislar un proceso o grupo de procesos para limitar la cantidad máxima de CPU y memoria RAM que van a poder utilizar, e incluso separar la interfaz de red que usan para acceder a internet o cambiar su directorio raíz, de tal forma que sólo vean una porción pequeña del sistema de archivos para impedir que se metan donde no toca. También se puede limitar el uso de ciertas llamadas a sistema, como la posibilidad de que tengan su propia tabla de procesos en ejecución, para que no puedan ver qué procesos tienes en ejecución en tu máquina.

Y Docker precisamente lo que hace es aprovecharse de estas características y crear una forma conveniente de iniciar aplicaciones metidas en uno de esos cgroups. Para ello lo primero que hace es utilizar imágenes de Docker, que puedes ver precisamente como el conjunto de archivos que definirán el sistema de archivos virtual y limitado que verá Docker. Aquí es donde meterás los archivos que permiten funcionar tu programa. Esas imágenes también llevan metadatos, como el usuario con el que se debe ejecutar la imagen, o las variables de entorno a definir al lanzar el programa.

Una vez que tengas una imagen, puedes pedirle a Docker que la lance, creando un contenedor. Un contenedor es una ejecución de una imagen, y se llama así porque, al igual que un contenedor en un barco que transporta mercancías, todo lo que hay dentro de un contenedor está aislado de otros contenedores, y a menudo apilado en un gran sistema lleno de contenedores.

Pero una cosa muy simple que tienes que tener en cuenta es que lanzar un contenedor es simplemente una forma un poco bruta de pedirle a GNU/Linux que ejecute un programa, manteniendo el proceso bajo unas condiciones muy concretas y limitadas como las que contaba antes. La ventaja es que la operación es mucho más simple porque no hay que interactuar con cgroups a mano.

Docker no es virtualización

Es importante diferenciar Docker y cgroups de la virtualización. Cuando virtualizas, lo que haces es usar un programa que simula ser todo un ordenador completo, creando una máquina virtual. Hoy en día las máquinas virtuales son más rápidas gracias al uso de hipervisores y a cierta colaboración que ofrece la CPU del ordenador, pero esencialmente cuando instalas una distribución GNU/Linux en una máquina virtual, estás ejecutando un segundo kernel, simulado dentro de un programa que corres dentro de tu ordenador.

Pero al usar Docker, compartes el kernel de tu ordenador o servidor. En otras palabras, el mismo kernel que atiende las llamadas a sistema en los programas que ejecutas dentro de Docker es el que utilizas en tu máquina. Esta es la razón por la que si pruebas a ejecutar uname dentro de un contenedor de Docker en el que ese comando esté disponible, siempre va a reportar la misma versión del núcleo Linux que la que use tu máquina física, incluso aunque te lleves esa imagen de Docker a otros entornos con otras versiones de núcleo Linux.

Un contenedor de Docker puede pararse y reanudarse mediante operaciones como start y stop. Sin embargo, cuando detienes un contenedor de Docker, no lo estás congelando en el tiempo, que es lo que harías con una máquina virtual si suspendes su ejecución. Cuando detienes un contenedor de Docker verdaderamente detienes todos los procesos en ejecución, que se reanudarán la siguiente vez que se encienda el container.

Los overlays: el punto fuerte de Docker

Uno de los puntos fuertes de Docker es su sistema de overlays. Un overlay es una capa del sistema de archivos que se pone encima de otra, para agregar o quitar cosas.

Por ejemplo, si tienes un sistema de archivos en tu imagen de Docker que contiene 3 archivos, pero luego le pones encima usando un overlay otro sistema de archivos que contiene 2 archivos, al final solaparán y acabarás teniendo una imagen con 5 archivos. Puedes usar los overlays para agregar, modificar y quitar archivos.

Esto es fuerte porque permite crear imágenes reusables. Por ejemplo, existe una imagen de Docker llamada debian:slim, que contiene una instalación pequeña de Debian, con una shell y las herramientas mínimas para usar Docker. Mediante overlay, puedes agregar en otra imagen tus propios archivos de programa a la imagen debian:slim, y el resultado es una imagen que tiene Debian y tus archivos.

Lo normal es que una imagen final de Docker tenga varios overlays, a medida que se usan capas. Por ejemplo, la capa con Debian, la capa con un entorno de ejecución, y la capa con los archivos de programa. A este sistema, se le debe sumar también el volumen que guarda los archivos locales cuando ejecutas una imagen de Docker, para asegurarse de que algunas cosas no se pierdan cuando se detiene la ejecución de una imagen.

¿Por qué se usa tanto Docker?

Docker ha sido adoptado como una tecnología clave moderna para la industria informática y de servidores precisamente por la conveniencia a la hora de fabricar y compartir las imágenes.

Típicamente, instalar un programa en un servidor requería instalarlo a mano y configurarlo. Pero a veces, ese programa depende de paquetes que faltan en el gestor de paquetes del servidor, o pide versiones de una librería que son diferentes de las que aporta el sistema operativo.

Al usar una imagen de Docker, congelamos todo el entorno en el que se va a ejecutar el programa, y eso incluye tanto la distribución, como la versión de la distribución, como otras bibliotecas. Podrías usar la imagen de Docker de Fedora para fabricar una imagen de Docker de un programa que se ejecute sobre Fedora, y como la imagen ya trae todo lo necesario para arrancar el userland de Fedora, luego ejecutarlo en un entorno Docker en Debian, y funcionará de forma transparente.