După două luni de dezvoltare, Linus Torvalds a lansat versiunea nucleului Linux 6.9. Printre cele mai notabile modificări se numără: modulul dm-vdo pentru deduplicarea și compresia dispozitivelor bloc, modul de acces direct la fișiere în FUSE, suport pentru crearea pidfd pentru firele de execuție separate, mecanismul de tokenuri BPF, suport pentru Rust pe sistemele ARM64, trecerea FS Ext2 în categoria celor învechite, eliminarea vechiului driver NTFS, suport pentru mecanismul Intel FRED.
Noua versiune include 15680 corecții de la 2106 dezvoltatori, dimensiunea patch-ului fiind de 54 MB (modificările au afectat 11825 fișiere, s-au adăugat 687954 linii de cod și s-au șters 225344 linii). În versiunea anterioară s-au înregistrat 15641 corecție de la 2018 dezvoltatori, iar dimensiunea patch-ului a fost de 44 MB. Aproximativ 42% din toate modificările prezentate în 6.9 sunt legate de driverele de dispozitive, aproximativ 17% din modificări se referă la actualizări de cod specific pentru arhitecturi hardware, 13% sunt legate de stiva de rețea, 7% de sisteme de fișiere și 4% de subsistemele interne ale nucleului.
Inovațiile principale în nucleul 6.9:
- Subsistemul de disc, I/O și sistemele de fișiere
- Un nou procesor dm-vdo (virtual data optimizer) a fost adăugat în Device Mapper (DM), permițând crearea unui dispozitiv bloc virtual pe baza dispozitivelor bloc existente, având funcționalități precum deduplicarea datelor repetitive, compresia datelor, excluderea blocurilor goale și creșterea dimensiunii dispozitivului bloc pe măsură ce apare necesitatea (thin provisioning). Aceste funcționalități sunt implementate la nivel de dispozitiv bloc și nu depind de sistemul de fișiere utilizat (de exemplu, prin dm-vdo se poate realiza combinarea automată a datelor duplicate și stocarea informațiilor într-o formă comprimată pentru orice FS). Suportă aplicarea dm-vdo pentru stocări fizice cu dimensiuni de până la 256TB și crearea de volume logice cu dimensiuni de până la 4PB. Pentru gestionarea partițiilor vdo, se recomandă utilizarea lvm. Tehnologia VDO a fost dezvoltată de compania Permabit și a fost deschisă după achiziția sa de către Red Hat în 2017.
- În subsistemul FUSE, utilizat pentru implementarea sistemelor de fișiere în spațiul utilizatorului, a fost adăugată o implementare inițială a modului „passthrough”, care permite obținerea directă la nivel de kernel a datelor fișierelor, ocolind procesul care rulează în spațiul utilizatorului, ceea ce permite în anumite situații să se îmbunătățească semnificativ performanța. De exemplu, implementările FUSE ale FS care funcționează în modul numai pentru citire și care restricționează accesul la fișiere pot returna conținutul fișierelor din FS-ul sursă fără a le transmite în procesul FUSE.
- Driverul cu implementarea sistemului de fișiere Ext2 a fost clasificat ca fiind învechit (deprecated). Ca motiv, se menționează că driverul suportă doar contoare de timp pe 32 de biți în inode, care se vor supraîncărca pe 19 ianuarie 2038. În locul driverului ext2, se recomandă utilizarea driverului ext4, care suportă lucrul cu sistemul de fișiere Ext2 și este complet compatibil cu acesta, dar poate folosi în partajările ext2 timpi de date care nu sunt afectați de problema anului 2038, dacă FS-ul a fost creat cu inode-uri de dimensiuni mai mari de 255 de biți (în driverul ext2, contoarele de timp pe 32 de biți au fost utilizate independent de dimensiunea inode-ului).
- Driverul vechi pentru sistemul de fișiere NTFS a fost eliminat, fiind înlocuit începând cu versiunea 5.15 cu un nou driver NTFS3. Livrarea a două drivere cu implementarea NTFS în kernel a fost considerată nejustificată, având în vedere că vechiul driver nu a mai fost actualizat de mult timp, se află într-o stare deplorabilă și poate funcționa doar în modul de citire.
- În sistemele de fișiere zonefs și hugetlbfs a fost adăugată suport pentru maparea identificatorilor utilizatorilor în sistemele de fișiere montate, utilizată pentru a coresponda fișierele unui anumit utilizator pe o partiție străină cu alt utilizator din sistemul curent.
- În NFSv4 pentru administratori a fost oferită posibilitatea de a cleare stările de deschidere și blocare a fișierelor.
- Pentru sistemul de fișiere Ext4 se observă doar corectarea erorilor și actualizarea testelor kunit.
- În Btrfs, traducerea funcțiilor pentru utilizarea foliantelor de pagină de memorie (page folios) a continuat.
- În sistemul de fișiere XFS, s-a continuat lucrul asupra implementării posibilității de aplicare a utilitarului fsck pentru a verifica și a corecta problemele descoperite în modul online, fără a de-monta sistemul de fișiere.
- În apelul de sistem pwritev2() a fost adăugat un flag RWF_NOAPPEND, care permite specificarea unei deplasări pentru scriere, chiar dacă fișierul a fost deschis în modul de doar adăugare a datelor la sfârșitul fișierului.
- Au fost adăugate noi comenzi ioctl: FS_IOC_GETUUID — returnează identificatorul UUID al sistemului de fișiere specificat, și FS_IOC_GETFSSYSFSPATH — determină locația în /sys/fs a sistemului de fișiere montat specificat.
- Sistemele de fișiere efs, qnx4 și coda au fost migrate la utilizarea noului API de montare a partițiilor.
- Implementarea operațiunilor cu fișiere efectuate în modul fără considerație pentru case-sensitive a fost îmbunătățită. Performanța a crescut prin efectuarea inițială a comparației cu considerație pentru case-sensitive și revenirea la căutarea fără considerație pentru case-sensitive. Problemele legate de montarea overlayfs peste directoare pentru care este setat modul fără considerație pentru case-sensitive au fost rezolvate.
- Memorie și servicii de sistem
- A fost implementat suportul pentru mecanismul Intel FRED (Flexible Return and Event Delivery), creat pentru a îmbunătăți eficiența și fiabilitatea livrării informațiilor despre evenimente de nivel inferior, în comparație cu mecanismul utilizat în prezent IDT (Interrupt Descriptor Table). Creșterea performanței și reducerea întârzierilor se realizează prin returnarea evenimentelor prin instrucțiunea procesorului IRET în loc de transmiterea evenimentelor prin tabela IDT. Fiabilitatea este crescută datorită procesării separate a evenimentului în contextul kernel-ului și contextul utilizatorului, protecția împotriva execuției imediate NMI și salvarea în cadrul extins al stivei a tuturor registrelor CPU asociate cu excepția.
- A fost adăugată posibilitatea optimizării accesului la datele nucleelor CPU individuale prin utilizarea în codul kernel-ului a spațiilor de adresă numite (Named Address Spaces), implementate în GCC sub forma unei extensii GNU C.
- În funcția pidfd_open() a fost adăugat flagul PIDFD_THREAD, care permite crearea unui pidfd pentru fire individuale, nu doar utilizarea pidfd în contextul liderului grupului de fire. De asemenea, a fost propusă implementarea unui pseudo-sistem de fișiere pentru accesul la pidfd prin intermediul sistemului de fișiere virtual. Spre deosebire de identificarea proceselor cu ajutorul pid-ului, identificatorul pidfd este legat de un proces specific și nu se schimbă, în timp ce PID-ul după terminarea procesului curent poate fi legat de un alt proces.
- În subsistemul BPF a fost adăugat un mecanism BPF-token, care permite delegarea selectivă a drepturilor de acces la operațiunile privilegiate BPF programelor, de exemplu, se poate oferi unei aplicații neprivilegiate acces la sub-sisteme BPF individuale fără a-i oferi drepturi complete CAP_BPF.
- În subsistemul BPF a fost adăugat un nou tip de memorie partajată bpf_arena, definind o zonă disponibilă pentru partajare între programele BPF și procesele din spațiul utilizator. A fost adăugată instrucțiunea may_goto, care permite organizarea ciclurilor de lucru, care pot fi întrerupte de verificator. A fost adăugată posibilitatea de a genera din programele BPF cookie-uri TCP SYN arbitrare și de a crea gestionari BPF pentru a lupta împotriva SYN flood.
- Continuarea transferului modificărilor din ramura Rust-for-Linux, legate de utilizarea limbajului Rust ca al doilea limbaj pentru dezvoltarea driverelor și modulelor de kernel (suportul pentru Rust nu este activat implicit și nu duce la includerea Rust în lista de dependențe obligatorii pentru kernel). A fost adăugat suportul pentru utilizarea limbajului Rust pe procesoare ARM pe 64 de biți. A fost realizată trecerea la versiunea Rust 1.76. A fost adăugat macro-ul ‘container_of!’. În locul funcționalității instabile ‘ptr_metadata’ a fost utilizată metoda stabilă ‘byte_sub’. A fost adăugat modulul ‘time’ cu funcția de conversie a timpului ‘msecs_to_jiffies()’.
- În subsistemul io_uring a fost adăugată posibilitatea de a tăia fișiere (ftruncate_file).
- A fost adăugat un nou tip de cozi de lucru WQ_BH (workqueue Bottom Halves) pentru executarea asincronă a codului în contextul întreruperilor software, destinat utilizării în locul tasklet-urilor învechite.
- Subsistemul de gestionare a temporizatoarelor a fost semnificativ revizuit, îmbunătățindu-se logica selectării nucleului CPU activ pentru a executa temporizatorul declanșat, pentru a nu scoate din modul de așteptare nucleele inactivate.
- A fost implementată posibilitatea de actualizare a modelului de consum de energie al nucleului (EM, Energy Model) în timpul funcționării, ceea ce poate fi utilizat, de exemplu, pentru a lua în considerare influența temperaturii de funcționare asupra eficienței energetice a CPU-ului. Funcția em_cpu_energy() a fost semnificativ îmbunătățită, fiind acum de 1.43 ori mai rapidă în teste pe un sistem staționar, iar în testul pe placa RockPi 4B — de 1.69 ori.
- A fost adăugat suport pentru lansarea sistemelor bazate pe arhitectura ARM64 în modul LPA2 cu un spațiu de adrese virtuale de 52 de biți.
- Pentru sistemele ARM64, a fost implementat suportul pentru înregistrările continue PTE (Page Table Entry), care permit îmbunătățirea performanței prin creșterea eficienței utilizării TLB (Translation Lookaside Buffer).
- Au fost acceptate patch-uri pentru îmbunătățirea performanței subsystemului de gestionare a memoriei, reducând apariția blocărilor concurente în vmalloc().
- Pentru arhitectura LoongArch, a fost implementat un mecanism de aplicare a patch-urilor în mod live (live patching), care permite aplicarea corecțiilor la nucleu fără a fi necesară repornirea sistemului.
- Pentru sistemele RISC-V, a fost implementat suportul pentru apelul de sistem membarrier(), care asigură stabilirea barierelor de memorie pentru firele de execuție care rulează în sistem.
- S-au ridicat cerințele pentru versiunea LLVM/Clang care poate fi utilizată pentru compilarea nucleului. Acum, pentru compilare este necesar un minimum de versiune LLVM 13.0.1 (anterior era acceptată compilarea în LLVM 11+).
- În mecanismul «User trace events», care permite crearea de evenimente de urmărire din procesele utilizator pentru monitorizarea activităților din spațiul utilizatorului, a fost adăugat suport pentru exportarea informațiilor despre evenimente în diverse formate (USER_EVENT_REG_MULTI_FORMAT).
- În mecanismul de urmărire a apelurilor de funcții, a fost adăugată posibilitatea de a urmări starea argumentelor de intrare ale funcției atunci când se urmărește ieșirea din funcție. Valorile operatorului return pot acum fi corelate cu argumentele utilizate la apelul funcției.
- Utilitarul perf a adăugat suport pentru modul de agregare a ieșirii «cluster» («perf stat -a --per-cluster») pentru combinarea statisticilor de resurse partajate. A fost implementată posibilitatea de a utiliza biblioteca libcapstone pentru dezasamblarea instrucțiunilor procesorului («perf script -F disasm»). Au fost efectuate optimizări ale consumului de memorie în timpul execuției comenzilor perf report și perf annotate.
- Virtualizare și securitate
- A fost adăugată protecția împotriva vulnerabilității RFDS (Register File Data Sampling) în procesoarele Intel Atom, care permite extragerea informațiilor reziduale din fișierele de registre (RF, Register File) ale procesorului, utilizate pentru stocarea comună a conținutului registrelor în toate sarcinile de pe același nucleu CPU. Pentru a bloca vulnerabilitatea este necesară actualizarea microcodului și utilizarea instrucțiunii VERW pentru a curăța conținutul bufferelor microarhitecturale în momentul întoarcerii din nucleu în spațiul utilizatorului. Pentru a activa protecția la pornirea nucleului, se poate specifica flag-ul „reg_file_data_sampling=on”. Informațiile despre expunerea la vulnerabilitate și despre disponibilitatea microcodului necesar pentru protecție pot fi evaluate în fișierul „/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling”.
- A fost adăugată suportul de bază pentru protecția sistemelor gazdă prin intermediul extensiei AMD SEV-SNP (Secure Nested Paging), care asigură o funcționare sigură cu tabelele de pagini de memorie înnăscute și protejează împotriva atacurilor „undeSErVed” și „SEVerity” asupra procesoarelor AMD EPYC, care pot contorna mecanismul de protecție AMD SEV (Secure Encrypted Virtualization). KVM Schimbările necesare pentru utilizarea SNP sunt planificate să fie adăugate în ramura 6.10.
- Modulele cu implementarea tehnologiilor IMA (Integrity Measurement Architecture) și EVM (Extended Verification Module) au fost transferate pe utilizarea framework-ului LSM (Linux Security Modules), ceea ce, fără a pierde funcționalitate, a simplificat semnificativ codul, a unit funcționalitățile duplicate și a utilizat capabilitățile în mod standard disponibile prin LSM. Modulul IMA este destinat verificării integrității componentelor sistemului de operare prin semnături digitale și hash-uri. Modulul EVM permite protejarea atributelor extinse ale fișierelor (xattrs) împotriva atacurilor menite să le compromită integritatea (EVM nu va permite efectarea unui atac offline în care un intrus poate modifica metadatele, de exemplu, pornescând de pe unitatea sa de stocare).
- Au fost revizuite pentru o mai bună compatibilitate cu mediile pe 32 de biți apelurile de sistem lsm_list_modules(), lsm_get_self_attr() și lsm_set_self_attr(), destinate afișării listei modulelor LSM (Linux Security Modules) încărcate și obținerii/setării atributelor modulului LSM. Schimbarea încalcă compatibilitatea cu versiunile anterioare, dar deoarece noile apeluri de sistem au fost adăugate în ultimul release al nucleului și nu sunt încă utilizate în aplicații, Linus Torvalds a considerat că modificarea este acceptabilă.
- A fost făcută o încercare de reluare a utilizării mecanismului UBSAN (Undefined Behavior Sanitizer). Problema constă în faptul că compilatoarele tratează diferit depășirile de capacitate ale tipurilor întregi semnate și nesemnate. Depășirile semnate și depășirile de pointere fac parte din categoria comportamentului nedefinit, în timp ce depășirile nesemnate sunt tăiate modulo 2n, păstrând doar cei mai puțini biți ai rezultatului („wrap-around”) și nu se încadrează în comportamentul nedefinit. Pentru a exclude situațiile de apariție a comportamentului nedefinit, nucleul este compilat cu opțiunea „-fno-strict-overflow”, care duce la utilizarea „wrap-around” pentru toate depășirile de capacitate întregi. GCC și Clang nu pot diagnostica corect unele probleme atunci când se folosește flag-ul „-fno-strict-overflow”, iar activarea UBSAN are ca scop desfășurarea unei colaborări cu dezvoltatorii de compilatoare pentru a elimina falsurile pozitive și a identifica depășirile de capacitate în locuri care nu au verificări explicite.
Pentru a verifica posibilele depășiri în nucleu se folosesc construcții de tipul „var + offset PAGE_SHIFT) < pgoff){..}”), care sunt legate de compilarea cu flag-ul „-fno-strict-overflow” și nu acoperă tot codul în care ar putea apărea potențial o depășire. Problema este că, atunci când se folosește UBSAN, astfel de verificări au dus la emiterea unui număr mare de avertismente false, iar din acest motiv în 2021 UBSAN a trebuit să fie dezactivat. În implementarea actualizată, s-a propus să se utilizeze anumite adnotări __signed_wrap și __unsigned_wrap, precum și macro-uri gata pregătite cu verificările add_would_overflow(a, b) și add_wrap(a, b), care permit separarea utilizării prevăzute de dezvoltatori a depășirilor de capacitate întregi de apariția depășirilor accidentale, care pot conduce la vulnerabilități. Propunerea unei reforme mai ample a nucleului prin introducerea unor definiții suplimentare de tipuri a fost respinsă de Linus Torvalds.
- Subsystema de rețea
- În subsystema de rețea s-au realizat lucrări pentru reducerea apariției blocajelor concurente („lock contention”, încercarea de a obține un blocaj deținut de un alt fir). S-au redus utilizările blocajelor RTNL.
- A fost adăugată opțiunea de a activa suportul pentru busy polling în contextul apelurilor epoll. Dimensiunea pool-ului și parametrii bugetului pot fi setați separat de parametrii sistemului prestabiliți.
- Structura net_hotdata a fost implementată pentru a îmbunătăți eficiența caching-ului celor mai utilizate variabile de configurare a rețelei.
- În MPTCP a fost adăugat suportul pentru setarea opțiunii TCP_NOTSENT_LOWAT pentru socket-uri, permițând limitarea dimensiunii buffer-ului de trimitere. În API-ul pentru socket-uri MCTP a fost adăugat suport pentru identificatorii de rețea, care permit utilizarea mai multor rețele MCTP neintersectante pe un singur gazd.
- În IPSec a fost adăugat suportul pentru redirecționarea mesajelor ICMP cu informații de eroare (RFC 4301).
- Procesul de scanare a rutelor cu timp de viață expirat a fost accelerat.
- Funcționarea XDP a fost accelerată, datorită evitării mai stricte a alocării unor blocuri mari de memorie.
- A fost adăugată opțiunea de a adăuga metadate la mesajele netconsole.
- În Netfilter, s-a permis definirea din spațiul utilizatorului a unor tabele care se leagă de un proces de fundal de control și care nu sunt șterse automat după terminarea aplicației utilizatorului.
- În nftables, adăugarea elementelor în set-uri cu intervale unite a fost accelerată.
- Echipament
- În driverul i915, s-a continuat munca de implementare a suportului pentru chip-urile Intel LunarLake (Xe 2). Au fost adăugate noi identificatori PCI pentru dispozitive bazate pe chip-uri Intel Arrow Lake și Alder Lake N. Pentru DisplayPort, a fost adăugat suportul pentru tunelarea DP și alocarea lățimii de bandă. Pentru toate platformele, s-a activat modul fastboot. A fost adăugat suportul pentru ieșirea de depanare legată de dispozitive specifice.
- În driverul AMDGPU, s-a realizat pregătirea pentru implementarea suportului GPU AMD RDNA3.5 și RDNA4. A fost adăugat suport pentru 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 și framework-ul RAS ACA. În modulul kernel-ului a fost adăugat parametrul freesync_video pentru activarea suportului experimental pentru optimizarea comutării între modurile video utilizând tehnologia de sincronizare adaptivă FreeSync.
- În driverul Nouveau, codul de control al ecranului a fost transformat pentru a folosi funcția kmemdup().
- S-a continuat lucrul la driverul drm (Direct Rendering Manager) Xe pentru GPU bazat pe arhitectura Intel Xe, care este utilizat în plăcile grafice Intel din familia Arc și în grafica integrată, începând cu procesoarele Tiger Lake.
- A fost adăugat driverul DRM pentru cipurile Mediatek MT8188 VDOSYS1.
- Setările corelative cu subsistemele video au fost mutate în secțiunea CONFIG_VIDEO.
- A fost adăugată suportul pentru SoC-uri ARM64: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
- A fost adăugat suportul pentru plăci și dispozitive ARM: telefoane Android bazate pe cipul Tegra30, modele Chromebook bazate pe Mediatek MT8186, NAS, tablete și console de jocuri bazate pe Rockchips RK35xx, plăci White Hawk bazate pe SoC Renesas, plăci bazate pe Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
- A fost realizat un refactoring al codului subsistemului audio ALSA. A fost adăugată suportul pentru sistemele audio Microchip SAM9x7, NXP i.MX95 și Qualcomm WCD939x. În driverul SoundWire a fost adăugată suportul ASoC cu coprocesoarele audio AMD ACP 6.3, iar pentru sistemele Intel a fost implementat modul DSPless. A fost adăugată suportul pentru codec-uri audio suplimentare Cirrus HD. În driverul virtio a fost îmbunătățită gestionarea dispozitivelor audio.
- A fost adăugat suportul pentru controlerele Ethernet Marvell Octeon PCI Endpoint NIC VF și Intel E825-C 100G.
Între timp, Fondul Latino-American pentru Software Liber a format o variantă complet liberă a nucleului 6.9 — Linux-libre 6.9-gnu, curățată de elemente de firmware și drivere care conțin componente nesigure sau părți de cod a căror utilizare este limitată de producător. În versiunea 6.9 a fost actualizat codul de curățare a blob-urilor în driverele amdgpu, ath12k, adreno, btusb și r8169. A fost efectuată curățarea noului driver ptp_fc3. A avut loc curățarea numelui blob-urilor în fișierele dts (devicetree) pentru arhitectura Aarch64. Au fost eliminate problemele cu curățarea driverului i915, care provocau blocaje în timpul inițializării. Au fost efectuate modificări legate de procesarea blob-urilor livrate sub formă de dump-uri în hexazecimal.
Sursa: opennet.ro
