Rilascio del kernel Linux 6.2

Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.2. Tra i cambiamenti più notevoli: è consentita l'accettazione del codice sotto la licenza Copyleft-Next, l'implementazione di RAID5/6 in Btrfs è migliorata, continua l'integrazione del supporto per il linguaggio Rust, il sovraccarico della protezione contro gli attacchi Retbleed è ridotto, il è stata aggiunta la capacità di regolare il consumo di memoria durante il writeback, è stato aggiunto un meccanismo per il bilanciamento TCP PLB (Protective Load Balancing), è stato aggiunto un meccanismo ibrido di protezione del flusso di comandi (FineIBT), BPF ora ha la capacità di definire i propri oggetti e strutture dati , è inclusa l'utilità rv (Runtime Verification), il consumo energetico nell'implementazione dei blocchi RCU è stato ridotto.

La nuova versione include 16843 correzioni da 2178 sviluppatori, la dimensione della patch è di 62 MB (le modifiche hanno interessato 14108 file, sono state aggiunte 730195 righe di codice, 409485 righe sono state cancellate). Circa il 42% di tutte le modifiche introdotte nella versione 6.2 sono legate ai driver di dispositivo, circa il 16% delle modifiche sono legate all'aggiornamento del codice specifico delle architetture hardware, il 12% sono legate allo stack di rete, il 4% sono legate ai file system e il 3% sono legati ai sottosistemi interni del kernel.

Principali innovazioni nel kernel 6.2:

  • Servizi di memoria e di sistema
    • È consentito includere nel codice del kernel e le modifiche fornite dalla licenza Copyleft-Next 0.3.1. La licenza Copyleft-Next è stata creata da uno degli autori della GPLv3 ed è pienamente compatibile con la licenza GPLv2, come confermato dagli avvocati di SUSE e Red Hat. Rispetto alla GPLv2, la licenza Copyleft-Next è molto più compatta e più semplice da comprendere (la parte introduttiva e la menzione delle compromissioni obsolete sono state rimosse), definisce il periodo di tempo e la procedura per eliminare le violazioni e rimuove automaticamente i requisiti di copyleft per il software obsoleto che ha più di 15 anni.

      Copyleft-Next contiene anche una clausola di concessione della tecnologia proprietaria che, a differenza della GPLv2, rende questa licenza compatibile con la licenza Apache 2.0. Per garantire la piena compatibilità con GPLv2, Copyleft-Next afferma esplicitamente che un'opera derivata può essere fornita sotto la licenza GPL in aggiunta alla licenza Copyleft-Next originale.

    • La struttura include l'utility “rv”, che fornisce un'interfaccia per l'interazione dallo spazio utente con i gestori del sottosistema RV (Runtime Verification), progettato per verificare il corretto funzionamento su sistemi altamente affidabili che garantiscono l'assenza di guasti. La verifica viene eseguita in fase di esecuzione collegando gestori a punti di traccia che controllano l'effettivo progresso dell'esecuzione rispetto a un modello deterministico di riferimento predeterminato della macchina che definisce il comportamento previsto del sistema.
    • Il dispositivo zRAM, che consente di archiviare in memoria la partizione di swap in forma compressa (viene creato in memoria un dispositivo a blocchi su cui viene eseguito lo swap con compressione), implementa la capacità di reimballare le pagine utilizzando un algoritmo alternativo per raggiungere un livello superiore di compressione. L'idea principale è quella di fornire una scelta tra diversi algoritmi (lzo, lzo-rle, lz4, lz4hc, zstd), offrendo i propri compromessi tra velocità di compressione/decompressione e livello di compressione, o ottimali in situazioni speciali (ad esempio, per comprimere grandi dimensioni pagine di memoria).
    • Aggiunta l'API "iommufd" per la gestione del sistema di gestione della memoria I/O - IOMMU (I/O Memory-Management Unit) dallo spazio utente. La nuova API rende possibile gestire le tabelle delle pagine di memoria I/O utilizzando descrittori di file.
    • BPF offre la possibilità di creare tipi, definire i propri oggetti, costruire la propria gerarchia di oggetti e creare in modo flessibile le proprie strutture dati, come elenchi collegati. Per i programmi BPF che entrano in modalità sospensione (BPF_F_SLEEPABLE), è stato aggiunto il supporto per i blocchi bpf_rcu_read_{,un}lock(). Supporto implementato per il salvataggio di oggetti task_struct. Aggiunto il tipo di mappa BPF_MAP_TYPE_CGRP_STORAGE, che fornisce spazio di archiviazione locale per i cgroup.
    • Per il meccanismo di blocco RCU (Read-Copy-Update), è implementato un meccanismo opzionale di chiamate di callback "pigre", in cui più chiamate di callback vengono elaborate contemporaneamente utilizzando un timer in modalità batch. L'applicazione dell'ottimizzazione proposta ci consente di ridurre il consumo energetico sui dispositivi Android e ChromeOS del 5-10% posticipando le richieste RCU durante i tempi di inattività o di basso carico sul sistema.
    • Aggiunto sysctl split_lock_mitigate per controllare come il sistema reagisce quando rileva blocchi suddivisi che si verificano quando si accede a dati non allineati in memoria a causa dei dati che attraversano due linee di cache della CPU durante l'esecuzione di un'istruzione atomica. Tali blocchi portano ad un significativo calo delle prestazioni. L'impostazione di split_lock_mitigate su 0 emette solo un avviso che indica la presenza di un problema, mentre l'impostazione di split_lock_mitigate su 1 provoca anche il rallentamento del processo che ha causato il blocco per preservare le prestazioni per il resto del sistema.
    • Per l'architettura PowerPC è stata proposta una nuova implementazione di qspinlock, che dimostra prestazioni più elevate e risolve alcuni problemi di blocco che si presentano in casi eccezionali.
    • Il codice di gestione degli interrupt MSI (Message-Signaled Interrupts) è stato rielaborato, eliminando i problemi di architettura accumulati e aggiungendo il supporto per associare singoli gestori a diversi dispositivi.
    • Per i sistemi basati sull'architettura del set di istruzioni LoongArch utilizzata nei processori Loongson 3 5000 e che implementano il nuovo RISC ISA, simile a MIPS e RISC-V, viene implementato il supporto per ftrace, protezione dello stack, modalità sleep e standby.
    • È stata fornita la possibilità di assegnare nomi ad aree di memoria anonima condivisa (in precedenza i nomi potevano essere assegnati solo a memoria anonima privata assegnata ad un processo specifico).
    • Aggiunto un nuovo parametro della riga di comando del kernel "trace_trigger", progettato per attivare un trigger di traccia utilizzato per associare i comandi condizionali chiamati quando viene attivato un controllo di controllo (ad esempio, trace_trigger=”sched_switch.stacktrace if prev_state == 2″).
    • I requisiti per la versione del pacchetto binutils sono stati aumentati. La compilazione del kernel ora richiede almeno binutils 2.25.
    • Quando si chiama exec(), è stata aggiunta la possibilità di posizionare un processo in uno spazio dei nomi temporale, in cui l'ora è diversa dall'ora del sistema.
    • Abbiamo iniziato a trasferire funzionalità aggiuntive dal ramo Rust-for-Linux relative all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel. Il supporto Rust è disabilitato per impostazione predefinita e non comporta l'inclusione di Rust come dipendenza richiesta per la compilazione del kernel. Le funzionalità di base offerte nell'ultima versione sono state ampliate per supportare codice di basso livello, come il tipo Vec e le macro pr_debug!(), pr_cont!() e pr_alert!(), nonché la macro procedurale “#[vtable ]", che semplifica il lavoro con le tabelle dei puntatori sulle funzioni. Nelle versioni future è prevista l'aggiunta di collegamenti Rust di alto livello sui sottosistemi del kernel, che consentiranno la creazione di driver completi in Rust.
    • Il tipo "char" utilizzato nel kernel è ora dichiarato unsigned per impostazione predefinita per tutte le architetture.
    • Il meccanismo di allocazione della memoria Slab - SLOB (slab allocator), progettato per sistemi con una piccola quantità di memoria, è stato dichiarato obsoleto. Al posto di SLOB, in condizioni normali si consiglia di utilizzare SLUB o SLAB. Per i sistemi con una piccola quantità di memoria, si consiglia di utilizzare SLUB in modalità SLUB_TINY.
  • Sottosistema disco, I/O e file system
    • Sono stati apportati miglioramenti a Btrfs volti a risolvere il problema del “writehole” nelle implementazioni RAID 5/6 (un tentativo di ripristinare un RAID se si verifica un crash durante la scrittura ed è impossibile capire su quale blocco su quale dispositivo RAID è stato scritto correttamente, che può portare alla distruzione dei blocchi, corrispondenti ai blocchi sottoscritti). Inoltre, gli SSD ora abilitano automaticamente l'operazione di eliminazione asincrona per impostazione predefinita, quando possibile, consentendo prestazioni migliorate grazie al raggruppamento efficiente delle operazioni di eliminazione in code e all'elaborazione della coda da parte di un processore in background. Migliorate le prestazioni delle operazioni send e lseek, nonché dell'ioctl FIEMAP.
    • Sono state ampliate le funzionalità di gestione della scrittura differita (writeback, salvataggio in background dei dati modificati) per i dispositivi a blocchi. In alcune situazioni, ad esempio quando si utilizzano dispositivi a blocchi di rete o unità USB, le scritture lente possono comportare un elevato consumo di RAM. Per controllare il comportamento delle scritture lente e mantenere la dimensione della cache della pagina entro certi limiti, sono stati introdotti in sysfs (/sys/class/bdi/) i nuovi parametri strict_limit, min_bytes, max_bytes, min_ratio_fine e max_ratio_fine.
    • Il file system F2FS implementa un'operazione di sostituzione atomica ioctl, che consente di scrivere dati su un file all'interno di una singola operazione atomica. F2FS aggiunge anche una cache di estensione dei blocchi per aiutare a identificare i dati utilizzati attivamente o i dati a cui non si accede da molto tempo.
    • Nell'ext4 FS vengono annotate solo le correzioni degli errori.
    • Il file system ntfs3 offre diverse nuove opzioni di montaggio: “nocase” per controllare la distinzione tra maiuscole e minuscole nei nomi di file e directory; nome_finestre per vietare la creazione di nomi di file contenenti caratteri non validi per Windows; hide_dot_files per controllare l'assegnazione dell'etichetta del file nascosto per i file che iniziano con un punto.
    • Il file system Squashfs implementa un'opzione di montaggio “threads=", che consente di definire il numero di thread per parallelizzare le operazioni di decompressione. Squashfs ha anche introdotto la possibilità di mappare gli ID utente dei file system montati, utilizzati per abbinare i file di un utente specifico su una partizione esterna montata con un altro utente sul sistema corrente.
    • L'implementazione degli elenchi di controllo degli accessi POSIX (POSIX ACL) è stata rielaborata. La nuova implementazione elimina i problemi di architettura, semplifica la manutenzione della base di codice e introduce tipi di dati più sicuri.
    • Il sottosistema fscrypt, utilizzato per la crittografia trasparente di file e directory, ha aggiunto il supporto per l'algoritmo di crittografia SM4 (standard cinese GB/T 32907-2016).
    • È stata fornita la possibilità di creare il kernel senza il supporto NFSv2 (in futuro si prevede di smettere completamente di supportare NFSv2).
    • L'organizzazione del controllo dei diritti di accesso ai dispositivi NVMe è stata modificata. Fornisce la possibilità di leggere e scrivere su un dispositivo NVMe se il processo di scrittura ha accesso al file dedicato del dispositivo (in precedenza il processo doveva avere l'autorizzazione CAP_SYS_ADMIN).
    • Rimosso il driver del pacchetto CD/DVD, deprecato nel 2016.
  • Virtualizzazione e sicurezza
    • Un nuovo metodo di protezione contro la vulnerabilità Retbleed è stato implementato nelle CPU Intel e AMD, utilizzando il tracciamento della profondità delle chiamate, che non rallenta il lavoro tanto quanto la protezione contro Retbleed precedentemente presente. Per abilitare la nuova modalità è stato proposto il parametro della riga di comando del kernel “retbleed=stuff”.
    • Aggiunto un meccanismo ibrido di protezione del flusso di istruzioni FineIBT, che combina l'uso delle istruzioni hardware Intel IBT (Indirect Branch Tracking) e della protezione software kCFI (kernel Control Flow Integrity) per bloccare la violazione del normale ordine di esecuzione (flusso di controllo) come risultato dell'uso di exploit che modificano i puntatori archiviati in memoria sulle funzioni. FineIBT consente l'esecuzione tramite salto indiretto solo nel caso di salto all'istruzione ENDBR, che si trova proprio all'inizio della funzione. Inoltre, per analogia con il meccanismo kCFI, gli hash vengono poi controllati per garantire l'immutabilità dei puntatori.
    • Aggiunte restrizioni per bloccare gli attacchi che manipolano la generazione di stati "oops", dopo i quali le attività problematiche vengono completate e lo stato viene ripristinato senza arrestare il sistema. Con un numero molto elevato di chiamate allo stato "oops" si verifica un overflow del contatore dei riferimenti (refcount), che consente lo sfruttamento delle vulnerabilità causate dai dereferenziamenti del puntatore NULL. Per proteggersi da tali attacchi, è stato aggiunto al kernel un limite al numero massimo di trigger “oops”, superato il quale il kernel avvierà una transizione allo stato “panic” seguito da un riavvio, che non consentirà di raggiungere lo stato numero di iterazioni necessarie per superare il refcount. Per impostazione predefinita, il limite è impostato su 10mila "oops", ma se lo si desidera può essere modificato tramite il parametro oops_limit.
    • Aggiunti i parametri di configurazione LEGACY_TIOCSTI e sysctl legacy_tiocsti per disabilitare la possibilità di inserire dati nel terminale utilizzando ioctl TIOCSTI, poiché questa funzionalità può essere utilizzata per sostituire caratteri arbitrari nel buffer di input del terminale e simulare l'input dell'utente.
    • Viene proposto un nuovo tipo di struttura interna, encoded_page, in cui i bit inferiori del puntatore vengono utilizzati per memorizzare informazioni aggiuntive utilizzate per proteggere dalla dereferenziazione accidentale del puntatore (se la dereferenziazione è effettivamente necessaria, questi bit aggiuntivi devono essere prima cancellati) .
    • Sulla piattaforma ARM64, in fase di boot, è possibile abilitare o disabilitare l'implementazione software del meccanismo Shadow Stack, che serve a proteggere dalla sovrascrittura dell'indirizzo di ritorno da una funzione in caso di buffer overflow sullo stack ( l'essenza della protezione è salvare l'indirizzo di ritorno in uno stack "ombra" separato dopo che il controllo è stato trasferito alla funzione e recuperare l'indirizzo fornito prima di uscire dalla funzione). Il supporto per le implementazioni hardware e software di Shadow Stack in un assembly del kernel consente di utilizzare un kernel su diversi sistemi ARM, indipendentemente dal supporto per le istruzioni per l'autenticazione del puntatore. L'inserimento di un'implementazione software avviene mediante la sostituzione delle istruzioni necessarie nel codice durante il caricamento.
    • Aggiunto il supporto per l'utilizzo del meccanismo di notifica di uscita asincrona sui processori Intel, che consente di rilevare attacchi in un unico passaggio al codice eseguito nelle enclavi SGX.
    • Viene proposto un insieme di operazioni che consentono all'hypervisor di supportare le richieste provenienti dai sistemi guest Intel TDX (Trusted Domain Extensions).
    • Le impostazioni di compilazione del kernel RANDOM_TRUST_BOOTLOADER e RANDOM_TRUST_CPU sono state rimosse, a favore delle corrispondenti opzioni della riga di comando random.trust_bootloader e random.trust_cpu.
    • Al meccanismo Landlock, che consente di limitare l'interazione di un gruppo di processi con l'ambiente esterno, è stato aggiunto il supporto per il flag LANDLOCK_ACCESS_FS_TRUNCATE, che consente di controllare l'esecuzione delle operazioni di troncamento dei file.
  • Sottosistema di rete
    • Per IPv6 è stato aggiunto il supporto al PLB (Protective Load Balancing), un meccanismo di bilanciamento del carico tra i collegamenti di rete volto a ridurre i punti di sovraccarico sugli switch dei data center. Modificando l'etichetta del flusso IPv6, il PLB modifica casualmente i percorsi dei pacchetti per bilanciare il carico sulle porte dello switch. Per ridurre il riordino dei pacchetti, questa operazione viene eseguita dopo periodi di inattività, quando possibile. L'utilizzo del PLB nei data center di Google ha ridotto lo squilibrio di carico sulle porte dello switch in media del 60%, la perdita di pacchetti del 33% e la latenza del 20%.
    • Aggiunto driver per dispositivi MediaTek che supportano Wi-Fi 7 (802.11be).
    • Aggiunto supporto per collegamenti da 800 gigabit.
    • Aggiunta la possibilità di rinominare le interfacce di rete al volo, senza interrompere il lavoro.
    • Nei messaggi di registro relativi al SYN Flood è stata aggiunta una menzione dell'indirizzo IP al quale è arrivato il pacchetto.
    • Per UDP è stata implementata la possibilità di utilizzare tabelle hash separate per diversi spazi dei nomi di rete.
    • Per i bridge di rete è stato implementato il supporto al metodo di autenticazione MAB (MAC Authentication Bypass).
    • Per il protocollo CAN (CAN_RAW), è stato implementato il supporto per la modalità socket SO_MARK per collegare filtri di traffico basati su fwmark.
    • ipset implementa un nuovo parametro bitmask che consente di impostare una maschera basata su bit arbitrari nell'indirizzo IP (ad esempio, "ipset create set1 hash:ip bitmask 255.128.255.0").
    • Aggiunto il supporto per l'elaborazione delle intestazioni interne all'interno dei pacchetti tunnelizzati su nf_tables.
  • Attrezzatura
    • È stato aggiunto il sottosistema “accel” con l'implementazione di un framework per acceleratori computazionali, che può essere fornito sia sotto forma di singoli ASIC sia sotto forma di blocchi IP all'interno di SoC e GPU. Questi acceleratori hanno principalmente lo scopo di accelerare la soluzione dei problemi di machine learning.
    • Il driver amdgpu include il supporto per i componenti GC, PSP, SMU e NBIO IP. Per i sistemi ARM64 è implementato il supporto per DCN (Display Core Next). L'implementazione dell'output dello schermo protetto è stata spostata dall'utilizzo di DCN10 a DCN21 e ora può essere utilizzata quando si collegano più schermi.
    • Il driver i915 (Intel) ha stabilizzato il supporto per le schede video discrete Intel Arc (DG2/Alchemist).
    • Il driver Nouveau supporta le GPU NVIDIA GA102 (RTX 30) basate sull'architettura Ampere. Per le schede nva3 (GT215) è stata aggiunta la possibilità di controllare la retroilluminazione.
    • Aggiunto supporto per adattatori wireless basati su chip Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) e MediaTek MT7996, interfacce Bluetooth Broadcom BCM4377/4378/4387, nonché Motorcomm yt8521, controller Ethernet NVIDIA Tegra GE.
    • Aggiunto supporto ASoC (ALSA System on Chip) per chip audio integrati HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Aggiunto supporto per l'interfaccia audio Focusrite Saffire Pro 40. Aggiunto il codec audio Realtek RT1318.
    • Aggiunto supporto per smartphone e tablet Sony (Xperia 10 IV, 5 IV, X e X compact, OnePlus One, 3, 3T e Nord N100, Xiaomi Poco F1 e Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
    • Aggiunto supporto per SoC ARM e Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695) schede madri, SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.

Allo stesso tempo, la Latin American Free Software Foundation ha formato una versione del kernel 6.2 completamente libera - Linux-libre 6.2-gnu, priva di elementi di firmware e driver contenenti componenti proprietari o sezioni di codice, la cui portata è limitata da il produttore. La nuova versione ripulisce i nuovi blob nel driver nouveau. Il caricamento dei BLOB è disabilitato nei driver mt7622, ​​mt7996 wifi e bcm4377 bluetooth. Nomi BLOB ripuliti nei file dts per l'architettura Aarch64. Codice di pulizia blob aggiornato in vari driver e sottosistemi. Interrotta la pulizia del driver s5k4ecgx, poiché è stato rimosso dal kernel.

Fonte: opennet.ru

Aggiungi un commento