Lanzamiento del núcleo Linux 6.17

Después de dos meses de desarrollo, Linus Torvalds presentó el lanzamiento del núcleo Linux 6.17. Entre los cambios más destacados se incluyen: la mejora en el rendimiento de Btrfs, las llamadas al sistema file_getattr() y file_setattr(), la unificación de configuraciones de un solo procesador y multiprocesador en el programador de tareas, el módulo DAMON_STAT con estadísticas de acceso a la memoria, el soporte para parches en vivo en sistemas ARM64, el envío de volcado de núcleo a través del socket AF_UNIX, la limitación de SCHED_EXT a través de cgroup, simplificación de la configuración de protección contra vulnerabilidades en CPU, la compilación en Clang con inicialización de variables en la pila, protección contra el reemplazo de /proc, la expansión de la subsistema RV (Verification en Tiempo de Ejecución), y la restricción de sockets AF_UNIX a través de AppArmor, algoritmo de control de sobrecargas TCP DualPI2.

En la nueva versión se aceptaron 14334 correcciones de 2118 desarrolladores, el tamaño del parche es de 46 MB (los cambios afectaron a 12841 archivos, se añadieron 646654 líneas de código y se eliminaron 398782 líneas). En la versión anterior hubo 15924 correcciones de 2145 desarrolladores, el tamaño del parche fue de 50 MB. Aproximadamente el 43% de todos los cambios introducidos en 6.17 están relacionados con controladores de dispositivos, alrededor del 12% de los cambios se refieren a la actualización de código específica para arquitecturas de hardware, el 14% está relacionado con la pila de red, el 4% con sistemas de archivos y el 3% con subsistemas internos del núcleo.

Novedades principales en el núcleo 6.17 (1, 2, 3):

  • Subsistema de disco, entrada/salida y sistemas de archivos
    • En Btrfs se agregó soporte experimental para grandes folios de páginas de memoria (large folios), lo que permite reducir el consumo de recursos y mejorar el rendimiento de diversas operaciones. Se implementó la caché de solicitudes a mapas de bits de distribución de espacio libre, lo que aumentó en un 20% el rendimiento en la creación de archivos vacíos. Se mejoró el funcionamiento de la lectura anticipada en sistemas que utilizan compresión de datos. Se aseguró una colocación más densa de las claves en la estructura XArray, lo que incrementó la compactación del almacenamiento de nodos de árbol de extensiones y permitió reducir el número de nodos finales en un 50-70%. Se proporcionaron configuraciones adicionales para el uso de compresión en extensiones desfragmentadas.
    • En el sistema de archivos ext4 se añadió soporte para entrada/salida en búfer con la bandera RWF_DONTCACHE, donde los datos se eliminan del caché de páginas inmediatamente después de finalizar la operación.
    • En el sistema de archivos EROFS se implementó soporte para la compresión de metadatos.
    • El servidor NFS ahora puede delegar operaciones de escritura a los clientes que abren archivos en modo solo escritura.
    • Se ha agregado la bandera FALLOC_FL_WRITE_ZEROES a la llamada al sistema fallocate(), que permite llenar un rango especificado en un archivo con ceros, utilizando un comando WRITE_ZERO compatible con algunos SSD, que realiza la zeroing sin operaciones de entrada/salida. Esta opción está disponible actualmente solo en el sistema de archivos ext4.
    • Se han añadido las llamadas al sistema file_getattr() y file_setattr() para manipular los atributos del inode de un archivo dado.
    • Se ha eliminado el controlador «pktcdvd» para trabajar con medios ópticos en modo de paquete, que fue marcado como obsoleto en 2016.
    • El sistema de archivos Bcachefs en el núcleo de Linux ha sido trasladado a un modo de mantenimiento externo, lo que implica el cese de la aceptación de cambios para Bcachefs en la rama principal del núcleo, mientras se mantiene este sistema de archivos en la base de código del núcleo. El desarrollo de Bcachefs se llevará a cabo fuera de la base de código del núcleo hasta que Kent Overstreet demuestre efectivamente la posibilidad de una interacción correcta con otros desarrolladores del núcleo y la capacidad de seguir las reglas de desarrollo establecidas.
  • Memoria y servicios del sistema
    • Se ha eliminado el soporte para configuraciones de un solo procesador del planificador de tareas. En sistemas con un solo procesador, ahora se deben utilizar núcleos compilados para sistemas multiprocesador (SMP). El código para sistemas de un solo y multiprocesador se ha unificado y se ha eliminado la vinculación innecesaria al parámetro del núcleo CONFIG_SMP.
    • Se ha añadido el módulo del núcleo DAMON_STAT (Data Access Monitoring Results Stat), que permite rastrear el acceso a la memoria RAM, utilizando la subsistema DAMON (Data Access MONitor). El módulo proporciona estadísticas sobre inactividad (memory_idle_ms_percentiles) y el ancho de banda de memoria estimado (estimated_memory_bandwidth).
    • En sistemas con arquitectura ARM64 se ha implementado soporte para Live-patching, que permite aplicar correcciones al núcleo de Linux sobre la marcha, sin reiniciar ni detener el sistema.
    • En la biblioteca C minimalista nolibc, incluida en los archivos fuente del núcleo de Linux y que proporciona un envoltorio sobre las llamadas al sistema básicas, se ha implementado soporte para las arquitecturas SuperH, x32, MIPS n32 y MIPS n34.
    • Se ha ampliado la capacidad de enviar contenidos de core dumps a través de un socket AF_UNIX, permitiendo crear manejadores de core dumps más seguros en el espacio del usuario, que no dependen de la llamada del núcleo a procesos privilegiados. En la nueva versión se ha añadido un protocolo para crear. servidores, capaces de gestionar el procesamiento de core dumps a nivel de tareas individuales. Por ejemplo, se pueden ignorar los core dumps para ciertos procesos, mientras que otros pueden enviarse a través de un socket. Se ha preparado un prototipo de servidor para la gestión de core dumps.
    • Se ha añadido una opción de línea de comandos del núcleo «crashkernel=size,cma» para reservar memoria a través de CMA (Contiguous Memory Allocator) para almacenar el crash dump del núcleo.
    • Se han ampliado las capacidades del mecanismo pidfd, que permite utilizar identificadores asociados a procesos específicos y que, a diferencia de pid, no se reasignan. Se ha añadido la posibilidad de vincular atributos extendidos a pidfd desde el espacio de usuario. Se ha permitido la apertura de descriptores de archivos para pidfd a través de la función open_by_handle_at() sin estar vinculados al sistema de archivos. La información interna creada por el núcleo junto con pidfd ahora está vinculada al proceso y no a pidfd, y se conserva entre reinicios del mismo proceso.
    • Se ha añadido la función bpf_cgroup_read_xattr() al subsistema BPF para leer atributos extendidos de archivos. Se ha proporcionado la capacidad de utilizar en los programas BPF operaciones de cadena típicas, como bpf_strcmp, bpf_strnchr, bpf_strchrnul, bpf_strlen y bpf_strspn, que operan en modo solo lectura. Se ha añadido la posibilidad de utilizar flujos estándar stdout y stderr para interactuar con componentes en el espacio de usuario. Para sistemas basados en la arquitectura LoongArch, se ha implementado la capacidad de modificación dinámica del código, el mecanismo “BPF trampoline” (que reduce la sobrecarga al pasar llamadas entre el núcleo y programas BPF) y la ejecución de programas que utilizan struct_ops para crear controladores de funciones del núcleo a través de BPF.
    • En el sistema de seguimiento del tiempo se ha implementado el soporte para relojes auxiliares (auxiliary) que no están vinculados a los relojes del sistema convencionales y funcionan a su propio ritmo (anteriormente, todos los relojes funcionaban al mismo ritmo, diferenciado solo por el desajuste).
    • Se ha añadido soporte inicial para la ejecución proxy (Proxy Execution) para mitigar problemas de inversión de prioridades. La ejecución proxy permite que una tarea que espera la liberación de un bloqueo transfiera su contexto de ejecución a la tarea que retiene el bloqueo, acelerando así la liberación de este bloqueo.
    • Se ha continuado con la transferencia de cambios desde la rama Rust-for-Linux, relacionada con el uso del lenguaje Rust como segundo lenguaje para el desarrollo de controladores y módulos del núcleo (el soporte de Rust no está habilitado por defecto y no lleva a incluir Rust como una dependencia de construcción obligatoria para el núcleo). Se han añadido abstracciones para gestionar reguladores de voltaje y corriente, propiedades de firmware, recursos de entrada/salida y memoria de entrada/salida. Se ha implementado el macro «warn_on!()». Se ha añadido el tipo UserPtr para punteros en espacio de usuario. Se ha ampliado la funcionalidad de los módulos workqueue, uaccess, dma, time y list. Se ha añadido un módulo ‘bits’ con funciones ‘bit’ y ‘genmask’.
    • Se ha reescrito el código para calcular sumas de verificación CRC y se han añadido nuevas llamadas para generar hashes SHA-1 y SHA-2. Se han añadido optimizaciones específicas para arquitecturas de hardware. Se ha aumentado el rendimiento de la función crc32c() en nuevas CPU x86_64 que soportan la extensión VPCLMULQDQ (Multiplicación sin acarreo de vectores de palabras de 64 bits).
    • Para los sistemas S390 se ha implementado soporte para la paginación en el área de intercambio y la migración de grandes páginas de memoria (transparent huge page).
    • Se ha añadido la posibilidad de configurar la agresividad de la recuperación de páginas de memoria (proactive-reclaim) cuando hay escasez, vinculada a nodos NUMA específicos, lo que permite destacar nodos NUMA para los cuales se aplicará una recuperación de memoria más activa. Por ejemplo, «echo «512M swappiness=10» > /sys/devices/system/node/node1/reclaim».
    • En el mecanismo SCHED_EXT, que permite usar BPF para crear programadores de CPU, se ha añadido la capacidad de controlar el uso a través de cgroups. Por ejemplo, se puede usar el parámetro cpu.max para limitar la carga en la CPU.
    • Se ha declarado obsoleto el montaje automático del sistema de archivos virtual tracefs en el directorio /sys/kernel/debug/tracing, y se debe usar en su lugar /sys/kernel/tracing.
  • Virtualización y seguridad
    • Se agregó la posibilidad de habilitar protección contra vulnerabilidades en CPU a través de la elección de vectores de ataque bloqueados. en lugar de especificar en la configuración vulnerabilidades concretas. Los métodos de bloqueo se eligen dependiendo del tipo de violación de aislamiento: entre el usuario y el núcleo (user-kernel), entre el usuario y otro usuario (user-user), entre el sistema invitado y el entorno host (guest-host), entre distintos sistemas invitados (guest-guest) y entre diferentes hilos (cross-thread). El enfoque propuesto permite activar solo la protección contra aquellas clases de vulnerabilidades que realmente preocupan al usuario. Por ejemplo, los propietarios de entornos en la nube pueden habilitar los modos guest-host y guest-guest, tras lo cual se activarán los métodos de protección contra las vulnerabilidades BHI, GD, L1TF, MDS, MMIO, Retbleed, RFDS, Spectre_v2, SRBDS, SRSO y TAA.
    • Se ha añadido compatibilidad con la compilación del compilador Clang habilitando el modo de seguimiento de profundidad de pila, en el que se inicializan todas las variables almacenadas en la pila. La inicialización se realiza para evitar fugas de información del núcleo a través de variables no inicializadas, que pueden contener restos de datos previamente guardados en la pila. Antes de esto, una funcionalidad similar se soportaba utilizando el plugin de GCC STACKLEAK.
    • Se añadió protección contra la suplantación por parte de un atacante del sistema de archivos /proc mediante el montaje en modo 'bind'. El número Inode de la raíz de /proc ahora es fijo (PROCFS_ROOT_INO) y puede ser verificado por un proceso en el espacio del usuario.
    • Se añadió un componente al subsistema RV (Verificación en Tiempo de Ejecución), destinado a comprobar la correcta operación de sistemas altamente confiables, que incluye el monitor rtapp (Monitor de aplicación en tiempo real) para rastrear problemas típicos en aplicaciones que funcionan en tiempo real, así como los componentes rp, sssw y opid para probar el planificador de tareas. Se implementó la posibilidad de crear componentes de monitoreo que utilizan lógica temporal lineal para determinar el modelo de comportamiento en lugar de un autómata determinista. La verificación se realiza en tiempo de ejecución mediante el acoplamiento de controladores a puntos de seguimiento, comparando el curso de ejecución real con un modelo de referencia previamente definido que determina el comportamiento esperado del sistema.
    • Se ha añadido soporte en el sistema AppArmor para la gestión de acceso a sockets AF_UNIX.
    • En el hipervisor KVM en sistemas ARM se ha implementado soporte para el controlador de interrupciones GICv5.
    • Se ha agregado la configuración CONFIG_KVM_IOAPIC, que permite desactivar el soporte para la emulación de APIC, PIC y PIT en KVM.
    • Se ha agregado protección contra la vulnerabilidad VMSCAPE.
    • Se ha añadido el comando ioctl FS_IOC_GETLBMD_CAP para obtener información desde el espacio de usuario sobre la aplicación de medidas de protección de integridad a un archivo.
    • Se ha declarado obsoleto el interfaz /sys/fs/selinux/user, al acceder al cual ahora se introduce un retraso de cinco segundos y se emite una advertencia en el log.
  • Subsistema de red
    • En la implementación de la tecnología PSE (Power Sourcing Equipment), utilizada para suministrar energía a través de Ethernet a dispositivos como cámaras IP y puntos de acceso inalámbricos, se ha añadido soporte para estrategias configurables de evaluación del presupuesto de alimentación (potencia total disponible). Estas estrategias permiten determinar qué puertos se deben desconectar primero para evitar sobrecargas.
    • En la implementación del protocolo MCTP (Management Component Transport Protocol), se ha añadido soporte para el enrutamiento de paquetes a nodos externos a través de nodos intermedios (gateway-routing). Por ejemplo, las siguientes reglas permiten dirigir paquetes al nodo con el identificador 10 (Endpoint ID 10) a través del dispositivo mctpi2c0, utilizando la dirección 0x1d, que está directamente conectada al nodo con el identificador 9. mctp route add 9 via mctpi2c0 mctp neigh add 9 dev mctpi2c0 lladdr 0x1d mctp route add 10 gw 9
    • Para los sockets UNIX (AF_UNIX) se ha implementado la opción SO_INC, y para la familia de direcciones VSOCK, la opción SIOCINQ. Las opciones implementadas son similares a la opción TCP_INQ para TCP y permiten obtener información sobre el número de bytes disponibles en el socket para lectura a través de un mensaje de control.
    • Para TCP, se ha implementado un estricto cumplimiento del tamaño de ventana de recepción declarado, que determina el tamaño de los datos permitidos para enviar hasta recibir un ACK de confirmación por parte de la otra parte. Anteriormente, el núcleo continuaba procesando datos que llegaban más allá del tamaño de la ventana de recepción declarada, pero ahora dejará de hacerlo.
    • En MPTCP (Multipath TCP) se ha añadido la posibilidad de utilizar la opción de socket TCP_MAXSEG para limitar el tamaño máximo de los segmentos enviados. MPTCP es una extensión del protocolo TCP para permitir la entrega de paquetes simultáneamente a través de múltiples rutas mediante diferentes interfaces de red asignadas a distintas direcciones IP.
    • Se agregó soporte para el algoritmo de control de congestión TCP DualPI2 (RFC 9332), que permite usar controladores de congestión escalables para tráfico con altos requisitos de calidad de servicio (por ejemplo, TCP-Prague y DCTCP), sin causar una disminución en el rendimiento del tráfico clásico, para el cual se utilizan controladores de congestión como Reno y Cubic.
    • Se agregó sysctl "force_forwarding", a través del cual se puede activar el reenvío de tráfico en interfaces de red seleccionadas con IPv6.
    • Se eliminó el soporte para el algoritmo de detección de pérdida de paquetes SACK (Acknowledgment Selectivo), descrito en RFC 6675. Este algoritmo fue declarado obsoleto en 2018. Se recomienda utilizar el algoritmo RACK-TLP para la detección de pérdidas de paquetes TCP.
  • Hardware
    • Se continuó trabajando en el controlador drm (Direct Rendering Manager) Xe para GPU basadas 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. En la nueva versión, se incluye por defecto soporte para chips basados en la microarquitectura Panthor Lake y se agregó soporte para la microarquitectura WildCat Lake.
    • En el controlador AMDGPU para GPU GFX9.x se implementó el soporte para el mecanismo Cleaner Shader, que asegura la limpieza de la memoria GPU antes de su reutilización para evitar la filtración de datos que permanecen después del trabajo de otro proceso. Se mejoró el soporte para el modo de espera. Se agregó la posibilidad de entrar en modo de suspensión en entornos con AMD SR-IOV. Se mejoró el control de la retroiluminación.
    • En el controlador i915 se implementó el soporte para el mecanismo drm_panic, que muestra al fallar algo similar a una "pantalla azul de la muerte". Se agregó soporte para el controlador de pantalla utilizado en los chips de la familia Wildcat Lake.
    • Se continuó la integración de los componentes del controlador Nova para GPU NVIDIA, equipados con firmware GSP, utilizados desde la serie NVIDIA GeForce RTX 2000 basada en la microarquitectura Turing. El controlador está escrito en Rust. En la nueva versión se agregó un nivel de abstracción para trabajar con DMA, implementado un analizador VBIOS, se agregó código para la configuración del framebuffer y se aseguró soporte para el arranque acelerado en modo Falcon.
    • En el controlador adreno se agregó soporte para las GPU Qualcomm Adreno x1-45 y x1-85.
    • En el controlador msm se agregó soporte para la GPU Adreno SM8750 y el mapeo de memoria de video (VM_BIND).
    • En el controlador panfrost se agregó soporte para GPU Mali, utilizadas en SoC Mediatek mt8370.
    • Se ha añadido soporte para GPU en el controlador lima, utilizado en el SoC Rockchip RK3528.
    • Se ha agregado un controlador mtd (Dispositivos de Tecnología de Memoria) para acceder a la memoria NVM integrada en la GPU Intel.
    • Se ha agregado soporte para sistemas de audio ASoC IMX WM8524, AMD ACP7.2, SoundWire ACP 7.1, Fairphone 4 & 5, Qualcomm QCS8275, Framework Laptop 13 (AMD Ryzen AI 300), CS35L41 HDA (utilizado en laptops ASUS), Richtek RTQ9124, TI TAS5753, HP EliteBook x360 830 G6, EliteBook 830 G6, LG 16Z90R-A, HP 15-fc000. Se ha reorganizado el código de HD-audio.
    • Se ha agregado soporte para plataformas ARM, SoC y dispositivos: NVIDIA Tegra264, Marvell PXA1908 (el primer chip de 64 bits de Marvell para teléfonos inteligentes), CIX P1, Axiado AX3000, Sophgo SG2000 (que combina núcleos ARM y RISC-V), Mediatek mt6572, exynos2200 (utilizado en el Samsung Galaxy S22), Renesas R-Car V4M-7, TI am62d2 y Sophgo sg2042, laptops basadas en Mediatek mt8186 y Qualcomm Snapdragon X1, teléfonos inteligentes y tabletas basados en SoC mt6572, tegra30 y msm8976.

Simultáneamente, la Fundación Software Libre de América Latina ha formado una variante completamente libre del núcleo 6.17: Linux-libre 6.17-gnu, limpiado de elementos de firmwares y controladores que contienen componentes o secciones de código no libres, cuyo uso está restringido por el fabricante. En la versión 6.17, se ha actualizado el código de limpieza de blobs en los controladores amdgpu, prueth, iwlwifi, btusb, pci mhi host, adreno a6xx, nova-core e Intel AVS. Se ha realizado limpieza de nombres de blobs en archivos dts (devicetree) para chips ARM e Intel IPU7. Se ha neutralizado la carga de blobs en los nuevos controladores pci hda. Se ha terminado la limpieza de blobs en el controlador QLogic infiniband, el cual fue eliminado del núcleo.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster