Linux kernel 6.12 i les seves novetats

El passat dia 17 de novembre es va llançar la nova versió 6.12 del kernel de Linux, amb alguns canvis importants. En aquest post explorarem quines millores s’hi han introduït i perquè ha donat peu a cert remombori dins la comunitat.

A més, serà el primer post d’una sèrie on explicaré les característiques de cada llançament del kernel de Linux.

Aquesta és probablement és la característica més popular de la nova versió del kernel: l’adició del patchset PREEMPT_RT. Però abans d’explicar-ho més a fons primer cal conèixer un parell de conceptes:

  • Preemció

    La preemció és el mecanisme pel qual el sistema operatiu pot aturar una tasca en execució i executar-ne una altra més prioritària.

  • Sistema operatiu en temps real (RTOS)

    Un sistema operatiu en temps real és un sistema disenyat per garantir la predictibilitat i temps de resposta ràpids a events i interrupcions.

Entenent això, gràcies a PREEMPT_RT, pràcticament tot el codi del nucli pot ser preemtible, pel que tot és interrompible si apareix un procès amb més prioritat. A més, també s’implementa mecanismes per assegurar latències constants i flexibilitat en les interrupcions dels processos.

Per tot això podem dir que PREEMPT_RT converteix Linux en un sistema operatiu en temps real.

Per cert, PREEMPT_RT portava en desenvolupament uns 20 anys.

sched_ext és una característica del kernel que permet modificar les polítiques d’scheduling des de l’espai d’usuari, sense haver de reiniciar el sistema.

Això implica una gran capacitat de millorar el rendiment segons l’ús que es doni al sistema, ja que podrem optimitzar l’scheduler segons el propòsit que tenim en el moment (jugant a videojocs, veure videos,…).

VFS (Virtual File System) és una capa de software a Linux que fa d’interfície per interactuar amb els sistemes d’arxius. És a dir, al realitzar operacions sobre els sistemes d’arxius, tots utilitzen les mateixes perquè passen per aquesta capa d’abstracció.

Aquest “sistema d’arxius” ara suporta tenir una mida de bloc major que la mida de pàgina. Això comporta millores en rendiment, sobretot en arxius grans, ja que com més gran sigui el tamany de bloc, menys operacions d’E/S (entrada/sortida).

En aquesta versió del kernel només s’ha implementat amb el sistema d’arxius XFS.

A més, també s’ha reduit la mida de l’estructura de fitxers, pel que quan obrim un fitxer, serà una mica menys costós.

FUSE (Filesystem in Userspace) ara incorpora suport per ID-mapped mounts, és a dir, permet remapejar identificadors d’usuaris i de grups sense afectar al sistema d’arxius original.

Això és molt útil en sistemes multiusuari i virtualització, on interessa que els identificadors d’usuari variin entre el host i els guests.

El primer FUSE en rebre-ho és VirtIO-FS.

A NFS (Network File System) s’ha afegit suport per al protocol LOCALIO.

Aquest protocol detecta si el host i el client són a la mateixa màquina i, en cas que sigui així, es sobrepassa els protocols RPC i XDR, guanyant així molt de rendiment (fins a 10 cops més).

DRM (Direct Rendering Manager) incorporarà la funció de, quan el sistema pateix un kernel panic (DRM Panic “Screen of Death”) s’imprimirà per pantalla un codi QR amb els detalls del que ha passat.

Això és útil perquè aquest missatge sovint és difícil de llegir en la pantalla de kernel panic. Amb aquesta funció, l’administrador pot revisar fàcilment el que ha provocat aquest kernel panic.

En el tema xarxa s’ha realitzat una millora important, ja que s’ha donat suport per rebre paquets TCP directament a dispositius amb DMA. Per explicar-ho en paraules més “normals”, si a la teva tarjeta gràfica li arriba un paquet TCP, aquest paquet es separarà: el header anirà cap al bufer del kernel per ser processat i les dades (payload) aniran directament a la regió de memòria de la tarjeta gràfica.

El Vsock de VirtIO no posarà paquets a la cua quan la cua intermitja estigui buida, pel que millorarà el seu rendiment.

Relacionat amb màquines virtuals, Hyper-V ara suporta CPUs multinucli, permetent iniciar les màquines en paral·lel en comptes d’iniciar-se de manera seqüencial.

En aquesta versió del kernel s’ha integrat el mòdul IPE (Integrity Policy Enforcement) al sistema LSM (Linux Security Modules).

IPE és un mòdul enfocat en la seguretat, que restringeix quins binaris executar: només executa els que són immutables. LSM és una infraestrutura que permet integrar mòduls de seguretat al kernel de Linux.

A més, LSM utilitza crides estàtiques enlloc de crides indirectes.

  • Crides indirectes

    El codi utilitza un punter a funció que es definirà en temps d’execució. Això és potencialment vulerable i comporta certa latència.

  • Crides estàtiques

    En les crides estàtiques, se substitueix el punter a funció per la funció directament, millorant el rendiment i la seguretat respecte a les crides indirectes.

Aquest canvi ha estat degut principalment a la vulnerabilitat Spectre.

El robot de testos del kernel d’Intel va reportar una millora del rendiment del 3888,9% amb un canvi d’una sola línia. Aquest canvi fa que el contingut de les huge pages estigui alineat i, per tant, es puguin utilitzar de manera més eficaç.

Cal destacar que això ha estat detectat en un hardware específic orientat a servidors i en unes condicions de prova molt concretes, però de totes maneres, és un canvi molt notable per una sola línia de codi i m’ha semblat interessant de parlar-ne.

Quan un procès vol acedir a memòria, el kernel verifica si aquest espai és segur d’utilitzar (això implica que no pot ser un espai que no formi part del kernel ni sigui cap espai on el programa no hagi d’accedir). L’adress masking el que fa és “emmascarar adreces”: les filtra i en descarta les il·legals. A més, també s’han optimitzat les crides i s’ha reescrit el codi de la validació d’adreces per fer-la més segura i ràpida.

Aquestes millores protegeixen al sistema de la vulnerabilitat Spectre.

S’està completant la transició cap a l’scheduler EEVDF (Earliest Eligible Deadline First) i s’hi estan realitzant millores.

A més s’ha integrat el servidor SCHED_DEADLINE, que serveix per evitar que les tasques d’alta prioritat monopolitzin la CPU i deixin sense recursos les de baixa prioritat.

A més d’aquests canvis (i més que no he comentat), també s’ha eliminat mantenidors russos del kernel.

Tot i que no està clar el motiu oficial, el comentari de l’encarregat d’aquest patch va ser:

“Remove some entries due to various compliance requirements. They can come back in the future if sufficient documentation is provided.”

I fins aquí el post d’avui. Si t’ha semblat útil pots deixar un comentari i compartir-lo. Ens veiem al següent!