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.