2 de mayo de 2015

Las novedades de Linux 4.0

Ya se ha anunciado la versión 4.0 de Linux. Esta versión añade soporte para parchear el kernel en vivo, con el objetivo principal de corregir fallos de seguridad sin reiniciar; también se añade DAX, un sistema para evitar utilizar el cache del kernel cuando los sistemas de archivo funcionan en sistemas con almacenamiento de memoria persistente; kasan, un detector de errores de memoria de use-after-free y out-of-bounds; lazytime, una alternativa a relatime, que provoca que las modificaciones a los metadatos de archivos como atime se hagan sólo en cache y se escriban al disco de modo oportunista para mejorar el rendimiento; overlayfs añade soporte para tener múltiples capas inferiores; se añade soporte de Parallel NFS; y dm-crypt tiene importantes mejoras de escalabilidad. 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.


· Cambio de versión completamente abitrario

Esta versión incrementa la versión a 4.0. Esta cambio de 3.x a 4.0 no tiene ningún significado particular y no debe ser asociado con ningún cambio técnico de relevancia en el kernel. Esta versión podía haber sido la 3.20, pero Linus Torvalds se cansó del numero 3, hizo una encuesta, y lo cambio. Si, es frívolo. Cuanto menos piense sobre ello, mejor. 


· Parcheado en vivo

Esta versión incluye "livepatch", una caraterística que permite parchear el código del kernel en tiempo de ejecución, y que está orientada fundamentalmente a aquellas personas que quieran tener actualizaciones de seguridad sin necesidad de reiniciar. Esta característica nació como resultado de la fusión de kgraft y kpatch, dos intentos de SuSE y Red Hat que fueron iniciados para reemplazar el ahora propietario ksplice. Es relativamente simple y minimalista, y hace uso extensivo de infraestructura ya existente en el kernel (ftrace). El código está contenido en su propio directorio y no necesita "enganches" en el resto de subsystemas.

En esta versión livepatch no está completo, pero ya proporciona soporte para parchear funciones, incluye una API para los módulos del kernel que contengan los parches, y una API/ABI para espacio de usuario que permite operar los parches (ver cuáles están activos, activarlos, desactivarlos, etc). La mayoría de los CVEs pueden aplicarse de este modo. En esta versión sólo se soporta la arquitectura x86, otras llegarán en futuras versiones.


· DAX, acceso directo para sistemas con almacenamiento de memoria persistente

Antes de que sean leídos por los programas, los archivos se copian primero a los caches del kernel, que se encuentran en la memoria RAM. Pero es posible que en los próximos años se popularicen los sistemas basados en la llamada "memoria persistente", que proporcionan enormes cantidades de almacenamiento con velocidades de acceso equivalentes a la memoria RAM y mantendrían los contenidos a pesar de cortes de energía. En estos sistemas, no habría una separación RAM-disco, sino que la memoria persistente es al mismo tiempo memoria RAM y espacio de almacenamiento. En una arquitectura así, los caches del kernel son redundantes.

Linux ha tenido cierto soporte para este tipo de sistemas desde 2.6.13. Pero el código no estaba siendo mantenido y sólo soportaba ext2. En esta versión, Linux añade una nueva implementación llamada DAX. DAX elimina la copia extra de los caches haciendo que las lecturas y escrituras se hagan directamente almacenamiento de memoria persistente. En esta versión se añade soporte para ext4.


· kasan, detector de errores de gestión de memoria en el código

Kernel Address sanitizer (KASan) es un detector de errores que detecta bugs use-after-free y out-of-bounds bugs. Linux ya tiene kmemcheck, pero a diferencia de kmemcheck, KASan utiliza instrumentación en tiempo de compilado, lo cual lo hace significativamente más rápido que kmemcheck.

La idea principal de KASan es almacenar información sobre la seguridad de acceder cada byte de memoria o no, y usar la instrumentación del compilador para comprobar esa información en cada acceso de memoria. KASan utiliza 1/8 de la memoria direccionable por el kernel para mantener esta información. 


· lazytime para una actualización de los tiempos de un archivo más eficiente

Los sistemas Unix mantienen información variada sobre los archivos, tal y como la última vez que un archivo fue accedido o modificado. Mantener esta información es costoso, especialmente la información sobre cuándo fue accedido un archivo por última vez ("atime"), que animó a mucha gente durante mucho tiempo a desactivar la actualización de ese campo con la opción "noatime". Para aliviar este problema se añadió la opción "relatime", que sólo modificaba el campo atime si el archivo había sido modificado hace más de 24 horas. Este comportamiento, sin embargo, provoca errores en ciertos programas que requieren una actualización precisa de atime, y además va en contra del estándar POSIX.

En esta versión, Linux añade otra alternativa, "lazytime". Lazytime hace que los tiempos de acceso, modificación y cambio se hagan sólo al cache. Los tiempos serán sólo escritos al disco si el inodo es actualizado por otra razón, o si se utilizan llamadas al sistema como fsync(), syncfs() o sync(), o antes de que el caché del inodo vaya a eliminarse de la memoria. Esta manera de funcionar está de acuerdo con POSIX, hace funcionar a los programas que rompía "relatime", y, además, mejora el rendimiento.


· Múltiples capas inferiores en overlayfs

En overlayfs, ahora es posible especificar múltiples capas inferiores. Para hacerlo, se puede utilizar los dos puntos (":") como separador entre los diferentes directorios. Por ejemplo:

     mount -t overlay overlay -olowerdir=/lower1:/lower2:/lower3 /merged

Los directorios inferiores especificados se apilarán uno encima del otro desde el de la derecha al de la izquierda. En el ejemplo anterior lower1 estará arriba del todo, lower2 en el medio y lower3 abajo. "upperdir" y "workdir" pueden omitirse, aunque en ese caso el overlay será de sólo lectura.


· Soporte de servidor de Parallel NFS, NFS v4.2 por defecto

Parallel NFS (pNFS) es parte del estándar NFS v4.1 que permite a los clientes acceder a dispositivos de almacenamiento directamente y en paralelo. La arquitectura pNFS elimina los problemas de escalabilidad y rendimiento asociados con los servidores NFS hoy. Esto se logra mediante la separación de datos y metadatos, y moviento los servidores de metadatos fuera de la ruta principal de acceso a los datos.

Esta versión añade soporte para tener un servidor pNFS en Linux, y se proporcionan drivers para el layout "block", junto con el soporte para utilizar ese layout en sistemas de archivo XFS. También se añade el layout "flexfiles".

Además, en esta versión la versión por defecto del servidor NFS será NFS v4.2.


· Mejoras de escalabilidad de dm-crypt

Esta versión incrementa significativamente el rendimiento y escalabilidad de CPU de dm-crypt, gracias a unos cambios que permiten un uso más efectivo de todas las CPUs. Los resultados de una serie de tests y benchmarks pueden encontrarse aquí.

Y eso es todo. La lista completa de cambios en inglés, aquí.