15 de febrero de 2015

Los frutos de la modularidad en KDE 5

El desarrollo de KDE 5 está siendo bastante caótico de cara al público, mucha gente no sabe bien que se está haciendo. Por eso el anuncio de hoy, publicando KDE Frameworks 5.7.0, no dirá mucho a la gente, ni sabrán si esa publicación acerca, o no, a la publicación de un "KDE 5.0". No les culpo, KDE no ha sabido explicar bien sus intenciones, y yo no tengo intención de hacerlo hoy. Pero merece la pena hablar de KDE Frameworks 5, y de los buenos resultados que está teniendo.

La intención de KDE Frameworks 5 es hacer honor a su nombre en el sentido más amplio de la palabra: uno de los principales objetivos ha sido que los usuarios de Qt puedan usar partes de las librerías básicas de KDE, sin tener que usar KDE. Para ello, KDE Frameworks 5 ha dividido la gran masa de código "kdelibs" en 60 pequeñas librerías que ofrecen diferentes funcionalidades, desde KArchive para gestionar archivos comprimidos, KI18n para la internacionalización, KConfig para la gestión de archivos de configuración, o Kemoticons para mostrar emoticonos en lugar de ";)".

Las dependencias que estas librerías tienen entre sí mismas se distinguen con diferentes "tier". Las que no dependen sólo de Qt forman el "Tier 1", el "Tier 2" lo forman las librerías que dependen del "Tier 1", y el "Tier 3" las librerías con dependencias de las anteriores dos. Las dependencias de librerías y funcionalidades externas, no relacionadas con KDE Frameworks, se gestionan dividiendo las librerías en las que no requieren dependencias ("funcional"), las que requieren alguna para la integración en el sistema ("integration"), o las que tienen otras dependencias variadas ("solution").

La consecuencia de esta modularización masiva es que KDE Frameworks pasa a ser, en buena medida, una extensión de funcionalidad para Qt, un verdadero framework que pasa a ser desarrollado independientemente de Plasma y las aplicaciones finales de KDE, y que permite crear aplicaciones Qt que utilicen librerías de KDE Frameworks sin tener que forzar a los usuarios a instalar medio KDE.

Como KDE Frameworks pasa a ser un proyecto complementario de Qt, no debería sorprender que algunas de las librerías de KDE Frameworks hayan sido movidas a Qt: QMimeType proviene de KMimeType, QTemporaryDir de KTempDir, QStandardPaths de KStandardDirs. También se han mejorado otras clases ya existentes, y cuando es posible y recomendable los programadores de KDE intentan mejorar cosas de QT, en lugar de reimplementar cosas por su cuenta.

El broche final como ejemplo de los beneficios de toda esta modularización se puede comprobar con la publicación de LXQt 0.9, un escritorio ligero basado en Qt, fusión de LXDE y razor-qt. En esa versión anunciaron que empezarían a usar un componente de KDE Frameworks, KWindowSystem, para gestionar la interacción con el sistema de ventanas. Reutilizarán un código mejor probado y mantenido por otros, y no sólo se libran de tener la implementación de la misma funcionalidad que hacían por su cuenta, sino que todos los esfuerzos que están haciendo en KDE para que KWindowSystem funcione con Wayland redundarán en su beneficio.

Resumiendo, la modularización de KDE Frameworks 5 supone un gran paso para KDE y el ecosistema Qt. Y aunque no haya un "KDE 5.0", se puede comprobar que el proyecto sigue trabajando mucho y muy bien.

12 de febrero de 2015

Las novedades de Linux 3.19

Ya se ha anunciado la versión 3.19 de Linux. Esta versión añade soporte en Btrfs para sustitución rápida de dispositivos y scrubbing en RAID 5 y 6, soporte para las extensiones de protección de memoria de Intel, que ayudan a parar la explotación de desbordamientos de búfer, soporte para la arquitectura AMD HSA, soporte para el sistema de depuración ARM Coresight, soporte para la arquitectura Altera Nios II, soporte para la descarga de las funciones de switchs y routers en chips de hardware, soporte para la preasignación y el borrado de partes de archivos, y el sistema IPC de Android, binder, sale de "staging" y se considera estable. 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.

· Btrfs: Soporte de scrubbing y sustitución rápida de dispositivos con RAID5&6

Btrfs añadió soporte para la sustitución rápida de discos en Linux 3.8, un método para reemplazar un disco por otro más rápido, en un sólo comando (ver btrfs-replace(8)), que hacerlo añadiendo y eliminando manualmente los discos por separado (ver btrfs-device(8)). Esta característica no podía utilizarse en sistemas de archivos que estuviesen utilizando RAID 5 ó 6. En esta versión se ha eliminado esa limitación.


El proceso de hacer scrubbing a un sistema de archivos Btrfs (ver btrfs-scrub(8)) tampoco era posible en sistemas de archivo que usasen RAID 5 ó 6; esta limitación también se ha eliminado.

· Soporte para las extensiones de Protección de Memoria de Intel

Las extensiones MPX de Intel (Memory Protection Extension) son un conjunto de instrucciones de CPU que ayudan a proporcionar fiabilidad al software evitando que las referencias de punteros puedan ser usurpadas maliciosamente por desbordamientos de búfer. Intel MPX introduce nuevos registros y nuevas instrucciones que operan en esos registros. Con compiladores, librerías y kernels modificados, es posible hacer uso de esas instrucciones para que el hardware MPX prevenga la explotación de desbordamientos de búfer. Esta versión de Linux añade soporte para Intel MPX en el kernel. Nota: las CPUs con soporte de MPX aun no están en el mercado y serán introducidas en las microarquitecturas Intel Skylake y Goldmont.

Artículo LWN recomendado: Supporting Intel MPX in Linux.
Artículo de Intel recomendado: Introduction to Intel Memory Protection Extensions


· Controlador HSA para GPUs AMD

HSA ("Heterogeneous System Architecture") es una arquitectura que integra CPUs y GPUs en el mismo bus. HSA permite que varios tipos de procesador (CPUs, DSPs, GPUs, etc) compartan recursos del sistema con mayor efectividad mediante características del hardware como memoria compartida y paginable, colas de trabajos accesibles desde espacio de usuario, etc.

Esta versión incluye soporte de HSA para la familia de procesadores Radeon, y ofrece una API que es utiliza por una librería de software libre desarrollada por AMD, Para más detalles sobre HSA y sobre las posibilidades que HSA ofrece a las aplicaciones de espacio de usuario, ver el anterior enlace.

· Android binder movido a "stable"

El código del "binder" de Android (un IPC específico para Android) ha estado durante años en el área "staging" del kernel, destinado a código que aun no está preparado para ser utilizado por el público. El código en cuestión, sin embargo, es estable ha sido distribuido en todos los millones de teléfonos Android que se han vendido en todos estos años. Hay reticencias sobre binder, pero no importa lo que pase, Linux va a tener que soportar esta API de todos modos, lo cual ha motivado que pase a estar considerado como código estable.

· Soporte de ARM Coresight

Coresight es un paraguas de tecnologías que permiten la depuración en SoCs ARM. ARM ha desarrollado una solución de trazado de software asistido por hardware, compuesta de diferentes partes, cada una de las cuales está destinada a una necesidad de trazado específica.

El framework Coresight de Linux proporciona una interfaz para los drivers que soportan las diferentes partes de Coresight. Ofrece una vista topológica de los componentes de Coresight y configura los diferentes componentes cuando se activa una fuente de trazado.  Para más detalles sobre el framework ver Documentation/trace/coresight.txt  , para más detalles sobre ARM Coresight ver http://www.arm.com/products/system-ip/debug-trace/

· Nueva arquitectura: Procesadores Altera Nios II

Esta versión añade soporte para los procesadores Altera Nios II. Nios II es una arquitectura de procesadores embebidos de 32 bits, diseñados específicamente para la familia de FPGAs Altera. El procesador Nios II ofrece varias mejoras sobre la arquitectura original Nios, haciéndolo ideal para un amplio rango de aplicaciones embebidas, desde DSPs a sistemas de control. Para más información sobre los procesadores Nios II, ver http://www.altera.com/literature/lit-nio2.jsp

· Device Tree Overlays

El "Device Tree" es una estructura de datos para describir el hardware, esta estructura de datos se pasa al kernel al arrancar, una solución más flexible que tener que incluir cada detalle de los dispositivos en el sistema operativo. Se usa sobre todo en arquitecturas como PowerPC y ARM. El Device Tree está diseñado para sistemas estáticos, y tiene problemas para extenderse a buses de expansión como los que se encuentran en sistemas de consumo como el BeagleBone o Raspberry Pi.

Esta versión introduce soporte para overlays ("superposiciones") en el Device Tree. Los overlays son un método para modificar dinámicamente partes del Device Tree y hacer cambios. Esto hace más sencillo soportar sistemas como los anteriormente citados. Para más información, leer: Device tree overlays.

· Redes: Soporte para descargar el procesado de routers y switchs

Esta versión incluye una infraestructura para soportar chips de switchs y otras operaciones de red. De ese modo, el procesado de esas funciones puede hacerse en el hardware, y así evitar tener que hacerlo en software.

También se incluye el primer driver que utiliza esta infraestructura, un driver "rocker" para el chip de switch emulado en qemu.

· Soporte de preasignación y "hole punching" en NFSv4.2

Esta versión añade soporte para la preasignación de archivos y "hole punching" (eliminación de porciones grandes de un archivo) en NFSv4.2


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

18 de diciembre de 2014

Las novedades de Linux 3.18

Ya se ha anunciado la versión 3.18 de Linux. Esta versión añade soporte para overlayfs, que permite combinar dos sistemas de archivos en un sólo punto de montaje, se añade soporte para mapear memoria de espacio de usuario en la memoria de vídeo en los drivers Radeon, se añade una llamada de sistema bpf() que permite la ejecución de programas en bytecode al estilo de BPF; se añade también un algoritmo de congestión de tráfico TCP optimizado para centros de datos, un protocolo de encapsulado optimizado para virtualización, soporte para incrustar protocolos IP en paquetes UDP, y soporte de la capa de bloques multi-cola en la implementación SCSI. 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.


· Overlayfs
El sistema de archivos overlayfs permite combinar dos sistemas de archivos, uno "superior" y otro "inferior", en un sólo punto de montaje. Las modificaciones a ese sistema de archivos mezclado se hacen en el sistema de archivos superior. Este sistema tiene muchos usos, pero es conocido sobre todo por ser utilizado en los live-CD, en los que se monta una imagen del sistema operativo como sistema de archivos inferior, y un sistema de archivos en RAM, en el que se hacen las modificaciones, como superior; de ese modo se puede utilizar el live-CD como un sistema real. Overlayfs se diferencia de otros mecanismos de unión de sistemas de archivos en que tras abrirse un archivo todas las operaciones van a los sistemas de archivos inferiores o superiores, lo cual simplifica la implementación y permite tener rendimiento nativo.

Es posible que ambos arboles de directorio estén en el mismo sistema de archivos. El sistema de archivos inferior puede ser cualquier sistema de archivos soportado por Linux y no necesita permisos de escritura. El sistema de archivos inferior puede ser otro overlayfs. El sistema superior será normalmente escribible y si lo es debe permitir la creación de atributos extendidos trusted.*, y debe retornar un d_type válido en readdir(), de modo que NFS no está permitido.

· Radeon: mapeado de espacio de usuario en la memoria de vídeo
Linux 3.16 añadió la posibilidad de mapear direcciones de espacio de usuario en la memoria de vídeo para chips Intel. En esta versión, también se ha incorporado en el driver Radeon soporte de esta característica, que permite utilizar datos de la aplicación como fuente para texturas o incluso como destinación de un proceso de renderizado (dependiendo de las capacidades del chipset). Esto tiene usos útiles, tales como descargas de memoria a la GPU sin copias y mejoras de rendimiento en varios casos. Esta capacidad tiene consecuencias extensas, desde renderizado por software más veloz (chromium) o mitigación de pausas en ciertos casos en firefox.

· Llamada al sistema bpf() para programas de máquina virtual eBPF

La llamada al sistema bpf() es un multiplexador para una serie de operaciones en eBPF que pueden ser descritas como "máquina virtual universal en el kernel". eBPF es similar al Berkeley Packet Filter que se usa para filtrar paquetes de red. eBPF "extiende" el BPF clásico de múltiples maneras incluyendo la capacidad de hacer llamadas a funciones de ayuda en el kernel y acceso a estructuras de datos compartidas. Los programas pueden ser escritos en un C restringido que se compila a bytecode eBPF y se ejecuta en la máquina virtual eBPF o se convierte en instrucciones nativas con un JIT.

Los programas eBPF son similares a módulos de kernel. Los carga un proceso de usuario y se descargan automáticamente cuando el proceso sale. Cada programa eBPF es un conjunto de instrucciones seguro. El verificador eBPF determina estáticamente que el programa termina y es seguro de ejecutar. Los programas pueden estar conectados a diferentes eventos. Estos eventos pueden ser paquetes o eventos de trazado. Más allá de almacenar datos los programas pueden llamar a funciones de ayuda del kernel que podrían, por ejemplo, volcar la pila, invocar trace_printk u otras ayudas para la depuración del kernel.

· TCP: algoritmo de congestión Data Center TCP
Esta versión añade el algoritmo de control de congestión Data Center TCP (DCTCP). Se trata de un algoritmo diseñado para optimizar el rendimiento de las redes de centros de datos, centrándose en proporcionar: alta resistencia a las ráfagas de tráfico alto, baja latencia y alto rendimiento.

· Geneve: Protocolo de encapsulación para virtualización
El advenimiento de las redes virtualizadas ha provocado un aumento del interés y de la creación de nuevos protocolos. Los protocolos de túneles existentes han intentado resolver diferentes aspectos de los nuevos requerimientos de las redes virtualizadas, pero pronto quedaban desfasados. Linux 3.18 añade Geneve, un protocolo que intenta evitar esos problemas proporcionando un protocolo para túneles que proporciona redes de nivel 2 sobre redes de nivel 3.

· Mejora del rendimiento de red: agrupación del procesamiento de la cola de envío
Esta versión añade soporte para retrasar el procesado de SKBs (buffers de sockets). Procesar la cola de envíos del driver de la tarjeta de red es costoso, de modo que es posible compartir ese coste acumulando varios búfers y procesándolos al mismo tiempo. Varios drivers han incorporado esta característica: i40e, igb, ixgbe, mlx4, virtio_net, se añadirán más en futuras versiones.

· Soporte para foo-sobre-UDP
Esta versión añade soporte para encapsular cualquier protocolo IP sobre UDP incluyendo túneles (IPIP, GRE, SIT).

La motivación para esta funcionalidad es que el hardware y software de red existente están optimizados para UDP y pueden utilizarse para proporcionar un mejor servicio. En esta versión se ha añadido soporte para usar foo-sobre-UDP en GRE, IPIP, y SIT. Se ha añadido un nuevo comando "ip fou" en las nuevas versiones de ip para usar esta característica.

· Soporte de SCSI multicola opcional
Linux 3.13 añadió un nuevo diseño para la capa de bloques que permitía procesar múltiples colas IOs en paralelo. Esta característica, sin embargo, no era transparente y requería adaptación de los drivers. En esta versión, se ha añadido soporte para esta capa multi-cola en la capa SCSI (usada por los drives ATA y SATA) como una opción

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