6 de mayo de 2019

Las novedades de Linux 5.1

Ya se ha publicado la versión 5.1 de Linux. Entre los cambios que trae consigo está versión se encuentra: io_uring, una nueva interfaz de alto rendimiento para E/S asíncrona; también se incluyen mejoras a fanotify que proporcionan una manera escalable de vigilar los cambios en sistemas de archivos grandes; se añade un método para permitir la entrega segura de señales en presencia de reutilización de PIDs; la memoria persistente puede utilizarse como RAM; los niveles de compresión Zstd en Btrfs son configurables; también se añade un nuevo gobernador cpuidle que toma mejores decisiones de gestión energética que el gobernador menu; todas las arquitecturas de 32 bits han añadido llamadas al sistema con time_t de 64 bits para afrontar el problema y2038; es posible arrancar desde un dispositivo de device-mapper sin usar initramfs; y el parcheo en vivo ha añadido soporte para parches acumulativos. Además, hay muchas otras mejoras y pequeños parches. La lista completa de cambios, en inglés, se encuentra aquí.


1. E/S asíncrona de alto rendimiento con io_uring

Linux soporta E/S asíncrona desde hace mucho tiempo. Sin embargo, la interfaz tiene un amplio número de problemas. No soporta, por ejemplo, E/S con búfers, sólo E/S sin buffers (O_DIRECT), que sólo utiliza un subconjunto de un subconjunto de aplicaciones. Incluso en esos casos, la E/S no era siempre asíncrona ni rápida. Todos los intentos de mejorar la interfaz existente han fracasado. 

Esta versión incluye una nueva interfaz, io_uring, que trae a Linux E/S asíncrona rápida y escalable, tanto con búfers como sin ellos, y soporta también E/S asíncrona con polling. Para más detalles, lea este  documento (PDF) que explica las razones por las que se ha creado io_uring, su funcionamiento interno, y la interfaz de cara al usuario. Para detalles sobre el rendimiento, vea este email.

Adicionalmente, se ha creado una librería, liburing, para las aplicaciones que no necesitan o no quieran preocuparse de juguetear con los detalles de bajo nivel de la interfaz. Tiene ayudantes que permiten a las aplicaciones configurar una instancia io_uring y enviar/completar E/S  in conocer los detalles más escabrosos de los anillos; continuará añadiendo ayudantes y más características con el tiempo.

2. Mejoras en fanotify para una mejor monitorización del sistema de archivos

A diferencia de otros sistemas operativos, Linux no proporciona un sistema eficiente para vigilar los cambios que ocurren en un sistema de archivos grande. La única manera de monitorizar eventos de modificación a un directorio es inotify, que escala mal con grandes árboles de directorios. La interfaz fanotify, introducida en Linux 2.6.36, tenía la pretensión de sustituir inotify y solucionar sus deficiencias, e inicialmente dió algunos pasos en esa dirección, pero la funcionalidad requerida para sustituir a inotify por completo.

Esta versión (junto con los cambios añadidos en Linux 4.20) expanden inotify para proporcionar la funcionalidad "super block root watch", que es una manera escalable de observar los cambios en grandes sistemas de archivos. Para más detalles, lea el wiki del proyecto.

3. Entrega segura de señales en presencia de reutilización de PID

La llamada al sistema kill(2) opera con PIDs. Tras la salida y muerte de un proceso, su numero de PID puede ser reutilizado por otro proceso. Si un proceso envía una señal a un PID reutilizado, estará enviando la señal al PID equivocado. Este es un problema conocido con el diseño de Unix, y ha provocado numerosos problemas de seguridad.

Tras considerar varias opciones, Linux ha añadido la llamada al sistema pidfd_send_signal(2), que utiliza descriptores de archivo de /proc/ para referencias a struct pid. Incluso tras el reciclado de un número PID, el descriptor no cambiará y hará referencia al viejo PID y no al nuevo, lo cual permite enviar señales al PID que en verdad se desea.

4. Utilización de memoria persistente como RAM

Linux soporta dispositivos de memoria persistente, pero normalmente son utilizados como dispositivos de almacenamiento. Algunas personas desean utilizar la memoria persistente como memoria volátil, están dispuestos a lidiar con las diferencias de rendimiento con la RAM, y quieren utilizar las APIs tradicionales de gestión de memoria en lugar de un asignador de memoria en espacio de usuario ubicado sobre el mmap() de un archivo DAX. Esta versión de Linux les permite hacer eso.

5. TEO, un gobernador alternativo a 'menu'

El  subsistema cpuidle es la parte del kernel encargada de decidir qué estado de sueño profundo utilizar cuando la CPU no tiene nada que hacer (los estados de sueño más profundo ahorran más energía, pero cuesta más salir de ellos). Hay dos gobernadores cpuidle, "menu" y "ladder", cada uno con diferentes heurísticas. Sin embargo, se cree que el gobernador "menu" tiene una serie de deficiencias que han llevado a añadir una alternativa: TEO, Timer Events Oriented Governor, que parece ofrecer mejoras de rendimiento sin aumento del consumo de energía. Puede observarse el gobernador que está siendo utilizado en /sys/devices/system/cpu/cpuidle/current_governor_ro, y cambiar el gobernador por defecto en el arranque con el parámetro cpuidle.governor=teo.

6. Más preparación para el año 2038

Como parte del trabajo para prepararse para el problema del año 2038, esta versión incluye llamadas de sistema con time_t de 64 bits para todas las arquitecturas de 64 bits. Esto permite finalmente tener llamadas al sistema con 64-bit time_t en todas las arquitecturas.

7. Compresión Zstd configurable para Btrfs

Btrfs tiene soporte de compresión Zstd desde Linux 4.14, pero no permitía configurar el nivel de compresión utilizado. Esta versión añade soporte para configurar el nivel de compresión en Btrfs, como se hace con zlib, utilizando la opción de montaje -o compress=zstd:nivel. Para ver los niveles disponibles y su impacto en el rendimiento y en el ratio de compresión, vea este commit.

8. Arranque desde un dispositivo de device mapper sin initramfs

Para arrancar a un sistema de archivos ubicado en un dispositivo device mapper, se necesita un initramfs. Algunas personas, sin embargo, querrían o no pueden usar un initramfs. Esta versión permite utilizar targets DM en el proceso de arranque sin la necesidad de initramfs, con la ayuda de un complicado parámetro de arranque del kernel. Para más detalles vean la  documentación.

9. parcheado en vivo: soporte para parches acumulativos

Puede haber dependencias entre los parches en vivo. Si diferentes parches necesitan hacer diferentes cambios a la misma función, es necesario definir el orden en el que los parches serán instalados. Y implementaciones de funciones en los parches en vivo más nuevos deberán realizarse encima de los viejos, algo que pronto se convierte en una pesadilla para mantener, especialmente si alguien quiere eliminar uno de los parches que está en medio de la pila. Una solución elegante que se incluye en esta versión es algo llamado "reemplazo atómico". Permite la creación de "parches acumulativos" que incluyen todos los cambios de los parches viejos y los reemplazan por completo en una sóla transición. Como resultado, los autores de parches en vivo pueden mantener las fuentes para un sólo parche acumulativo. Para más detalles, vea la documentación

Y eso es todo. Como siempre, pueden encontrar la lista completa de cambios, en inglés, en esta página.

29 de enero de 2018

Las novedades de Linux 4.15

Ya se ha anunciado la versión 4.15 de Linux. Además del código más actualizado para lidiar con Meltdown/Spectre, esta versión incluye soporte de modesetting y otras funciones avanzadas de display en el driver amdgpu; mejor gestión energética en sistemas con SATA Aggressive Link Power Management; un port para las CPUs RISC-V; soporte inicial para cifrado de memoria virtualizada en CPUs de AMD; soporte para la función de seguridad "User Mode Instruction Prevention" de Intel; soporte para el controlador de CPU en el sistema de control de recursos cgroupv2; una nueva bandera mmap(2) para permitir escritura directa a la memoria persistente que sea gestionada por sistemas de archivos; y muchos drivers nuevos y otras mejoras. La lista completa de cambios, en inglés, puede encontrarse aquí.



· Meltdown/Spectre 
Esta versión incorpora el último código para lidiar con Meltdown/Spectre. Para solucionar el problema Meltdown en CPUs Intel se incluye Page Table Isolation (puede ser desactivada con la opción del kernel pti=off). Para mitigar el problema Spectre v2, que afecta tanto a Intel como AMD, se requiere una versión de GCC que soporte la opción -mindirect-branch=thunk-extern, y puede desactivarse con la opción del kernel spectre_v2=off (si no tienes un compilador con esa funcionalidad, tendrás una mitigación mínima que sólo está en el código escrito en ensamblador, pero no en el código en C). La arquitectura PowerPC también está afectada por Meltdown en muchos modelos, y para prevenir ataques se incorpora la funcionalidad "RFI flush of L1-D cache". ARM también está afectada por Meltdown, pero las soluciones para ello se incluirán en la próxima versión. Tampoco se incluyen soluciones para Spectre v1.

Se ha añadido un directorio /sys/devices/system/cpu/vulnerabilities/ en el que se muestran las vulnerabilidades que afectan a la CPU y las mitigaciones que están siendo aplicadas.


· Modesetting y mucho mejor soporte de vídeo en el driver amdgpu


Esta versión incluye por fin el "display code" (132k LoC) que faltaban desde hace mucho tiempo en el driver amdgpu. Proporciona la funcionalidad "atomic modesetting" para hardware DCE8 (CIK), DCE10 (Tonga, Fiji), DCE11 (CZ, ST, Polaris), DCE12 (vega10), y DCN1 (RV); incluyendo HDMI y audio DP, DP MST, y muchas otras funciones avanzadas. Este soporte ha sido activado por defecto para Vega10 y Raven; el hardware anterior a vega10 aun no por dudas sobre la estabilidad, pero quien quiera probar puede activarlo manualmente con la opción del módulo amdgpu.dc=1


· Mejor gestión energética en sistemas con SATA Link Power Management


Durante muchos, muchos años, Linux ha tenido problemas con los sistemas que tienen controladores SATA AHCI con ALPM (Aggressive Link Power Management), es decir, equipos con Haswell, Broadwell o Skylake. Debido a la escasa documentación disponible, Linux no ha soportado correctamente este ALPM, y sin un soporte correcto de esa función, el sistema no puede entrar en los modos de ahorro de energía profundo, lo que se traduce en un acortamiento notorio de la vida de la batería. A mejorar esta situación no ha ayudado que una gestión incorrecta de ALPM se tradujese con frecuencia en pérdida de datos.

En esta versión, se ha incluído un parche que intenta implementar ALPM imitando el comportamiento por defecto de Windows, lo cual proporciona mejoras en el consumo de energía sin poner en riesgo los datos. En un portátil de prueba T440, el ahorro en estado de reposo es de entre 0.9 y 1.2W.


· Nueva arquitectura: RISC-V

Esta versión incorpora las principales partes del port a CPUs RISC-V. RISC-V es un con junto de instrucciones abierto que, a diferencia de las CPUs propietarias, puede usarse libremente para cualquier propósito, permitiendo a cualquier persona diseñar, manufacturar y vender chips y software RISC-V.

Este port está a medias. Aunque compila y arranca, los drivers aun no están disponibles en esta versión.


· Soporte para cifrado de memoria virtualizada en chips AMD


Linux 4.14 ya añadió soporte para AMD Secure Memory Encryption, una característica que permite que la memoria en RAM esté cifrada, y se descifre y cifre de nuevo automáticamente cuando la CPU lea o escriba a la memoria RAM, protegiendo de ese modo sus contenidos de ataques físicos al sistema.

Esta versión incorpora soporte inicial para Secure Encrypted Virtualization, que integra el cifrado de memoria en la arquitectura de virtualización AMD-V para así permitir máquinas virtuales cifradas; máquinas virtuales cuya memoria descifrada sólo puede ser accedida por la propia la máquina virtual, mientras que otras máquinas virtuales, o incluso el propio host, no pueden. Secure Encrypted Virtualization es especialmente útil en la nube, donde las máquinas virtuales no tienen por qué confiar en la empresa que la gestiona. Esta versión añade soporte para usar memoria cifrada en el huésped, los cambios necesarios para crear y gestionar huéspedes con memoria cifrada desde el anfitrión serán incluídos en las próximas versiones.


· Soporte para User-Mode Instruction Prevention

Esta versión incorpora soporte para una característica de CPUs intel llamada "User Mode Instruction Prevention". Cuando está activada, esta característica desactiva para el espacio de usuario ciertas instrucciones como SGDT, SLDT, SIDT, SMSW y STR, lo cual dificulta la creación de ciertos exploits. Por requerimientos de emuladores como WineHQ y DOSEMI2, las instrucciones SGDT, SIDT y SMSW serán emuladas en el modo protegido y virtual-8086 and protected modes (no habrá emulación para los procesos en modo "long").


· Mejor restricción del uso de CPU con el controlador de CPU para cgroupv2

La característica "control groups" con la jerarquía unificada, también llamado cgroup v2, fue implementada in 2.6.24 y declarada como estable en 4.5. Los controladores de recursos individuales tenían que ser portados a este nuevo diseño. La ausencia más llamativa era la del controlador de CPU, que proporciona a los cgroups la capacidad de limitar el uso de CPU para grupos de procesos. El problema es que para la inclusión del controlador de CPU se requería en primer lugar completar la funcionalidad de cgroupv2, específicamente el "thread mode", que fue incluido en 4.14, y que proporciona soporte para la gestión de recursos entre los hilos de un grupo. Tras todo ese trabajo llega a esta versión, por fin, el controlador de CPU para cgroupv2.


· Nueva bandera mmap(2) MAP_SYNC para permitir escritura directa a la memoria persistente que esté gestionada por sistemas de archivos.

Esta versión introduce las banderas MAP_SYNC y MAP_SHARED_VALIDATE a mmap(2). Para más detalles, ver este artículo de LWN: Two more approaches to persistent-memory writes.


Y eso es todo. Como siempre, pueden encontrar la lista completa de cambios, y en inglés, en esta página

2 de mayo de 2017

Las novedades de Linux 4.11

Ya se ha anunciado la versión 4.11 de Linux. Esta versión añade soporte para cambiar el planificador de E/S en vivo en la capa de bloques multiqueue, soporte de journalling en la implementación RAID5 MD que permite cerrar el "write hole", una implementación de swap más escalable para el swap ubicado in SSDs, una nueva llamada al sistema que resuelve deficiencias de la actual interfaz stat(), una nueva herramienta perf ftrace que actúa como un frontend para la interfaz ftrace, soporte para dispositivos de almacenamiento que siguen la especificación OPAL, soporte para el protocolo Shared Memory Communications-RDMA protocol definido en el RFC7609 y búfers persistentes para la consola VGA. También se han incluido drivers nuevos y muchas otras mejoras y pequeños cambios. La lista completa de cambios, en inglés, puede encontrarse aquí, como siempre. 



· Soporte para cambiar el planificador de E/S en vivo en la capa de bloques multiqueue

Es bien sabido que la capa de bloques de Linux tiene diferentes planificadores de E/S (deadline, cfq, noop, etc), con diferentes características cada uno, y los usuarios pueden cambiar entre uno y otro en vivo. En Linux 3.13, la capa de bloques añadió un nuevo diseño multicola, diseñada para el hardware moderno (SSD, NVMe). Sin embargo, este nuevo diseño multicola no incluía el soporte para planificadores de E/S. Esta versión resuelve ese problema con la inclusión de soporte de planificadores de E/S en el soporte multicola de la capa de bloques. También se ha incluído un port del planificador deadline (otros serán añadidos en el futuro). 


· Swapping escalable para SSDs

Los dispositivos de almacenamiento como SSDs hacen que el uso de swap más atractivo, no sólo como una manera de lidiar con el exceso de uso de memoria, sino también como una técnica de mejora de rendimiento. Por ejemplo, los proveedores de servicios de nubes pueden hacer overcommit de memoria más agresivamente y meter más VMs en una plataforma con el swap ubicado en un dispositivo de almacenamiento rápido. Sin embargo, la implementación de swap fue diseñada para los discos duros tradicionales, para los que el rendimiento y la latencia del swap no era tan importante. Esta versión mejora la implementación de swap para hacerla más escalable, y por lo tanto más adecuada para ser utilizada con dispositivos de almacenamiento modernos. 


· Journaling en RAID5 para cerrar el write hole

Basada en el trabajo que empezó en Linux 4.4, esta versión añade soporte de journaling para RAID4/5/6 en la capa MD (no confundir con el RAID de btrfs). Cuando se configura un dispositivo de journaling (típicamente NVRAM o SSD), el "write hole" de RAID5 desaparece - un crash durante el modo degradado no puede causar corrupción. 


· statx(2), una alternativa moderna para stat(2)

Debido a varias carencias en la llamada al sistema stat(2) (tal y como no estar preparada para el problema y2038 o no funcionar bien con los sistemas de archivo de red), se ha estado trabajando durante años en una nueva llamada al sistema, y el resultado final ha sido statx(2), una nueva llamada que ha sido añadida en esta versión. Para más información: statx() v3. 


· Nueva herramienta de perf, perf ftrace

Perf ha añadido una nueva herramienta: perf ftrace. Esta herramienta pretende ser un simple front-end para la interfaz ftrace. En esta versión, perf ftrace sólamente soporta dos trazadores, function_graph y function (por defecto function_graph; pueden configurarse otros con la opción de configuración ftrace.tracer). En esta versión solamente se soporta el trazado de un sólo proceso, y la herramienta sólo lee el archivo trace_pipe y lo escribe a stdout. En el futuro se añadirán otras características. 


· Soporte para dispositivos de almacenamiento OPAL

La Especificación de almacenamiento OPAL es un conjunto de especificaciones para dispositivos de almacenamiento que mejora su seguridad. Por ejemplo, define una manera de cifrar los datos para que personas no autorizadas no puedan acceder a los datos. Es decir, es una especificación para discos auto-cifrados. Esta versión añade soporte de OPAL con controladores NVMe.


· Soporte para el protocolo SMC-R (RFC7609)

Esta versión añade la implementación inicial del protocolo "Shared Memory Communications-RDMA" (SMC-R) tal y como está definido en el RFC7609. SMC-R es un protocolo de IBM que proporciona capacidades RDMA sobre RoCE de manera transparente para aplicaciones que usan sockets TCP. SMC-R no pretende reemplazar TCP, introduce una familia de protocolos PF_SMC. Las aplicaciones no requieren modificaciones más allá de especificar el uso de la nueva familia de sockets AF_SMC; las aplicaciones que no han sido modificadas incluso pueden ser utilizadas con ayuda de preloading de una librería.


· Búfers persistentes para las consolas VGA

No se trata de una característica importante, especialmente para los usuarios de tmux/screen, pero probablemente fastidioso para otros: esta versión añade soporte opcional para que el historial de scrollback de las consolas no se borre cuando se cambia de una a otra.

Y eso es todo. Como siempre, pueden encontrar la lista completa, y en inglés, en esta página