Después de dos meses de desarrollo, Linus Torvalds presentó el lanzamiento del núcleo Linux 6.9. Entre los cambios más notables se encuentran: el módulo dm-vdo para deduplicación y compresión de dispositivos de bloque, el modo de acceso directo a archivos en FUSE, soporte para la creación de pidfd para hilos individuales, el mecanismo de tokens BPF, soporte para Rust en sistemas ARM64, la degradación del sistema de archivos Ext2 a obsoleto, la eliminación del antiguo controlador NTFS y el soporte para el mecanismo Intel FRED.
En la nueva versión se incluyen 15680 correcciones de 2106 desarrolladores, el tamaño del parche es de 54 MB (los cambios afectaron a 11825 archivos, se añadieron 687954 líneas de código y se eliminaron 225344 líneas). En la publicación anterior hubo 15641 correcciones de 2018 desarrolladores, con un tamaño de parche de 44 MB. Aproximadamente el 42% de todos los cambios presentados en 6.9 están relacionados con controladores de dispositivos, alrededor del 17% de los cambios tienen que ver con la actualización de código específico de arquitecturas de hardware, el 13% está relacionado con el stack de red, el 7% con sistemas de archivos y el 4% con subsistemas internos del núcleo.
Novedades principales en el núcleo 6.9:
- Subsistema de disco, entrada/salida y sistemas de archivos
- En Device Mapper (DM) se ha añadido un nuevo controlador dm-vdo (optimizador de datos virtuales), que permite crear un dispositivo de bloque virtual basado en dispositivos de bloque existentes, con capacidades como deduplicación de datos repetidos, compresión de datos, exclusión de bloques vacíos y aumento del tamaño del dispositivo de bloque según sea necesario (thin provisioning). Estas capacidades se implementan a nivel de dispositivo de bloque y no dependen del sistema de archivos utilizado (por ejemplo, con dm-vdo se puede realizar la combinación automática de datos duplicados y almacenar información de forma comprimida para cualquier sistema de archivos). Se admite la aplicación de dm-vdo a almacenes físicos de hasta 256TB y la creación de volúmenes lógicos de hasta 4PB. Se recomienda utilizar lvm para gestionar particiones vdo. La tecnología VDO fue desarrollada por Permabit y se hizo pública tras su adquisición por Red Hat en 2017.
- En el subsistema FUSE, utilizado para la implementación de sistemas de archivos en el espacio de usuario, se ha añadido una implementación inicial del modo «passthrough», que permite acceder directamente a los datos de los archivos a nivel de núcleo, omitiendo el proceso que opera en el espacio de usuario, lo que puede mejorar significativamente el rendimiento en algunas situaciones. Por ejemplo, las implementaciones FUSE de sistemas de archivos que operan en modo de solo lectura y limitan el acceso a archivos pueden entregar el contenido de los archivos de la FS de origen sin transferirlos al proceso FUSE.
- El controlador con la implementación del sistema de archivos Ext2 se ha clasificado como obsoleto (deprecated). La razón mencionada es que el controlador solo admite contadores de tiempo de 32 bits en el inode, que se desbordarán el 19 de enero de 2038. Se sugiere utilizar el controlador ext4, que es compatible con el sistema de archivos Ext2 y puede trabajar con las particiones ext2 utilizando marcas de tiempo que no están afectadas por el problema del año 2038, siempre que el sistema de archivos se cree con inodes de más de 255 bytes (en el controlador ext2, los contadores de tiempo de 32 bits se usaban independientemente del tamaño del inode).
- Se ha eliminado el antiguo controlador del sistema de archivos NTFS, siendo reemplazado a partir de la versión 5.15 por el nuevo controlador NTFS3. Se considera poco práctico tener dos controladores de NTFS en el núcleo, dado que el antiguo no se ha actualizado en muchos años, está en mal estado y solo puede operar en modo de lectura.
- Se ha añadido soporte para el mapeo de identificadores de usuario de sistemas de archivos montados en los sistemas de archivos zonefs y hugetlbfs, utilizado para asociar archivos de un usuario específico en una partición montada de otro usuario en el sistema actual.
- En NFSv4, se ha proporcionado a los administradores la capacidad de limpiar los estados de apertura y bloqueo de archivos.
- Para el sistema de archivos Ext4, solo se han señalado correcciones de errores y actualizaciones de pruebas kunit.
- En Btrfs, se ha continuado la traducción de funciones para utilizar folios de páginas de memoria (page folios).
- En el sistema de archivos XFS, se continuó trabajando en la implementación de la herramienta fsck para verificar y corregir problemas en modo online, sin necesidad de desmontar el sistema de archivos.
- Se ha añadido el flag RWF_NOAPPEND a la llamada al sistema pwritev2(), que permite especificar un desplazamiento para la escritura, incluso si el archivo se abrió en modo de solo adición de datos al final del archivo.
- Se han añadido nuevos comandos ioctl: FS_IOC_GETUUID, que devuelve el identificador UUID del sistema de archivos especificado, y FS_IOC_GETFSSYSFSPATH, que determina la ubicación en /sys/fs de un sistema de archivos montado dado.
- Los sistemas de archivos efs, qnx4 y coda han sido actualizados para utilizar la nueva API de montaje de particiones.
- Se ha mejorado la implementación de operaciones con archivos que se realizan en modo sin distinción entre mayúsculas y minúsculas. Se ha aumentado el rendimiento al realizar primero una comparación con distinción de mayúsculas y luego retroceder a una búsqueda sin distinción de mayúsculas. Se han solucionado problemas al montar overlayfs sobre directorios donde se ha establecido el modo sin distinción entre mayúsculas y minúsculas.
- Memoria y servicios del sistema
- Se ha implementado el soporte para el mecanismo Intel FRED (Flexible Return and Event Delivery), diseñado para mejorar la eficiencia y la fiabilidad en la entrega de información sobre eventos de bajo nivel, en comparación con el mecanismo actual IDT (Interrupt Descriptor Table). El aumento del rendimiento y la reducción de latencias se logran gracias al retorno de eventos mediante la instrucción del procesador IRET en lugar de transmitir eventos a través de la tabla IDT. La fiabilidad se mejora gracias al procesamiento separado de la llegada del evento en el contexto del núcleo y en el contexto del usuario, protegiendo contra la ejecución anidada de NMI y manteniendo en el marco de pila extendido todos los registros de CPU relacionados con la excepción.
- Se ha añadido la capacidad de optimizar el acceso a datos de núcleos CPUs individuales mediante el uso en el código del núcleo de espacios de direcciones con nombre (Named Address Spaces), implementados en GCC en forma de extensión de GNU C.
- Se ha añadido la bandera PIDFD_THREAD a la función pidfd_open(), que permite crear pidfd para hilos individuales, y no solo usar pidfd en el contexto del líder del grupo de hilos. También se ha propuesto implementar un pseudo-SF para acceder a pidfd a través de un sistema de archivos virtual. A diferencia de la identificación de procesos mediante pid, el identificador pidfd se vincula a un proceso específico y no cambia, mientras que el PID puede ser asignado a otro proceso tras la finalización del proceso actual.
- Se ha añadido un mecanismo de tokens BPF al subsistema BPF, permitiendo delegar selectivamente a los programas los derechos de acceso a operaciones BPF privilegiadas. Por ejemplo, se puede proporcionar a una aplicación no privilegiada acceso a subsistemas BPF individuales sin otorgar derechos completos CAP_BPF.
- Se ha añadido un nuevo tipo de memoria compartida bpf_arena al subsistema BPF, que define un área accesible para ser compartida entre programas BPF y procesos en el espacio de usuario. Se ha añadido la instrucción may_goto, que permite organizar el trabajo de ciclos que pueden ser interrumpidos por el verificador. También se ha añadido la capacidad de generar cookies TCP SYN arbitrarias desde programas BPF y crear controladores BPF para combatir el SYN flood.
- Continúa la migración de cambios desde la rama Rust-for-Linux, relacionados con el uso del lenguaje Rust como segundo idioma para el desarrollo de controladores y módulos del núcleo (el soporte de Rust no está activado por defecto y no requiere que Rust figure entre las dependencias de construcción obligatorias del núcleo). Se ha añadido soporte para el uso del lenguaje Rust en procesadores ARM de 64 bits. Se ha realizado la transición a la versión 1.76 de Rust. Se ha añadido el macro ‘container_of!’. En lugar de la funcionalidad inestable ‘ptr_metadata’, se ha utilizado el método estable ‘byte_sub’. Se ha añadido el módulo ‘time’ con la función de conversión de tiempo ‘msecs_to_jiffies()’.
- Se ha añadido la capacidad de truncar archivos (ftruncate_file) al subsistema io_uring.
- Se ha añadido un nuevo tipo de colas de trabajo WQ_BH (workqueue Bottom Halves) para la ejecución asincrónica de código en el contexto de interrupciones suaves, destinado a sustituir los obsoletos tasklets.
- Se ha reestructurado significativamente el subsistema del temporizador, mejorando la lógica de selección del núcleo de CPU activo para ejecutar el temporizador disparado, evitando así que núcleos inactivos salgan del modo de suspensión.
- Se ha implementado la capacidad de actualizar el modelo de consumo de energía del núcleo (EM, Energy Model) en funcionamiento, lo que puede utilizarse, por ejemplo, para considerar el impacto de la temperatura de funcionamiento en la eficiencia energética del CPU. Se ha incrementado notablemente el rendimiento de la función em_cpu_energy(), que ahora se ejecuta 1.43 veces más rápido en pruebas en un sistema de escritorio y 1.69 veces más rápido en pruebas en la placa RockPi 4B.
- Se ha añadido soporte para el arranque de sistemas basados en la arquitectura ARM64 en modo LPA2 con un espacio de direcciones virtuales de 52 bits.
- Para sistemas ARM64, se ha implementado el soporte para registros PTE continuos (Page Table Entry), que permiten mejorar el rendimiento al aumentar la eficiencia del uso de la TLB (Translation Lookaside Buffer).
- Se han aceptado parches para mejorar el rendimiento del subsistema de gestión de memoria al reducir la aparición de bloqueos en vmalloc().
- Se ha implementado en la arquitectura LoongArch un mecanismo de parches en caliente (live patching) que permite aplicar correcciones al núcleo sin necesidad de reiniciar.
- Para los sistemas RISC-V, se ha implementado el soporte para la llamada al sistema membarrier(), que establece barreras de memoria para los hilos que están en ejecución en el sistema.
- Se han elevado los requisitos para la versión de LLVM/Clang que se puede utilizar para compilar el núcleo. Ahora se requiere al menos la versión 13.0.1 de LLVM (antes se podía compilar con LLVM 11+).
- Se ha añadido soporte para exportar información de eventos en diversos formatos (USER_EVENT_REG_MULTI_FORMAT) en el mecanismo de "User trace events", que permite generar eventos de rastreo desde procesos de usuario para monitorear la actividad en el espacio de usuario.
- Se ha añadido al mecanismo de rastreo de llamadas a funciones la capacidad de rastrear el estado de los argumentos de entrada de la función al rastrear la salida de la función. Los valores de la instrucción return ahora se pueden asociar con los argumentos utilizados en la llamada a la función.
- Se ha añadido soporte al modo de agregación de la salida "cluster" ("perf stat -a --per-cluster") en la herramienta perf para combinar estadísticas de recursos compartidos. También se ha implementado la capacidad de utilizar la biblioteca libcapstone para desensamblar instrucciones del procesador ("perf script -F disasm"). Se han realizado optimizaciones en el consumo de memoria durante la ejecución de los comandos perf report y perf annotate.
- Virtualización y seguridad
- Se ha añadido protección contra la vulnerabilidad RFDS (Register File Data Sampling) en los procesadores Intel Atom, lo que permite extraer información residual de los archivos de registros (RF, Register File) del procesador, que se utilizan para almacenar conjuntamente el contenido de los registros en todas las tareas en el mismo núcleo de CPU. Para bloquear la vulnerabilidad, se requiere una actualización de microcódigo y el uso de la instrucción VERW para limpiar el contenido de los búferes microarquitectónicos al regresar del núcleo al espacio de usuario. Para habilitar la protección al arrancar el núcleo, se puede especificar la opción "reg_file_data_sampling=on". La información sobre la exposición a la vulnerabilidad y la existencia del microcódigo necesario para la protección se puede evaluar en el archivo "\/sys\/devices\/system\/cpu\/vulnerabilities\/reg_file_data_sampling".
- Se ha añadido soporte básico para la protección de sistemas invitados mediante la extensión AMD SEV-SNP (Secure Nested Paging), que garantiza un funcionamiento seguro con tablas de páginas de memoria anidadas y protege contra los ataques «undeSErVed» y «SEVerity» en procesadores AMD EPYC, que permiten eludir el mecanismo de protección AMD SEV (Secure Encrypted Virtualization). KVM Los cambios necesarios para utilizar SNP se planean añadir en la rama 6.10.
- Los módulos con la implementación de las tecnologías IMA (Integrity Measurement Architecture) y EVM (Extended Verification Module) han sido trasladados al uso del marco LSM (Linux Security Modules), lo que ha simplificado significativamente el código sin pérdida de funcionalidad, consolidando la funcionalidad duplicada y aprovechando las capacidades típicas disponibles a través de LSM. El módulo IMA está diseñado para verificar la integridad de los componentes del sistema operativo mediante firmas digitales y hash. El módulo EVM permite proteger los atributos extendidos de los archivos (xattrs) contra ataques dirigidos a comprometer su integridad (EVM no permitirá un ataque offline, en el que un atacante pueda modificar los metadatos, por ejemplo, arrancando desde su propio dispositivo).
- Se han rediseñado para mayor compatibilidad con entornos de 32 bits las llamadas al sistema lsm_list_modules(), lsm_get_self_attr() y lsm_set_self_attr(), que están destinadas a mostrar la lista de módulos LSM cargados (Linux Security Modules) y obtener/establecer los atributos del módulo LSM. El cambio rompe la compatibilidad hacia atrás, pero dado que se añadieron nuevas llamadas al sistema en la última versión del núcleo y aún no se utilizan en aplicaciones, Linus Torvalds consideró que el cambio es aceptable.
- Se ha intentado reanudar el uso del mecanismo UBSAN (Undefined Behavior Sanitizer). El problema radica en que los compiladores manejan de manera diferente los desbordamientos enteros de tipos con signo y sin signo. Los desbordamientos con signo y los desbordamientos de punteros se consideran una categoría de comportamiento indefinido, mientras que los desbordamientos sin signo se manejan modularmente por 2n, conservando solo los bits menos significativos del resultado ("wrap-around") y no se consideran comportamiento indefinido. Para evitar situaciones de comportamiento indefinido, el núcleo se compila con la opción "-fno-strict-overflow", que implica el uso de "wrap-around" para todos los desbordamientos enteros. GCC y Clang no pueden diagnosticar correctamente algunos problemas al usar la bandera "-fno-strict-overflow", y la inclusión de UBSAN está destinada a realizar un trabajo conjunto con los desarrolladores de compiladores para eliminar las falsas alarmas que surgen y detectar desbordamientos enteros en lugares donde no hay comprobaciones explícitas.
Para verificar posibles desbordamientos en el núcleo, se utilizan construcciones del tipo "var + offset PAGE_SHIFT) < pgoff){..}"), que dependen de la compilación con la bandera "-fno-strict-overflow" y no abarcan todo el código en el que podría ocurrir potencialmente un desbordamiento. El problema es que al utilizar UBSAN, tales comprobaciones generaban una gran cantidad de advertencias falsas, y debido a esto, en 2021 se tuvo que desactivar UBSAN. En la implementación actualizada, se propone utilizar anotaciones especiales __signed_wrap y __unsigned_wrap, así como macros listos para usar con verificaciones add_would_overflow(a, b) y add_wrap(a, b), que permiten separar el uso previsto por los desarrolladores de los desbordamientos enteros de los desbordamientos aleatorios, que podrían llevar a vulnerabilidades. La propuesta de una reestructuración más amplia del núcleo con la introducción de definiciones adicionales de tipos fue rechazada por Linus Torvalds.
- Subsistema de red
- En el subsistema de red, se ha trabajado para reducir la aparición de bloqueos en competencia ("lock contention", intento de obtener un bloqueo sostenido por otro hilo). Se ha reducido el uso de bloqueos RTNL.
- Se ha añadido la opción de habilitar el soporte de sondeo activo de sockets (busy polling) en el contexto de llamadas individuales a epoll. El tamaño del pool y los parámetros del presupuesto se pueden establecer separados de los parámetros del sistema por defecto.
- Se ha implementado la estructura net_hotdata para mejorar la eficiencia del almacenamiento en caché de las variables de configuración de red más utilizadas.
- Se ha añadido soporte en MPTCP para establecer la opción TCP_NOTSENT_LOWAT para sockets, permitiendo limitar el tamaño del buffer de envío. En la API para sockets MCTP se ha añadido soporte para identificadores de red, que permiten usar múltiples redes MCTP no superpuestas en un mismo host.
- Se ha añadido soporte en IPSec para redirigir mensajes ICMP con información sobre errores (RFC 4301).
- Se ha acelerado el proceso de escaneo de rutas con tiempo de vida expirado.
- Se ha mejorado el rendimiento de XDP gracias a la evitación más estricta de asignaciones de grandes bloques de memoria.
- Se ha añadido la posibilidad de adjuntar metadatos a los mensajes de netconsole.
- En Netfilter se permite la definición desde el espacio de usuario de tablas que se vinculan al proceso en segundo plano de control y no se eliminan automáticamente después de que finaliza la aplicación de usuario.
- En nftables se ha acelerado la adición de elementos a los conjuntos set con rangos combinados.
- Hardware
- En el controlador i915 se ha continuado trabajando en la implementación del soporte para chips Intel LunarLake (Xe 2). Se han añadido nuevos identificadores PCI para dispositivos basados en chips Intel Arrow Lake y Alder Lake N. Para Displayport se ha añadido soporte para tunneling (DP tunneling) y asignación de ancho de banda (bandwidth allocation). Se ha habilitado el modo fastboot para todas las plataformas. Se ha añadido soporte para la salida de depuración vinculada a dispositivos específicos.
- En el controlador AMDGPU se ha preparado la implementación del soporte para GPU AMD RDNA3.5 y RDNA4. Se ha añadido soporte para ATHUB 4.1, LSDMA 7.0, JPEG DPG, IH 7.0, HDP 7.0, VCN 5.0, SMU 13.0.6, NBIO 7.11, SDMA 6.1, MMHUB 3.3, DCN 3.5.1, NBIF 6.3.1, VPE 6.1.1 y el marco RAS ACA. Se ha añadido el parámetro freesync_video en el módulo del núcleo para habilitar el soporte experimental de optimización de cambio de modos de video utilizando la tecnología de sincronización adaptable FreeSync.
- En el controlador Nouveau, el código de control de pantalla se ha trasladado para utilizar la función kmemdup().
- Se ha continuado trabajando en el controlador drm (Direct Rendering Manager) Xe para GPU basado en la arquitectura Intel Xe, que se utiliza en las tarjetas gráficas Intel de la familia Arc y en la gráfica integrada, comenzando con los procesadores Tiger Lake.
- Se ha añadido un controlador DRM para los chips Mediatek MT8188 VDOSYS1.
- Las opciones del núcleo relacionadas con subsistemas de video se han trasladado a la sección CONFIG_VIDEO.
- Se ha añadido soporte para SoC ARM64: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
- Se ha añadido soporte para plataformas y dispositivos ARM: teléfonos Android basados en el chip Tegra30, modelos Chromebook basados en Mediatek MT8186, NAS, tabletas y consolas de juegos basadas en Rockchips RK35xx, placas White Hawk basadas en SoC Renesas, placas basadas en Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
- Se ha llevado a cabo la refactorización del código del subsistema de sonido ALSA. Se ha añadido soporte para sistemas de sonido Microchip SAM9x7, NXP i.MX95 y Qualcomm WCD939x. En el controlador SoundWire se ha añadido soporte ASoC con coprocesadores de sonido AMD ACP 6.3, y para sistemas Intel se ha implementado el modo DSPless. Se ha añadido soporte para códecs de sonido adicionales Cirrus HD. En el controlador virtio se ha mejorado la gestión de dispositivos de sonido.
- Se ha añadido soporte para controladores Ethernet Marvell Octeon PCI Endpoint NIC VF e Intel E825-C 100G.
Simultáneamente, la Fundación Latinoamericana de Software Libre ha formado una versión completamente libre del núcleo 6.9 — Linux-libre 6.9-gnu, eliminando elementos de firmware y controladores que contienen componentes no libres o partes de código cuya área de aplicación está limitada por el fabricante. En la versión 6.9 se ha actualizado el código de limpieza de blobs en los controladores amdgpu, ath12k, adreno, btusb y r8169. Se ha llevado a cabo la limpieza de un nuevo controlador ptp_fc3. Se ha realizado la limpieza de los nombres de blobs en los archivos dts (devicetree) para la arquitectura Aarch64. Se han solucionado problemas con la limpieza del controlador i915 que provocaban bloqueos durante la inicialización. Se han realizado cambios relacionados con el manejo de blobs suministrados en forma de volcado hexadecimal.
Fuente: opennet.ru
