16 de mayo de 2016

Las novedades de Linux 4.6

Ya se ha anunciado la versión 4.6 de Linux. Esta versión añade soporte para USB 3.1 SuperSpeedPlus (10 Gbps), un nuevo sistema de archivos distribuido OrangeFS, una implementación del "OOM killer" más fiable, soporte para una característica de CPUs Intel llamada "memory protection keys", un sistema para implementar más fácilmente protocolos de capa de aplicación (nivel 7 OSI), soporte para cifrado a nivel de MAC 802.1AE (conocido como MACsec), soporte para la versión V del protocolo BATMAN, un chequeador de inodos online en OCFS2, soporte de diferentes espacios de nombre en los cgroups, soporte del layout SCSI en pNFS, y muchas otras mejoras y nuevos controladores. La lista completa de cambios, en inglés, puede encontrarse aquí, como siempre.


· Soporte de USB 3.1 SuperSpeedPlus (10Gbps)
La especificación de USB 3.1 incluye un nuevo protocolo SuperSpeedPlus que soporta velocidades de hasta 10 Gbps. Los dispositivos que utilizan este nuevo protocolo son apodados como dispositivos USB 3.1 Gen2 (nótese que SuperSpeedPlus no es lo mismo que Type-C)

Esta versión añade soporte de la velocidad de 10 Gbps de USB 3.1 SuperSpeedPlus para el subsistema USB y el controlador host xHCI, lo cual significa que un dispositivo de almacenamiento USB 3.1 conectado a un host xHCI USB 3.1 debería poder alcanzar la velocidad de 10 Gbps.

· Mejora de la fiabilidad del asesino OOM

En anteriores versiones, el asesino OOM (que intenta matar un proceso cuando el sistema se queda sin memoria) intentaba matar un proceso con la esperanza de que acabase en un tiempo razonable y liberase su memoria. En la práctica, se ha demostrado que es fácil crear situaciones en las que esa asunción sea errónea, y el proceso elegido para ser eliminado tarde mucho tiempo porque ha sido bloqueado por otro proceso que está, a su vez, esperando a que se libere memoria. Esta versión añade un thread de kernel especializado, oom_reaper, que intenta liberar memoria librándose por adelantado de la memoria anónima o enviada al swap de la víctima, bajo la asunción de que esa memoria no será utilizada posteriormente.

· Soporte de Intel Memory Protection keys

Esta versión añade soporte para una característica de hardware para la protección de memoria, que estará disponible en futuras CPUs Intel: protection keys. Protection keys permite insertar en las entradas de la tabla de páginas una serie de máscaras de protección configurables. En lugar de tener en la tabla de páginas una protección fija para una página determinada (que requiere una llamada al sistema y debe cambiar los permisos una vez por cada página), el usuario puede definir unas pocas áreas de memoria. Luego, el espacio de usuario puede manipular un nuevo registro (PKRU, individual para cada proceso/thread) donde se pueden asignar a cada área de memoria dos bits separados: Desactivar Acceso y Desactivar Escritura. De ese modo, con la sola escritura en ese registro, se puede cambiar la protección de enormes porciones de memoria, sin tener que cambiar los permisos de cada una de las páginas.

También permite un control más preciso de los permisos de la MMU: Por ejemplo, el bit para desactivar la ejecución es distinto del bit para desactivar la lectura. Esta versión añade soporte para cambiar esos bits, y además añade una API para poder hacer uso de las protection keys. Si un programa en espacio de usuario hace la llamada mmap (..., PROT_EXEC) o mprotect(ptr, sz, PROT_EXEC), (nótese el PROT_EXEC sólo, sin PROT_READ/WRITE), el kernel notará este caso especial, y activará una protection key en este rango de memoria, y cambiará el contenido del registro PKRU. De ese modo, con las protection keys el kernel puede implementar un "verdadero" PROT_EXEC: código que puede ser ejecutado, pero no leído, lo cual es una pequeña ventaja de seguridad (pero téngase en cuenta que el código malicioso también puede manipular el registro PKRU). En el futuro, habrá mejoras en la implementación de esta caraterística y nuevas APIs de más alto nivel.

· OrangeFS, un nuevo sistema de archivos distribuido

OrangeFS es un sistema de almacenamiento paralelo, originalmente llamado PVFS y desarrollado en 1993 como parte de una beca de la NASA para estudiar los patrones de E/S de programas paralelos. Es ideal para solucionar los problemas de gran almacenamiento que se encuentran en entornos de HPC, BigData, Streaming de Video, Genómica, Bioinformática. OrangeFS puede ser accedido a través de utilidades del sistema, librerías, MPI-IO y puede ser utilizado por el ecosistema Hadoop como alternativa al sistema de archivos HDFS.

Las aplicaciones a menudo no requieren que OrangeFS esté montado en el VFS, pero el cliente del kernel de OrangeFS permite montarlos. El cliente del kernel se comunica con un demonio en espacio de usuario que a su vez se comunica con el demonio-servidor de OrangeFS que implementa el sistema de archivos. El demonio-servidor no tiene por qué estar ejecutándose en el mismo sistema que el cliente del kernel. Los sistemas de archivo OrangeFS también pueden montarse con FUSE.

· Multiplexor de conexiones del kernel, una herramienta para acelerar protocolos de capa de aplicación 

Esta versión añade el "Kernel Connection Multiplexor" o KCM, un sistema que proporciona una interfaz basada en mensajes sobre TCP para acelerar protocolos de la capa de aplicación. La motivación que tiene procede de la observación de que aunque TCP es un protocolo de transporte orientado a los streams de bytes, sin concepto de límites entre mensajes, un caso de uso común es la implementación de protocolos en la capa de aplicación dividido en mensajes, que se ejecuta sobre TCP. La mayor parte de pilas TCP ofrecen APIs de streams de bytes, lo cual fuerza a las aplicaciones a gestionar la delineación de mensajes, la atomicidad del envío y recepción de los mensajes, y balanceo de carga.

Con KCM una aplicación puede enviar y recibir eficientemente mensajes de un protocolo de la capa de aplicación sobre TCP. EL kernel proporciona la seguridad necesaria de que el mensaje será recibido y enviado atómicamente. Esto libera a la aplicación de buena parte del tedio de tener que mapear un protocolo basado en mensajes a un stream TCP. Para delinear el límite de los mensajes en el stream TCP, el kernel implementa un parseador de mensajes basado en BPF. Casi todos los protocolos de aplicación son parseables de esta manera, de modo que KCM debería ser usable por un amplio rango de aplicaciones.

· Cifrado a nivel de MAC 802.1AE (MACsec)

Esta versión añade soporte para MACsec IEEE 802.1AE, un estandar que proporciona cifrado sobre ethernet. Cifra y autentifica todo el tráfico en una red LAN con GCM-AES-128. Puede proteger el tráfico DHCP y las VLANs y prevenir la manipulación de cabeceras de ethernet. MACSex está diseñado para ser utilizado con la extensión al protocolo 802.1X MACsec Key Agreement, que proporciona un mecanismo para la distribución de claves a los nodos, pero también puede utilizarse con claves estáticas configuradas manualmente por el administrador.

· Soporte para el protocolo V de BATMAN

B.A.T.M.A.N. (Better Approach To Mobile Adhoc Networking) añade en esta versión soporte para el  protocolo V, sucesor del protocolo IV. El nuevo protocolo divide el protocolo OGM en dos subcomponentes: ELP (Echo Location Protocol), que se ocupa del descubrimiento de nuevos nodos y estimación de la calidad de los enlaces; y un nuevo protocolo OGM, OGMv2, que implementa el algoritmo que difunde las métricas a lo largo de la red y computa las rutas óptimas. El cambio más importante introducido en esta versión del protocolo es la nueva métrica: Ya no se basará en la pérdida de paquetes, sino en la estimación del ancho de banda.

· dma-buf: una nueva ioctl para gestionar la coherencia entre la GPU y la CPU

Los programas pueden necesitar algún tipo de mecanismo de gestión de la coherencia cuando tanto la CPU como la GPU están accediendo a recursos dma-buf simultáneamente. Para resolver este problema se ha añadido la ioctl DMA_BUF_IOCTL_SYNC, que permite manejar esos problemas de coherencia.

· Chequeador de inodos online para OCFS2

OCFS2 a menudo es utilizado en sistemas de alta disponibilidad. OCFS2 suele remontar automáticamente el sistema de archivos al modo sólo-lectura cuando se encuentra un error, pero esta acción disminuye la disponibilidad, y no siempre es necesario. Existe una opción de montaje (errors=continue) que permite evitar ese montaje a sólo-lectura: sólo se devuelve -EIO al proceso que causó el error y se reporta el número de inodo problemático en el dmesg. Esta versión añade un chequeador de inodos muy simple en el kernel que puede utilizarse para comprobar y resetear el inodo. Nótese que esta característica está dirigida para problemas muy pequeños que puedan entorpecer las operaciones diarias de un cluster, no está dirigido a comprobaciones complejas, que deben seguir utilizando el fsck offline.

· Soporte para diferentes espacios de nombre en los cgroups

Esta versión añade soporte para diferentes espacios de nombre en los cgroups, lo cual proporciona un mecanismo para virtualizar el contenido del archivo /proc/$PID/cgroup y de los montajes de cgroups. Se ha añadido una nueva bandera a clone(2) y unshare(2), CLONE_NEWCGROUP, que permite crear un nuevo espacio de nombres de cgroup. Para un contenedor correctamente configurado, esto permite a las herramientas de contenedores (libcontainer, lxc, lmctfy, etc) crear contenedores virtualizados que no revelen información crítica sobre otras jerarquías cgroup del sistema.

· Soporte del layout SCSI para pNFS

Esta versión añade soporte en pNFS (parallel NFS, disponible en NFS v4.1) para layouts SCSI en el servidor NFS de Linux. Con los layouts SCSI, el servidor NFS actua como un Servidor de Metadatos para pNFS, que además de gestionar todo el acceso a metadatos de la exportación NFS, también ofrece layouts al cliente de manera que los clientes puedan acceder los LUNs SCSI. Para más detalles ver draft-ietf-nfsv4-scsi-layout

Estas son las novedades principales de este kernel. Como siempre, pueden encontrar la lista completa, y en inglés, en esta página.

1 de abril de 2016

Las novedades de Linux 4.1

(Nota: aunque con un retraso enorme, aquí va este post)

Ya se ha anunciado la versión 4.1 de Linux. Esta versión añade soporte de cifrado integrado en Ext4, soporte experimental de arrays RAID compartidos en clúster, un nuevo target del device mapper que permite mantener un registro de todas las escrituras hechas a un dispositivo y que permite reproducirlas, un driver que convierte la memoria de sistemas con memoria persistente en un dispositivo de bloques, posibilidad de desactivar el soporte multiusuario, soporte para el Multiprotocol Label Switching que permite enrutar paquetes basándose en etiquetas de ruta en lugar de direcciones de red, capacidad de asociar programas BPF a sondas kprobes, soporte de ACPI en la arquitectura ARM64, y un driver GEM virtual que permite construir mejores rasterizadores por software. También hay nuevos drivers y muchas pequeñas mejoras. La lista completa de cambios, en inglés, puede encontrarse aquí, como siempre.


· Soporte de cifrado en Ext4

Linux ya proporciona sistemas para cifrar archivos, tales como dm-crypt o ecryptfs, pero tienen ciertos costes de rendimiento y consumo de memoria. En esta versión, el sistema de archivos Ext4 añade soporte nativo para cifrado: tanto los datos como los nombres de los archivos pueden ser cifrados con una clave proporcionada por el usuario. La clave se utiliza para los archivos de un directorio y todos sus subdirectorios. Cuando haya que leer un archivo, si no se ha proporcionado previamente una clave válida, sólo se podrá leer los nombres de archivo cifrados, pero pero no los descifrados, y los datos cifrados no se podrán leer.

Para usar esta característica, se necesitan e2fsprogs versión 1.43 y el software keyutils. Aquí hay un pequeño howto. Para detalles sobre el diseño interno, ver aquí. Artículo de LWN recomendado: Ext4 encryption

· Soporte experimental de clustering en MD

Esta versión añade soporte experimental de clústering en MD (Linux software RAID). Un Cluster MDes un dispositivo compartido RAID para un clúster. Permite bloqueos y sincronización a través de múltiples sistemas de un clúster, de modo que todos los nodos del clúster pueden acceder al dispositivo MD simultáneamente, proporcionando la redundancia (y uptime) del RAID a todos los nodos del clúster. En esta versión, la implementación está limitada a RAID1, pero en el futuro podría extenderse a otros niveles RAID. El código en esta versión es altamente experimental. Howto: howto

· Device mapper: nuevo target que guarda un registro de las escrituras

En esta versión, el device mapper introduce un nuevo target que permite hacer un registro de todas las operaciones de escritura, y guardar ese registro en un dispositivo separado, de modo que puedan reproducirse las operaciones a posteriori. La motivación de esta funcionalidad es proporcionar a los desarrolladores una herramienta para verificar el sistema de archivos en varios puntos de la vida de un sistema de archivos, permitiéndoles reproducir el registro hasta un punto concreto.

· Soporte de monousuario

Puede parecer extraño que un sistema multi-usuario como Linux quiera adoptar una funcionalidad que es una regresión al pasado, tal y como lo es la eliminación de la protección multi-usuario. Pero resulta que los dispositivos embebidos quieren hacer Linux lo más pequeño que sea posible, y no necesitan las capacidades multi-usuario. En esta versión, es posible configurar el kernel para que el UID y GID de todos los procesos sean cero (root) en todos los casos. Con esto, se ahorra la compilación de 25 KB de código en una configuración defconfig. Artículo LWN recomendado: Linux as a single-user system

 · Driver virtual GEM para implementar mejores rasterizadores por software

El driver vGEM proporciona un GEM (graphics memory manager) que puede ser utilizado por el renderizador por software de la librería MESA para mejorar el rendimiento.

· Dispositivo de bloques para memoria persistente

Hay nuevos tipos de memoria que pueden ser accedidas casi tan rápido como la RAM, pero que no pierden los datos cuando se apaga el equipo. Este tipo de memoria se llama memoria persistente. En esta versión, Linux incluye PMEM, un driver que representa un rango de memoria reservado como un dispositivo de bloques, que puede ser utilizado posteriormente por sistemas de archivo. Artículo recomendado de LWN: Persistent memory support progress

· Multiprotocol Label Switching

Esta versión añade soporte para Multiprotocol Label Switching (MPLS). MPLS es un transporte de red escalable e independiente de protocolo, que dirige los datos de un nodo al siguiente basándose en etiquetas cortas en lugar de direcciones de red, de modo que se evitan las búsquedas complejas en la tabla de enrutado, porque las decisiones sobre el redireccionamiento de paquetes se toman en base de los contenidos de una etiqueta, sin necesidad de examinar el paquete. Las etiquetas identifican enlaces virtuales (rutas) entre nodos distantes, en lugar de destinos. MPLS puede encapsular paquetes de varios protocolos de red.

· Los programas BPF pueden ser asociados a sondas kprobes

En esta versión, Linux permite asociar pequeños programas BPF a sondas kprobes, proporcionando de este modo una manera segura de ejecutar programas BPF, sin riesgos para la seguridad o la estabilidad. Esto permite construir, en un kernel en ejecución, instrumentación definida por el usuario que no puede colgar o interferir con el kernel. En esta versión, sólo se permite el uso por root.

· Soporte de ACPI para la arquitectura ARM64

Durante mucho tiempo, ACPI ha sido una característica exclusiva de sistemas x86 (e Itanium). A pesar de las controversias, algunas partes del mundo ARM han empezado a utilizar el estándar ACPI. Esta versión añade soporte preliminar de ACPI 5.1 a la arquitectura arm64.



Estas son las novedades principales de este kernel. Como siempre, pueden encontrar la lista completa, y en inglés, en esta página.

31 de marzo de 2016

Las novedades de Linux 4.2

(Nota: aunque con un retraso enorme de medio año, aquí va este post)

Ya se ha anunciado la versión 4.2 de Linux. Esta versión añade el driver amdgpu para GPUs de AMD, un driver virtio para la virtualización de GPU, la nueva API gráfica "atomic modesetting" ya es estable, soporte para usar más de un módulo de seguridad al mismo tiempo, una implementación de spinlock más rápida y escalable, soporte de control de writeback dentro de los cgroups, y la reintroducción del soporte para la arquitectura H3/800. 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.


· Nuevo driver amdgpu para hardware AMD Radeon moderno

Esta versión incluye el driver amdgpu, un nuevo driver para asics AMD VI+. Actualmente soporta Tonga, Iceland y Carrizo, y también contiene una opción para soportar experimentalmente partes CI. Toda la funcionalidad importante está soportada. La gestión energética funciona en Carrizo, pero todavía está en desarrollo para Tonga e Iceland.

Este driver es un punto de partida de cero de AMD para centrar en él su nueva estrategia de apuesta por el software libre: Su propósito es que el único driver para gráficos AMD sea éste; la funcionalidad privativa que existe actualmente en el driver Catalyst será portada al driver o se ejecutará como un binario que se ejecute en espacio de usuario e interactúe con el driver.

· Driver virtio para GPUs
Los drivers virtio son "falsos" drivers diseñados para hacer la comunicación entre huéspedes y anfitriones de virtualización más eficiente. Emular el hardware real es complejo e ineficiente, estos drivers en cambio son conscientes de estar ejecutándose en entornos virtualizados, y ofrecen canales para el intercambio de datos simples y rápidos.

En esta versión se incluye un driver para GPUs virtuales. Puede ser utilizado en máquinas virtuales de QEMU. Por ahora sólo soporta kernel-modesetting; el driver modesetting de X.org es capaz de gestionar el dispositivo perfectamente, y también está disponible el framebuffer para fbcon. Los parches para el soporte en QEMU están siendo revisados. La versión inicial sólo tiene soporta para 2D; el soporte 3D requiere más trabajo en QEMU y será añadido más tarde.

· La API atomic modesetting activada por defecto

Esta versión por fin completa la nueva API atomic modesetting, y la activa por defecto (hasta ahora era experimental y requería ser activada manualmente). Esta API es necesaria para implementar mejor los sistemas gráficos modernos; para más detalles sobre esta API y por qué es necesaria, se recomienda leer estos artículos de LWN: Atomic mode setting design overview, parte 1, y parte 2

· Apilado de módulos de seguridad

Hay varios módulos de seguridad disponibles en Linux, pero sólo se puede usar uno al mismo tiempo. Durante muchísimo tiempo, ha habido desarrolladores que han querido poder utilizar más de un módulo de seguridad al mismo tiempo ("stacking", es decir "apilando" otro módulo tras el primero). Esta versión añade soporte para el "apilado" de módulos de seguridad. Para más detalles, léase Progress in security module stacking

· Una nueva implementación de spinlocks

Esta versión añade soporte en la arquitectura x86 para un nuevo tipo de spinlocks basados en una cola. Esta nueva implementación es capaz de reemplazar la actual implementación por defecto de spinlocks basado en "tickets", sin incrementar el tamaño de la estructura de datos del spinlock.

Este nuevo spinlock tiene un rendimiento ligeramente lejor que el "ticket" en caso de que no haya contención, y su rendimiento puede ser mucho mejor cuando hay contención moderada o alta. Es especialmente útil para máquinas NUMA con al menos 2 sockets; aunque incluso con sólo 2 sockets puede haber mejoras significativas, dependiendo del trabajo a realizar. También puede mejorar el rendimiento de un test de estrés intensivo de E/S e interrupciones hasta un 20%. Para más detalles, leer MCS locks and qspinlocks.

· Soporte de control de writeback dentro de un cgroup

Linux es capaz de limitar a los procesos que están intentando escribir muchas páginas de memoria al disco (writeback). Pero este control es global, y no permite un control personalizado en los cgroups. Esta versión añade soporte para control de writeback a los procesos de un cgroup. Para más detalles, ver Writeback and control groups

· Reintroducción de la arquitectura H8/300

Linux añadió soporte para la arquitectura H8/300 en Linux 2.5.68. Pero fue eliminada en Linux 3.13 por falta de mantenimiento.

En esta versión, se ha vuelto a implementar el soporte para esta arquitectura.



Estas son las novedades principales de este kernel. Como siempre, pueden encontrar la lista completa, y en inglés, en esta página