3 de enero de 2017

Las novedades de Linux 4.8


(Post muy retrasado)
La versión 4.8 de Linux se anunció el  2 de Octubre de 2016. Esta versión añade soporte para el uso de páginas gigantes en el caché de páginas; soporte de eXpress Data Path, una opción para el tráfico de red programable y de alto rendimiento; soporte para mapeados inversos en XFS que son la fundación de varias mejoras que se añadirán en el futuro; verificación más estricta de las copias de memoria de espacio de usuario; soporte de etiquetado de seguridad en IPv6 (CALIPSO, RFC 5570); soporte para plugins de GCC; una nueva funcionalidad de virtio, vsocks, para facilitar la comunicación entre huéspedes y anfitriones; un nuevo algoritmo de congestión, TCP New Vegas; y la documentación ha sido convertida al formato reStructuredText. 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 el uso de páginas gigantes transparentes en el caché de páginas
Las páginas gigantes permiten la utilización de páginas mayores de 4Kb (en x86); cuando el sistema utiliza estas páginas automáticamente las llamamos "transparentes". Hasta ahora, Linux no soportaba el uso de páginas gigantes en el caché de páginas (páginas utilizadas para almacenar un caché de los sistemas de archivos). En esta versión se añade soporte para el uso de páginas gigantes transparentes en el caché de páginas cuando se utilicen sistemas de archivo tmpfs/shmem (el soporte para otros sistemas de archivo se añadirá en el futuro).

Se puede controlar el uso de páginas gigantes en tmpfs utilizando la opción de montaje huge=, que puede recibir cuatro parámetros: always (se intentará utilizar páginas gigantes cada vez que se necesite una nueva página); never (no utilizar páginas gigantes - este es el valor por defecto); within_size (solo se utilizarán páginas gigantes si no sobrepasa el tamaño de archivo, también se respetan las pistas a fadvise()/madvise()); advise (sólo se utilizarán páginas gigantes si son solicitadas con fadvise()/madvise()).

También hay un archivo en sysfs para controlar la asignación de páginas gigantes en montajes internos shmem: /sys/kernel/mm/transparent_hugepage/shmem_enabled. Este valor es utilizado para SysV SHM, memfds, shared anonymous mmaps (de /dev/zero de MAP_ANONYMOUS), objetos DRM de controladores GPU, ashmem. Además de las políticas señaladas arriba, shmem_enabled permite dos valores adicionales: deny (para ser usado en emergencias, para forzar la opción de páginas gigantes de todos los montajes); force (forzar el uso de páginas gigantes para todos - útil principalmente para pruebas)


· Soporte de eXpress Data Path

XDP o eXpress Data Path proporciona una ruta para datos de red de alto rendimiento y programable. Proporciona procesamiento de paquetes con poca sobrecarga al nivel más bajo de la capa de software. La mayor parte de la gran mejora de velocidad viene del procesado de páginas-paquetes RX directamente fuera del anillo RX del driver, antes de que haya alguna asignación de estructuras de metadatos, como SKBs. Sus propiedades son: XDP está diseñado para alto rendimiento; XDP está diseñado para ser programable, se puede implementar nueva funcionalidad al vuelo sin requerir modificaciones en el kernel; XDP no intenta circunvalar el kernel, se integra en las rutas rápidas de la pila de red; XDP no reemplaza a la pila TCP/IP, la complementa y se coordina con ella; XDP no requiere hardware especializado. Para más información, ver https://www.iovisor.org/technology/xdp y Express_Data_Path.pdf


· Mapeado inverso en XFS

El mapeado inverso permite a XFS localizar al propietario de un bloque específico en el disco de manera precisa. Está implementado como una serie de btrees (uno por cada grupo de asignación) que llevan cuenta de los propietarios de los extents. Se trata, de hecho, de un "árbol de espacio utilizado" que se actualiza cuando el sistema de archivos asigna o libera extents y es por tanto coherente con los btrees de espacio libres.

Esta infraestructura de mapeo inverso es el bloque fundacional de varias características que se añadirán a XFS en el futuro - reflink, copy-on-write, deduplicación, scrubbing online de metadatos y datos, reporte detallado de errores a los usuarios, y reconstrucción de sistemas de archivos dañados y corruptos significativamente mejorada. Hay muchas cosas nuevas que se incorporarán en las próximas versiones, y todo se basa en esta infraestructura. Por esa razón, se trata de una gran cantidad de código nuevo con nuevas características de formato de disco e infraestructura interna. Se trata de una característica experimental y no se recomienda su uso por el momento.


· Verificación más estricta de las copias de memoria desde el espacio de usuario

Esta es una característica de seguridad portada de Grsecurity. Cuando el kernel copie memoria desde o hacia el kernel (mediante las funciones copy_to_user() y copy_from_user()), se harán comprobaciones extra para asegurarse de que los rangos de memoria afectados no son sospechosos. Esto imposibilita toda una serie de exploits de heap overflow y exposiciones de memoria del kernel. El impacto en el rendimiento es apenas notable.


· Soporte para plugins de GCC

Al igual que el anterior, esta característica ha sido portada de Grsecurity. Permite el uso de plugins de GCC, que son pequeños módulos de compilador cargables que permiten analizar, cambiar y añadir código durante la compilación y pueden utilizarse para la instrumentación en tiempo de ejecución y análisis estático de código. Grsecurity utilizar estos mecanismos para mejorar la seguridad. Esta versión incluye dos plugins: sancov, un plugin que se utiliza como ayuda para kcov; y el plugin cyclomatic para el análisis de la complejidad ciclomática de una función


· virtio-vsocks para facilitar la comunicación entre huésped y anfitrión

Esta version añade virtio-vsock, que proporciona sockets AF_VSOCK que permiten la comunicación entre aplicaciones del huésped y el anfitrión. A diferencia de virtio-serial, virtio-vsock soporta la API de sockets POSIX, de modo que las aplicaciones de red existentes necesitan pocas modificaciones. La API permite conexiones N:1, de modo que múltiples clientes pueden conectarse a un mismo servidor simultáneamente. El dispositivo tiene una dirección asignada automáticamente, de modo que no es necesaria configuración alguna dentro del huésped.



· Soporte de etiquetado de seguridad IPv6 (CALIPSO, RFC 5570)

Esta versión implementa el RFC 5570 - Common Architecture Label IPv6 Security Option (CALIPSO). Está diseñado para ser usado en entornos de red MLS confiables. CALIPSO es muy similar a su primo de IPv4 CIPSO, y esta característica está basada en gran medida en ese código.



· Nuevo algoritmo de control de congestión TCP New Vegas

Esta versión añade un nuevo algoritmo de control de congestión, TCP New Vegas, que es una actualización importante de TCP Vegas. Al igual que Vegas, New Vegas es un sistema para evitar la congestión basado en el retraso. Su mecanismo de filtrado es similar: utiliza las mejores mediciones en un periodo concreto para detectar y medir la congestión. Está desarrollado para coexistir con redes modernas donde los anchos de banda son de 10 Gbps o mayores, donde los RTTs son de décimas de microsegundos, etc.Puede encontrarse una descripción aquí: http://www.brakmo.org/networking/tcp-nv/


· Documentación convertida al formato reStructuredText 

En un intento de modernizar la documentación del kernel, va a ser convertida al sistema Sphinx, que utiliza el formato reStructuredText.






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