Rilascio del kernel Linux 6.9

Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 6.9. Tra le modifiche più significative: il modulo dm-vdo per la deduplicazione e la compressione dei dispositivi di blocco, la modalità di accesso diretto ai file in FUSE, il supporto per la creazione di pidfd per singoli thread, il meccanismo dei token BPF, il supporto per Rust su sistemi ARM64, il passaggio del filesystem Ext2 alla categoria obsoleta, la rimozione del vecchio driver NTFS, e il supporto per il meccanismo Intel FRED.

La nuova versione include 15680 correzioni da 2106 sviluppatori, con una dimensione del patch di 54 MB (le modifiche hanno interessato 11825 file, sono state aggiunte 687954 righe di codice e ne sono state rimosse 225344). Nella precedente versione erano presenti 15641 correzioni da 2018 sviluppatori, con una dimensione del patch di 44 MB. Circa il 42% di tutte le modifiche incluse nel 6.9 riguardano i driver dei dispositivi, circa il 17% delle modifiche riguarda l'aggiornamento del codice specifico per architetture hardware, il 13% è correlato allo stack di rete, il 7% ai filesystem e il 4% ai sottosistemi interni del kernel.

Le novità principali nel kernel 6.9:

  • Sottosistema disco, I/O e file system
    • Nel Device Mapper (DM) è stato aggiunto un nuovo gestore dm-vdo (virtual data optimizer), che consente di realizzare un dispositivo a blocchi virtuale basato su dispositivi a blocchi esistenti, con funzionalità come deduplicazione dei dati duplicati, compressione dei dati, esclusione dei blocchi vuoti e aumento delle dimensioni del dispositivo a blocchi man mano che si rende necessario (thin provisioning). Queste funzionalità vengono implementate a livello del dispositivo a blocchi e non dipendono dal file system utilizzato (ad esempio, con dm-vdo è possibile realizzare l'unione automatica di dati duplicati e memorizzare informazioni in forma compressa per qualsiasi FS). È supportato l'uso di dm-vdo per archiviazioni fisiche fino a 256TB e la creazione di volumi logici fino a 4PB. Per la gestione delle partizioni vdo, si consiglia di utilizzare lvm. La tecnologia VDO è stata sviluppata da Permabit ed è stata resa open source dopo la sua acquisizione da parte di Red Hat nel 2017.
    • Nel sottosistema FUSE, utilizzato per implementare i file system nello spazio utente, è stata aggiunta una prima implementazione della modalità "passthrough", che consente di ottenere direttamente a livello del kernel i dati dei file, bypassando il processo in esecuzione nello spazio utente. Ciò può significativamente migliorare le prestazioni in alcune situazioni. Ad esempio, le implementazioni FUSE dei file system che operano in modalità di sola lettura e limitano l'accesso ai file possono restituire il contenuto dei file dalla filesystem originale senza trasferirli al processo FUSE.
    • È stato deprecato il driver con implementazione del file system Ext2. La motivazione è il supporto solo di contatori di tempo a 32 bit nell'inode, che andranno in overflow il 19 gennaio 2038. Si consiglia di utilizzare il driver ext4, che supporta il funzionamento con il file system Ext2 ed è completamente compatibile, ma può utilizzare nei partizioni ext2 timestamp che non sono soggetti al problema del 2038, se il file system è stato creato con inode di dimensioni superiori a 255 byte (nel driver ext2, i contatori di tempo a 32 bit venivano utilizzati indipendentemente dalla dimensione dell'inode).
    • È stato rimosso il vecchio driver del file system NTFS, sostituito dal nuovo driver NTFS3 a partire dalla versione 5.15. La presenza di due driver per la realizzazione di NTFS nel kernel è considerata non necessaria, dato che il vecchio driver non è stato aggiornato da anni, è in cattive condizioni e può funzionare solo in modalità di sola lettura.
    • Nei file system zonefs e hugetlbfs è stata aggiunta la supporto per il mapping degli identificatori degli utenti dei file system montati, utilizzato per associare i file di un determinato utente su una partizione montata di un altro utente nel sistema attuale.
    • In NFSv4, per gli amministratori è stata fornita la possibilità di cancellare gli stati di apertura e blocco dei file.
    • Per il file system Ext4 si segnala solo la correzione di errori e l'aggiornamento dei test kunit.
    • In Btrfs è proseguita la conversione delle funzioni all'uso dei folios di pagina della memoria.
    • Nella file system XFS è proseguito il lavoro per implementare la possibilità di utilizzare l'utility fsck per controllare e correggere eventuali problemi in modalità online, senza smontare il file system.
    • Nella chiamata di sistema pwritev2() è stato aggiunto il flag RWF_NOAPPEND, che consente di specificare un offset per la scrittura, anche se il file è stato aperto in modalità append solo.
    • Sono stati aggiunti nuovi comandi ioctl: FS_IOC_GETUUID, che restituisce l'identificatore UUID del file system specificato, e FS_IOC_GETFSSYSFSPATH, che determina la posizione in /sys/fs del file system montato specificato.
    • I file system efs, qnx4 e coda sono stati convertiti per utilizzare la nuova API di montaggio delle partizioni.
    • Migliorata l'implementazione delle operazioni sui file eseguite in modalità senza distinzione tra maiuscole e minuscole. Le prestazioni sono state ottimizzate confrontando inizialmente con distinzione di maiuscole e minuscole e tornando al confronto senza distinzione. Risolti i problemi durante il montaggio di overlayfs su directory per cui è stata attivata la modalità senza distinzione tra maiuscole e minuscole.
  • Memoria e servizi di sistema
    • Implementato il supporto per il meccanismo Intel FRED (Flexible Return and Event Delivery), creato per aumentare l'efficienza e l'affidabilità nella consegna delle informazioni sugli eventi a basso livello, rispetto al meccanismo attualmente in uso, IDT (Interrupt Descriptor Table). Il miglioramento delle prestazioni e la riduzione dei ritardi sono garantiti dal ritorno degli eventi tramite l'istruzione del processore IRET anziché dalla trasmissione degli eventi attraverso la tabella IDT. L'affidabilità aumentata è dovuta alla gestione separata della ricezione degli eventi nel contesto del kernel e nel contesto utente, alla protezione contro l'esecuzione nidificata di NMI e al salvataggio in un frame di stack esteso di tutti i registri CPU associati all'eccezione.
    • È stata aggiunta la possibilità di ottimizzare l'accesso ai dati di specifici core CPU utilizzando gli spazi di indirizzi nominati (Named Address Spaces) nel codice, implementati in GCC come un'estensione di GNU C.
    • Alla funzione pidfd_open() è stato aggiunto il flag PIDFD_THREAD, che consente di creare un pidfd per singoli thread, non solo di utilizzare pidfd nel contesto del leader del gruppo di thread. È stata anche proposta un'implementazione di un pseudo-filesystem per accedere al pidfd attraverso un filesystem virtuale. A differenza dell'identificazione dei processi tramite pid, l'identificatore pidfd è legato a un processo specifico e non cambia, mentre il PID, dopo il completamento del processo corrente, può essere assegnato a un altro processo.
    • Nel sottosistema BPF è stato aggiunto un meccanismo di token BPF, che consente di delegare selettivamente ai programmi i diritti di accesso alle operazioni BPF privilegiate; ad esempio, è possibile fornire a un'applicazione non privilegiata l'accesso a sottosistemi BPF specifici senza concedere i diritti completi CAP_BPF.
    • Nel sottosistema BPF è stato aggiunto un nuovo tipo di memoria condivisa bpf_arena, che definisce l'area accessibile per la condivisione tra i programmi BPF e i processi nello spazio utente. È stata aggiunta l'istruzione may_goto, che consente di organizzare il funzionamento dei cicli, che possono essere interrotti dal verificatore. È stata aggiunta la possibilità di generare cookie TCP SYN arbitrarie dai programmi BPF e di creare gestori BPF per combattere il SYN flood.
    • Continua il trasferimento delle modifiche dalla branch Rust-for-Linux, relative all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel (il supporto per Rust non è attivo per impostazione predefinita e non comporta l'inclusione di Rust tra le dipendenze di build obbligatorie del kernel). È stato aggiunto il supporto per l'uso del linguaggio Rust su processori ARM a 64 bit. È stata effettuata la transizione all'uso della release Rust 1.76. È stato aggiunto il macro ‘container_of!’. Funzionalità instabile ‘ptr_metadata’ è stata sostituita da un metodo stabile ‘byte_sub’. È stato aggiunto il modulo ‘time’ con la funzione di conversione del tempo ‘msecs_to_jiffies()’.
    • Nel sottosistema io_uring è stata aggiunta la possibilità di troncare file (ftruncate_file).
    • È stato aggiunto un nuovo tipo di code di lavoro WQ_BH (workqueue Bottom Halves) per l'esecuzione asincrona di codice nel contesto delle interruzioni software, mirato a essere utilizzato al posto dei vecchi tasklet.
    • È stata notevolmente ristrutturata la sottosistema di gestione dei timer, migliorando la logica per la selezione del core CPU attivo per l'esecuzione del timer attivato, evitando di risvegliare core inattivi.
    • È stata implementata la possibilità di aggiornare il modello di consumo energetico del core (EM, Energy Model) durante il funzionamento, che può essere utilizzata, ad esempio, per tenere conto dell'influenza della temperatura di lavoro sull'efficienza energetica della CPU. È stata notevolmente migliorata la performance della funzione em_cpu_energy(), che ora viene eseguita più velocemente di 1.43 volte nei test su un sistema stazionario e di 1.69 volte nel test sulla scheda RockPi 4B.
    • È stato aggiunto il supporto per l'avvio di sistemi basati su architettura ARM64 in modalità LPA2 con uno spazio di indirizzamento virtuale a 52 bit.
    • Per i sistemi ARM64 è stato implementato il supporto per scritture continue PTE (Page Table Entry), aumentando le prestazioni grazie a un uso più efficiente del TLB (Translation Lookaside Buffer).
    • Sono stati adottati patch per migliorare le prestazioni del sottosistema di gestione della memoria riducendo la possibilità di blocchi concorrenti in vmalloc().
    • Per l'architettura LoongArch è stato implementato un meccanismo di hot patching del kernel (live patching) che consente di applicare correzioni al kernel senza dover riavviare.
    • Per i sistemi RISC-V è stato implementato il supporto per la chiamata di sistema membarrier(), che consente di impostare barriere di memoria per i thread in esecuzione nel sistema.
    • Sono stati elevati i requisiti per la versione di LLVM/Clang utilizzabile per la compilazione del kernel. Ora è richiesta una versione minima di LLVM 13.0.1 (in precedenza era supportata la compilazione con LLVM 11+).
    • Nel meccanismo 'User trace events', che consente di creare eventi di tracciamento dai processi utente per monitorare l'attività nello spazio utente, è stato aggiunto il supporto per esportare informazioni sugli eventi in vari formati (USER_EVENT_REG_MULTI_FORMAT).
    • Il meccanismo di tracciamento delle chiamate alle funzioni ora consente di monitorare lo stato degli argomenti in ingresso durante il tracciamento dell'uscita dalla funzione. I valori dell'operatore return possono ora essere associati agli argomenti utilizzati durante la chiamata della funzione.
    • Nell'utilità perf è stato aggiunto il supporto per la modalità di aggregazione dell'output «cluster» («perf stat -a —per-cluster») per combinare le statistiche delle risorse condivise. È stata implementata la possibilità di utilizzare la libreria libcapstone per il disassemblaggio delle istruzioni del processore («perf script -F disasm»). Sono state effettuate ottimizzazioni nel consumo di memoria durante l'esecuzione dei comandi perf report e perf annotate.
  • Virtualizzazione e sicurezza
    • È stata aggiunta la protezione contro la vulnerabilità RFDS (Register File Data Sampling) nei processori Intel Atom, che consente di estrarre informazioni residue dai file di registro (RF, Register File) del processore, utilizzati per memorizzare congiuntamente il contenuto dei registri in tutte le attività sullo stesso core CPU. Per bloccare la vulnerabilità è necessario un aggiornamento del microcodice e l'uso dell'istruzione VERW per pulire il contenuto dei buffer microarchitetturali al momento del ritorno dal kernel allo spazio utente. Per attivare la protezione all'avvio del kernel, è possibile specificare il flag "reg_file_data_sampling=on". È possibile valutare le informazioni sulla vulnerabilità e l'esistenza del microcodice necessario per la protezione nel file "/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling".
    • È stata aggiunta una base di supporto per la protezione dei sistemi ospiti tramite l'estensione AMD SEV-SNP (Secure Nested Paging), che garantisce un funzionamento sicuro con tabelle di pagine di memoria annidate e protegge dagli attacchi "undeSErVed" e "SEVerity" sui processori AMD EPYC, consentendo di bypassare il meccanismo di protezione AMD SEV (Secure Encrypted Virtualization). KVM Le modifiche necessarie per l'utilizzo di SNP sono previste nella branca 6.10.
    • I moduli che implementano le tecnologie IMA (Integrity Measurement Architecture) e EVM (Extended Verification Module) sono stati adattati per utilizzare il framework LSM (Linux Security Modules), il che ha semplificato notevolmente il codice senza compromettere le funzionalità, unendo le funzionalità duplicate e sfruttando le capacità standard disponibili tramite LSM. Il modulo IMA è progettato per verificare l'integrità dei componenti di sistema operativo attraverso firme digitali e hash. Il modulo EVM protegge gli attributi estesi dei file (xattrs) da attacchi volti a comprometterne l'integrità (EVM impedisce attacchi offline, in cui un aggressore potrebbe modificare i metadati, ad esempio avviando dal proprio dispositivo).
    • Riprogettate per una maggiore compatibilità con gli ambienti a 32 bit, le chiamate di sistema lsm_list_modules(), lsm_get_self_attr() e lsm_set_self_attr(), destinate a restituire l'elenco dei moduli LSM caricati (Linux Security Modules) e a ottenere/impostare gli attributi del modulo LSM. La modifica compromette la retrocompatibilità, ma poiché nuove chiamate di sistema sono state aggiunte nell'ultima versione del kernel e non vengono ancora utilizzate nelle applicazioni, Linus Torvalds ha ritenuto che la modifica fosse accettabile.
    • È stato tentato di ripristinare l'uso del meccanismo UBSAN (Undefined Behavior Sanitizer). La questione è che i compilatori trattano in modo diverso le overflow intere di tipi segnati e non segnati. Le overflow segnate e gli overflow dei puntatori rientrano nella categoria dei comportamenti indesiderati, mentre le overflow non segnate vengono trattate modulo 2n mantenendo solo i bit meno significativi del risultato («wrap-around») e non rientrano nel comportamento indefinito. Per escludere situazioni di comportamento indefinito, il kernel viene compilato con l'opzione «-fno-strict-overflow», che induce a utilizzare il «wrap-around» per tutte le overflow intere. GCC e Clang non riescono a diagnosticare correttamente alcuni problemi con il flag «-fno-strict-overflow» e l'inclusione di UBSAN è mirata a collaborare con gli sviluppatori di compilatori per eliminare falsi positivi e identificare le overflow intere in luoghi in cui mancano controlli espliciti.

      Per controllare i possibili overflow nel kernel, si utilizzano costrutti del tipo «var + offset PAGE_SHIFT) < pgoff){..}»), che sono legati alla compilazione con l'opzione "-fno-strict-overflow" e non coprono tutto il codice in cui potrebbe verificarsi un overflow. Il problema è che, utilizzando UBSAN, tali controlli portavano a molti falsi allarmi, e per questo motivo nel 2021 UBSAN è stato disattivato. Nella nuova implementazione si è proposto di usare annotazioni specifiche come __signed_wrap e __unsigned_wrap, oltre a macro pronte con controlli come add_would_overflow(a, b) e add_wrap(a, b), per separare gli overflow interi previsti dagli sviluppatori da quelli casuali che possono portare a vulnerabilità. La proposta di una riscrittura più ampia del kernel con l'introduzione di ulteriori definizioni di tipi è stata respinta da Linus Torvalds.

  • Sottosistema di rete
    • Nel sottosistema di rete è stato effettuato un lavoro per ridurre l'insorgere di blocchi concorrenti («lock contention», tentativo di ottenere un blocco trattenuto da un altro thread). È stato ridotto l'uso dei blocchi RTNL.
    • È stata aggiunta la possibilità di attivare il supporto per il busy polling in contesti di singole chiamate epoll. Le dimensioni del pool e i parametri di budget possono essere impostati separatamente dai parametri di sistema predefiniti.
    • È stata implementata la struttura net_hotdata per migliorare l'efficienza della cache delle variabili di configurazione di rete più frequentemente utilizzate.
    • In MPTCP è stato aggiunto il supporto per impostare l'opzione TCP_NOTSENT_LOWAT per i socket, che consente di limitare la dimensione del buffer di invio. Nell'API per i socket MCTP è stato aggiunto il supporto per gli identificatori di rete, che permettono di utilizzare più reti MCTP sovrapposte su un unico host.
    • In IPSec è stato aggiunto il supporto per il reindirizzamento dei messaggi ICMP con informazioni sugli errori (RFC 4301).
    • Il processo di scansione dei percorsi con scadenza è stato accelerato.
    • Le prestazioni di XDP sono state migliorate grazie a una rigorosa evitazione dell'allocazione di grandi blocchi di memoria.
    • È stata aggiunta la possibilità di allegare metadati ai messaggi netconsole.
    • In Netfilter, it's possible to define user space tables that are bound to the controlling background process and are not automatically deleted after the user application terminates.
    • In nftables, the addition of elements to set sets with merged ranges has been accelerated.
  • Attrezzature
    • In the i915 driver, work continues on implementing support for Intel LunarLake (Xe 2) chips. New PCI identifiers have been added for devices based on Intel Arrow Lake and Alder Lake N chips. Displayport support has been added for tunneling (DP tunneling) and bandwidth allocation. Fastboot mode has been enabled for all platforms. Debug output support has been added tied to individual devices.
    • In the AMDGPU driver, preparations have been made for the support of AMD RDNA3.5 and RDNA4 GPUs. Support has been added for ATHUB 4.1, LSDMA 7.0, JPEG DPG, IH 7.0, HDP 7.0, VCN 5.0, SMU 13.0.6, NBIO 7.11, SDMA 6.1, MMHUB 3.3, DCN 3.5.1, NBIF 6.3.1, VPE 6.1.1, and the RAS ACA framework. The kernel module has added the freesync_video parameter to enable experimental support for optimizing video mode switching using FreeSync adaptive synchronization technology.
    • Nel driver Nouveau, il codice di gestione dello schermo è stato trasferito all'utilizzo della funzione kmemdup().
    • È proseguito il lavoro sul driver drm (Direct Rendering Manager) Xe per GPU basate sull'architettura Intel Xe, utilizzata nelle schede grafiche Intel della famiglia Arc e nella grafica integrata a partire dai processori Tiger Lake.
    • Aggiunto il driver DRM per i chip Mediatek MT8188 VDOSYS1.
    • Le impostazioni del kernel legate ai sottosistemi video sono state trasferite nella sezione CONFIG_VIDEO.
    • Aggiunta supporto per SoC ARM64: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
    • Aggiunto supporto per piattaforme e dispositivi ARM: telefoni Android basati su chip Tegra30, modelli Chromebook basati su Mediatek MT8186, NAS, tablet e console di gioco basate su Rockchips RK35xx, schede White Hawk basate su SoC Renesas, schede basate su Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
    • È stata effettuata una rifattorizzazione del codice del sottosistema audio ALSA. Aggiunta la compatibilità con i sistemi audio Microchip SAM9x7, NXP i.MX95 e Qualcomm WCD939x. Nel driver SoundWire è stata implementata la supporto per ASoC con i coprocessori audio AMD ACP 6.3, mentre per i sistemi Intel è stata realizzata la modalità DSPless. Aggiunta la compatibilità con codec audio aggiuntivi Cirrus HD. Nel driver virtio è stato migliorato il controllo dei dispositivi audio.
    • Aggiunta la compatibilità con i controller Ethernet Marvell Octeon PCI Endpoint NIC VF e Intel E825-C 100G.

Contemporaneamente, la Fondazione latinoamericana del software libero ha creato una versione completamente libera del kernel 6.9 — Linux-libre 6.9-gnu, ripulita da elementi di firmware e driver contenenti componenti chiusi o porzioni di codice il cui utilizzo è limitato dal produttore. Nella versione 6.9 è stato aggiornato il codice di pulizia dei blob nei driver amdgpu, ath12k, adreno, btusb e r8169. È stata effettuata la pulizia del nuovo driver ptp_fc3. È stata effettuata la pulizia dei nomi dei blob nei file dts (devicetree) per l'architettura Aarch64. Risolti problemi con la pulizia del driver i915 che causavano blocchi durante l'inizializzazione. Apportate modifiche relative alla gestione dei blob forniti sotto forma di dump esadecimali.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster