Dopo due mesi di sviluppo, Linus Torvalds ha presentato il rilascio del kernel Linux 7.0. Tra le modifiche più significative: regole per l'uso degli assistenti AI, integrazione di Rust nelle funzionalità principali del kernel, miglioramento delle prestazioni di swap, attivazione predefinita della modalità PREEMPT_LAZY, supporto per filtri nelle operazioni io_uring, nuova FS Nullfs, infrastruttura fserror, strumenti di monitoraggio XFS, supporto per il remapping in Btrfs, attivazione predefinita della versione NFS 4.1, integrazione dell'algoritmo crittografico post-quantistico ML-DSA, attivazione di AccECN nel sottosistema di rete, supporto iniziale per WiFi 8.
Il numero 7.0 è stato assegnato poiché nella serie 6.x si è accumulato un numero sufficiente di rilasci per cambiare il primo numero nella versione (in precedenza, il rilascio 6.0 è stato creato subito dopo il 5.19). Il cambiamento della numerazione avviene per ragioni estetiche ed è un passo formale che allevia il disagio causato dall'accumulo di troppi rilasci nella serie.
Nella nuova versione sono stati inclusi 15624 correttivi da 2477 sviluppatori, la dimensione della patch è di 56 MB (le modifiche hanno interessato 18053 file, sono state aggiunte 704060 righe di codice, rimosse 278132 righe). Nel rilascio precedente erano stati apportati 15657 correttivi da 2237 sviluppatori, la dimensione della patch era di 52 MB. Circa il 51% di tutte le modifiche presentate in 7.0 riguarda i driver di dispositivo, circa l'11% è relativo all'aggiornamento del codice specifico per architetture hardware, il 14% è correlato allo stack di rete, il 5% ai file system e il 3% ai sottosistemi interni del kernel.
Novità principali nel kernel 7.0 (1, 2, 3):
- Sottosistema di disco, input/output e file system
- È stata implementata l'infrastruttura fserror e aggiunto un API per ottenere informazioni sugli errori di input/output e sulla corruzione dei metadati durante l'interazione con i file. L'infrastruttura proposta uniforma nei file system la trasmissione delle informazioni sugli errori nello spazio utente attraverso il meccanismo fsnotify.
- In XFS sono state aggiunte nuove funzionalità per il monitoraggio dello stato del file system dallo spazio utente. È stata proposta l'operazione ioctl XFS_IOC_HEALTH_MONITOR, che restituisce un descrittore di file attraverso cui è possibile ottenere informazioni su guasti legati alla corruzione dei metadati o sul verificarsi di errori durante le operazioni di input/output, oltre a monitorare le modifiche di stato del file system, come il smontaggio e lo spegnimento. Inoltre, è stato proposto un processo in background gestito tramite systemd, chiamato xfs_healer, che gestisce gli eventi sullo stato del file system dallo spazio utente e avvia automaticamente le procedure di ripristino se necessario.
- Nel file system Btrfs è stata aggiunta la supporto sperimentale per la struttura "albero di rimappature" (remap tree), che potrebbe essere utilizzata in futuro come strato intermedio durante le operazioni di input-output. La sostanza di questa nuova funzionalità è che, dopo aver spostato i dati sullo storage, invece di aggiornare tutte le strutture correlate a questi dati, gli indirizzi dei dati vecchi e nuovi vengono mantenuti in una struttura addizionale "remap tree", sostituendo gli indirizzi quando si accede ai dati. Questo nuovo approccio è presentato come più affidabile e flessibile, semplificando anche l'espansione delle funzionalità di Btrfs.
- In Btrfs è stata implementata la supporto per l'input/output diretto in situazioni in cui la dimensione del blocco supera la dimensione della pagina di memoria nel sistema.
- È stata introdotta una nuova file system "Nullfs", che può essere utilizzata come placeholder per la root FS. Il file system Nullfs è sempre vuoto, non contiene dati e non supporta modifiche. Lo scopo di Nullfs è quello di fungere da file system iniziale per semplificare il processo di avvio del sistema: sopra Nullfs vengono montati altri file system e si utilizza la chiamata di sistema pivot_root() per passare alla root FS invece di svuotare il contenuto di initramfs e utilizzare il file system root ad esso associato.
- È stato implementato l'aggiornamento delle informazioni sulla data di modifica dei file in modalità non bloccante. In precedenza, la chiamata file_update_time_flags() con il flag IOCB_NOWAIT restituisceva l'errore "-EAGAIN", impedendo l'utilizzo delle operazioni di scrittura diretta in modalità non bloccante.
- Nelle file system, nella categoria delle opzioni disattivabili è stata tradotta la supporto delle bloccature di notifica (lease). Di default, questo meccanismo non è più attivato a causa di problemi con i file system originariamente non progettati per il suo utilizzo. Ad esempio, non è supportato dai file system 9p e cephfs.
- Nel file system EROFS (Extendable Read-Only File System), pensato per essere utilizzato su partizioni accessibili in sola lettura, l'algoritmo LZMA è ora utilizzato di default per la compressione. Gli algoritmi DEFLATE e Zstandard sono disponibili come opzione e non sono più contrassegnati come sperimentali. È stata implementata la condivisione delle voci nella cache delle pagine (page-cache) per file identici in file system EROFS distinti.
- È stato rimosso il mode laptop_mode, che riduceva il consumo energetico posticipando e unendo le operazioni di scrittura su disco rigido per prolungare il tempo in cui il disco rimaneva in modalità sospensione e ridurre il numero di risvegli. Questa modalità ha perso rilevanza, poiché nei moderni dispositivi mobili i dischi rigidi sono stati sostituiti da unità a stato solido.
- Il file system F2FS è stato portato a utilizzare grandi folia di memoria (large folios).
- È stata rinvigorita la lavoro sul driver ntfs3, sviluppato da Paragon Software. È stata aggiunta la supporto per le operazioni sui file basate su iomap, implementate le opzioni llseek SEEK_DATA/SEEK_HOLE, e aggiunto il mode delalloc per l'allocazione ritardata dei blocchi. Nel frattempo, nella mailing list degli sviluppatori del kernel, a febbraio è stata approvata l'inclusione di una nuova implementazione di NTFS — ntfsplus, progettata per sostituire ntfs3 in una delle future versioni del kernel.
- Di default, alla compilazione è inclusa la versione 4.1 del protocollo NFS (CONFIG_NFS_V4_1). È stata garantita la bloccatura dell'esportazione attraverso NFS di file system pseudo-specializzati, come pidfs e nsfs. In NFSD è stata implementata una possibilità sperimentale di utilizzo delle ACL POSIX ed è stata aggiunta la supporto per la modifica dinamica del pool di thread (thread-pool) in base al carico.
- Memoria e servizi di sistema
- Sono state approvate le regole ufficiali per l'utilizzo degli assistenti AI e l'inclusione nel nucleo di contenuti generati automaticamente. Nella trasmissione del codice generato è necessario contrassegnarlo indicando l'assistente AI utilizzato tramite il tag «Assisted-by». Agli assistenti AI è vietato aggiungere il tag «Signed-off-by»: la persona che ha trasmesso la patch è considerata l'autore, è responsabile per la modifica trasmessa e ne garantisce la qualità. Gli sviluppatori sono tenuti a eseguire una revisione manuale del codice ottenuto tramite AI e a verificare la conformità del risultato ai requisiti di licenza.
- Il supporto per Rust è stato trasferito dalle funzionalità sperimentali a quelle principali del nucleo. Il supporto per Rust non è attivo per impostazione predefinita e non porta all'inclusione di Rust fra le dipendenze di build obbligatorie del nucleo.
- È stata completata l'integrazione nel nucleo del meccanismo «Swap Table», che consente di migliorare le prestazioni della memoria di swapping. L'accelerazione è raggiunta grazie alla riduzione della competizione per l'accesso alla cache di swapping, a una ricerca più efficiente nella cache e alla diminuzione della frammentazione. Il backend basato su Swap Table è stato implementato per la memorizzazione nella cache dello swapping al posto del backend XArray, permettendo di aumentare il numero di richieste elaborate nel test redis-benchmark con BGSAVE del 22%.
- È stato aggiunto il supporto per l'estensione Thread Safety Analysis introdotta in Clang 22, che consente di identificare durante la fase di compilazione potenziali condizioni di gara e errori causati da una gestione errata dei lock. L'estensione offre una serie di attributi, come GUARDED_BY(…), REQUIRES(…), RELEASE(…) e ACQUIRE(…), che consentono di contrassegnare le funzioni protette dai lock e di separare i contesti di azione dei lock. Durante la fase di compilazione viene eseguito un controllo della correttezza dell'uso dei primitivi di sincronizzazione, come i mutex, basato sulla valutazione dell'attività o inattività del contesto associato.
- Nella chiamata di sistema open_tree è stato aggiunto il flag OPEN_TREE_NAMESPACE per semplificare la configurazione dei container isolati e accelerare l'avvio dei container su sistemi con un gran numero di punti di montaggio. Analogamente a OPEN_TREE_CLONE, il nuovo flag copia solo l'albero di montaggio specificato, ma invece di restituire un descrittore di file locale, restituisce un descrittore di file in un nuovo namespace di punti di montaggio, in cui l'albero copiato viene montato sopra la copia del filesystem radice reale. Il flag OPEN_TREE_NAMESPACE è richiesto per evitare l'esecuzione separata delle operazioni unshare(CLONE_NEWNS) e pivot_root(), utilizzate nella creazione dei container.
- Nella chiamata di sistema rseq è stato aggiunto un meccanismo di estensione dei quanti di tempo, che consente di ottenere ulteriore tempo di CPU per l'esecuzione ininterrotta della sezione critica. L'idea è quella di evitare l'interruzione da parte dello scheduler della sezione critica con il blocco impostato, che porta al passaggio di controllo ad altri thread che utilizzano la risorsa, su cui rimane impostato il blocco. L'estensione del quanto di tempo avviene senza costi aggiuntivi, ma senza le rigorose garanzie fornite da una regolamentazione completa delle priorità.
- Per le architetture arm64, loongarch, powerpc, riscv, s390 e x86, la modalità di preemption nel scheduler è stata modificata per impostazione predefinita da PREEMPT_NONE a PREEMPT_LAZY. Il numero di modalità possibili è stato ridotto da quattro a due — PREEMPT_FULL e PREEMPT_LAZY (le modalità PREEMPT_NONE e PREEMPT_VOLUNTARY rimangono solo per le architetture che non supportano PREEMPT_FULL e PREEMPT_LAZY). La modalità PREEMPT_LAZY applica un modello di preemption completa (PREEMPT_FULL) per i task realtime (RR/FIFO/DEADLINE), ma ritarda la preemption dei task normali (SCHED_NORMAL) fino al confine del tick. Il ritardo introdotto riduce i casi di preemption dei detentori di lock, avvicinando le prestazioni a configurazioni che utilizzano un modello di preemption volontaria (voluntary preemption), cioè PREEMPT_LAZY consente di mantenere le capacità di preemption completa per i task realtime, minimizzando però il calo delle prestazioni per i task normali.
L'attivazione di PREEMPT_LAZY ha portato a una regressione significativa, riducendo la produttività di PostgreSQL sui sistemi ARM64 di due volte. Per risolvere il calo delle prestazioni, gli sviluppatori di PostgreSQL sono stati invitati a utilizzare l'opzione PR_RSEQ_SLICE_EXTENSION per ridurre la probabilità di dislocamento del detentore del blocco.
- Continua il trasferimento delle modifiche dal ramo Rust-for-Linux, relative all'uso del linguaggio Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel. Grazie alla libreria 'syn' precedentemente integrata, che semplifica la scrittura di macro complesse, è stato possibile ridurre la dimensione del codice Rust nel kernel semplificando le definizioni delle macro procedurali esistenti. Sono state ampliate le funzionalità delle librerie kernel, macros e pin-init.
- Nel sistema di input/output asincrono io_uring è stata aggiunta un'opzione per l'utilizzo di code di invio non circolari (non-circular submission queue), più efficienti da memorizzare nella cache in situazioni in cui l'esecuzione di una richiesta termina prima del ritorno dalla chiamata di sistema.
- Nella sottosistema eBPF, nel meccanismo BTF (BPF Type Format), che fornisce informazioni per il controllo dei tipi nel pseudocodice BPF, è stata utilizzata la ricerca binaria per trovare informazioni di debug, aumentando così l'efficienza di caricamento dei programmi BPF. In eBPF è stata aggiunta la supporto per argomenti impliciti durante la chiamata di kfunc (funzioni del kernel, disponibili per l'uso nei programmi BPF), definite con il flag KF_IMPLICIT_ARGS.
- È stato rimosso il codice per il supporto del disco RAM iniziale (initrd) basato su linuxrc, ormai deprecato. Le implementazioni rimanenti di initrd sono previste per essere rimosse nel 2027. Invece di initrd, è consigliabile utilizzare initramfs (la differenza è che initrd posiziona l'ambiente di avvio iniziale in un'immagine disco, mentre initramfs lo fa in un file system).
- Nella memoria di blocco zram, utilizzata per la memorizzazione compressa della partizione di swap in memoria, è stata modificata la logica di funzionamento con le pagine di memoria compresse durante il passaggio opzionale dei dati a un'archiviazione permanente in caso di esaurimento della memoria RAM disponibile. In precedenza, le pagine di memoria venivano decompressi prima di essere scritti su un supporto fisico, mentre ora vengono salvati così com'è in forma compressa, riducendo il carico sulla CPU e risparmiando energia durante la modalità a batteria.
- Nell'utilità timerlat, destinata a misurare i ritardi nel lavoro dello scheduler, è stata aggiunta l'opzione "—bpf-action" per l'esecuzione di programmi BPF in caso di superamento della soglia definita.
- Nel sistema di tracciamento ftrace è stata aggiunta l'impostazione "bitmask-list" per visualizzare le maschere dei bit in modo leggibile (sotto forma di lista di bit e non come numero esadecimale). Sono state integrate funzionalità per l'audit dei filtri e dei trigger in tracefs. È stato aggiunto il comando "perf sched stats" per raccogliere e visualizzare statistiche sulle prestazioni dello scheduler.
- Sono state aggiunte opzioni di compilazione LOGO_LINUX_MONO_FILE, LOGO_LINUX_VGA16_FILE e LOGO_LINUX_CLUT224_FILE per definire il file contenente l'immagine del logo che verrà mostrata durante il caricamento del kernel, al posto del logo standard con il pinguino Tux.
- Virtualizzazione e sicurezza
- Nel sistema di input/output asincrono io_uring è stata implementata la possibilità di allegare programmi BPF con filtri, per controllare cosa possono fare specifiche operazioni SQE (Submission Queue Entry), simili alle chiamate di sistema in io_uring. Questa funzionalità aggiunta è equivalente ai filtri delle chiamate di sistema. I filtri possono essere legati a compiti specifici e vengono ereditati alla creazione di altri processi dopo la chiamata fork(). In presenza di filtri attivi, i filtri aggiuntivi possono solo imporre ulteriori limitazioni, senza disabilitare quelli esistenti. Questa funzionalità implementata consentirà di bloccare i metodi per aggirare la filtrazione delle chiamate di sistema in ambienti sandbox, basati sull'esecuzione di operazioni simili fornite in io_uring.
- In SELinux è stata aggiunta la possibilità di gestire l'accesso ai token BPF, consentendo ai processi non privilegiati di eseguire alcune operazioni privilegiate con BPF, come caricare programmi BPF nel kernel e creare strutture mappa.
- È stata aggiunta la supporto per l'algoritmo di generazione di firme digitali ML-DSA (CRYSTALS-Dilithium), basato sulla teoria delle reticoli e resistente alla decifrazione su un computer quantistico. È stata fornita la possibilità di utilizzare ML-DSA per l'autenticazione dei moduli del kernel.
- È stata rimossa la possibilità di utilizzare schemi di generazione di firme digitali con l'algoritmo SHA-1 per la certificazione dei moduli del kernel (il supporto per il caricamento di moduli firmati è mantenuto).
- Nella registrazione dell'audit NETFILTER_PKT sono stati aggiunti i campi ‘sport’ e ‘dport’ per ispezionare i numeri delle porte di rete, e non solo. indirizzi IP.
- Per i sistemi con architettura RISC-V è stata implementata la supporto per le estensioni Zicfiss e Zicfilp, che forniscono capacità hardware per l'applicazione della protezione CFI (Control Flow Integrity), che blocca le violazioni dell'ordine normale di esecuzione delle istruzioni (control flow) a causa dell'uso di exploit che modificano i puntatori a funzioni memorizzati in memoria.
- Nell'hypervisor KVM È stata realizzata la possibilità di trasmettere ai sistemi ospiti informazioni sul supporto dell'estensione ERAPS (Enhanced Return Address Predictor Security) da parte del processore, che consente di evitare alcune operazioni di reset dello stato della CPU al ritorno del controllo al sistema host da parte del sistema guest. Inoltre, è stato aggiunto il supporto per l'assegnazione di risorse hardware ai sistemi ospiti per il monitoraggio delle prestazioni (PMU, Performance Monitoring Unit), che permette di migliorare l'accuratezza del profiling rispetto all'uso di PMU emulati.
- Nel driver per l'iper-v di Hyper-V è stato aggiunto il supporto per l'interfaccia debugfs per visualizzare le statistiche sul funzionamento dell'iper-v.
- Sottosistema di rete
- È stata attivata di default l'estensione AccECN (Accurate Explicit Congestion Notification), che implementa una versione migliorata dell'estensione ECN, che consente agli host, in caso di sovraccarico, di contrassegnare i pacchetti IP anziché scartarli, permettendo così di rilevare l'insorgere di uno stato iniziale di congestione nei canali di comunicazione senza perdita di pacchetti. L'estensione originale ECN ha una limitazione che permette di inviare solo un segnale di sovraccarico all'interno di un singolo ciclo di ricezione-invio TCP (RTT, Round-Trip Time, invio di una richiesta e ricezione di una risposta). AccECN rimuove questa limitazione e consente al destinatario di inviare al mittente più di un'etichetta di sovraccarico nell'intestazione del pacchetto TCP. Gli algoritmi di gestione del sovraccarico possono utilizzare le informazioni ricevute per rispondere più accuratamente ai sovraccarichi, evitando brusche riduzioni nell'intensità di invio dei pacchetti in caso di una leggera congestione.
- Nell'implementazione dell'algoritmo di gestione delle code di rete Cake è stata aggiunta la possibilità di gestire più code per distribuire il carico su più core CPU. L'algoritmo CAKE viene utilizzato per ridurre l'impatto negativo del buffering intermedio dei pacchetti sull'hardware di rete di confine e mira a raggiungere la massima larghezza di banda possibile e il minimo livello di latenza anche su canali di comunicazione lenti.
- Nei socket VSOCK, utilizzati per interagire con le macchine virtuali, è stata aggiunta la supporto per gli spazi dei nomi di rete (network namespace).
- Aggiunta l'implementazione iniziale del futuro standard WiFi 8 (802.11bn, WiFi ad ultra alta affidabilità).
- Sono state aggiunte ottimizzazioni che hanno permesso di aumentare le prestazioni nell'elaborazione dei pacchetti UDP in ingresso del 12% durante i test di stress su una rete da 100 gigabit.
- Apparecchiatura
- Nel driver AMDGPU è stata implementata la supporto per i blocchi IP utilizzati nelle nuove GPU AMD, come SMUIO 15.x, PSP 15.x, IH 6.1.1/7.1, MMHUB 3.4/4.2, GC 11.5.4/12.1, SDMA 6.1.4/7.1/7.11.4 e JPEG 5.3.
- Nel driver Nouveau è stata migliorata la gestione della frequenza sui sistemi Tegra 186+.
- Nel driver i915 è stata aggiunta la supporto iniziale per il blocco IP di visualizzazione Xe3p_LPD, utilizzato nei processori Intel Nova Lake-P.
- È continuata l'attività 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. È stata aggiunta la modalità Multi Queue. Sono stati aggiunti componenti necessari per diagnosticare i blocchi della GPU in Mesa. È stata aggiunta la supporto per il meccanismo MERT per gestire l'accesso alla memoria GPU.
- È proseguita l'integrazione dei componenti del driver Nova per le GPU NVIDIA dotate di firmware GSP, utilizzate a partire dalla serie NVIDIA GeForce RTX 2000 basata sull'architettura Turing. Il driver è stato scritto in Rust. Nella nuova versione è stata effettuata una preparazione per realizzare il supporto per le GPU basate sull'architettura Turing e sono state apportate varie modifiche interne.
- Aggiunta la supporto per controller e dispositivi periferici con interfaccia SPI (Serial Peripheral Interface) multi-canale, che consente di trasmettere dati in più flussi paralleli.
- È stato aggiunto un driver per i connettori combinati Type-C, utilizzati su dispositivi basati su chip Apple Silicon e che integrano le interfacce USB3, DP-AltMode e Thunderbolt/USB4.
- Aggiunto supporto per i sottosistemi audio dei chip Tegra238, Minisforum V3 SE, iBasso DC04U, Intel Nova Lake, Nova Lake S e Focusrite Forte.
- Aggiunto supporto per schede ARM, SoC e dispositivi: Arduino UnoQ, OrangePi 6 Plus, OrangePi CM5, Anbernic RG-DS, Realtek Kent, Qualcomm Kaanapali, Mediatek Ezurio, Facebook Anacapa, Microchip LAN9668, Khadas VIM1S, QNAP TS133, i.MX952, i.MX93, i.MX94, VHIP4 EvalBoard, TQ-Systems MBLS1028A, Agilex5, Radxa CM3J, Glymur,
- Aggiunto il supporto per smartphone e tablet: Fairphone Gen 6 (SoC Qualcomm Milos/Snapdragon 7s Gen 3), Pixel 3/3 xl, Microsoft Surface Pro 11.
Contemporaneamente, il Fondo Latinoamericano per il Software Libero ha creato una versione completamente libera del kernel 7.0 — Linux-libre 7.0-gnu, purificata da elementi di firmware e driver contenenti componenti non liberi o sezioni di codice, il cui utilizzo è limitato dal produttore. Nella versione 7.0 è stata eseguita la pulizia dai blob del driver iwlwifi. Il codice di pulizia nei driver amdgpu, adreno, TI PRUeth, air_en8811h, ath12k, TI VPE, rtw8852b, rt1320, rt5575 SPI, tas2783, Intel catpt è stato aggiornato. È stata effettuata la pulizia dei nomi dei blob nei file dts (devicetree) per chip ARM.
Fonte: opennet.ru
