Po dvou měsících vývoje představil Linus Torvalds vydání jádra Linux 6.2. Mezi nejvýraznějšími změnami je povolení příjmu kódu pod licencí Copyleft-Next, zlepšení implementace RAID5/6 v Btrfs, pokračující integrace podpory jazyka Rust, snížení režijních nákladů při ochraně proti útokům Retbleed, přidání možnosti regulace spotřeby paměti při zpětném zápisu, přidání mechanismu vyvažování zátěže PLB (Protective Load Balancing) pro TCP, přidání hybridního mechanismu ochrany toku provádění příkazů (FineIBT), v BPF byla přidána možnost definice vlastních objektů a datových struktur, do sestavy byla přidána utilita rv (Runtime Verification), a byla snížena spotřeba energie v implementacích zámků RCU.
Do nové verze bylo přijato 16843 oprav od 2178 vývojářů, velikost patche je 62 MB (změny se dotkly 14108 souborů, přidáno 730195 řádků kódu, odstraněno 409485 řádků). Přibližně 42 % ze všech uvedených změn v 6.2 se týká ovladačů zařízení, asi 16 % změn se vztahuje na aktualizaci kódu specifičného pro hardwarové architektury, 12 % souvisí s síťovým stackem, 4 % s файловými системами a 3 % s vnitřními podsystemy jádra.
Hlavní novinky v jádře 6.2:
- Paměť a systémové služby
- Povoleno zahrnout do jádra kód a změny dodané pod licencí Copyleft-Next 0.3.1. Licence Copyleft-Next byla vytvořena jedním z autorů GPLv3 a je plně kompatibilní s licencí GPLv2, což bylo potvrzeno právníky společností SUSE a Red Hat. Ve srovnání s GPLv2 je licence Copyleft-Next výrazně kompaktnější a snadněji pochopitelná (úvodní část a zmínka o zastaralých kompromisech byly odstraněny), vymezuje lhůty a postupy pro odstranění porušení, automaticky odstraňuje copyleftové požadavky pro zastaralé kódy, které mají více než 15 let.
Copyleft-Next také obsahuje ustanovení o poskytování práv na patentované technologie, což, na rozdíl od GPLv2, činí tuto licenci kompatibilní s licencí Apache 2.0. Aby byla zajištěna plná kompatibilita s GPLv2, je v textu Copyleft-Next výslovně uvedeno, že odvozené dílo může být dodáváno nejen pod původní licencí Copyleft-Next, ale také pod licencí GPL.
- Nástroje obsahuje utilitu „rv“, která poskytuje rozhraní pro interakci z uživatelského prostoru s obsluhou subsystému RV (Runtime Verification), určenou k ověřování správnosti fungování vysoce spolehlivých systémů, zaručujících absenci poruch. Ověření probíhá během běhu aplikace připojením obsluhy k sledovacím bodům, které porovnávají skutečný průběh vykonávání s předem definovaným referenčním deterministickým modelem automatu, který určuje očekávané chování systému.
- Zařízení zRAM, které umožňuje ukládat stránkovací prostor do paměti ve zkomprimované podobě (v paměti se vytváří blokové zařízení, na které se provádí swapping se zhuštěním), implementuje možnost přeabalování stránek s využitím alternativního algoritmu pro dosažení vyšší úrovně zhuštění. Hlavní myšlenkou je nabídnout výběr mezi několika algoritmy (lzo, lzo-rle, lz4, lz4hc, zstd), které nabízejí své kompromisy mezi rychlostí komprese/dekomprese a úrovní zhuštění, nebo optimální pro konkrétní situace (např. pro kompresi velkých paměťových stránek).
- Bylo přidáno API „iommufd“ pro správu systému správy paměti I/O z uživatelského prostoru – IOMMU (I/O Memory-Management Unit). Nové API umožňuje spravovat tabulky stránek paměti I/O pomocí deskriptorů souborů.
- V BPF byla přidána možnost vytváření typů, definování vlastních objektů, budování vlastní hierarchie objektů a flexibilní strukturování vlastních datových struktur, jako jsou propojené seznamy. Pro dočasně přecházející do režimu spánku BPF-programy (BPF_F_SLEEPABLE) byla přidána podpora zámků bpf_rcu_read_{,un}lock(). Implementována podpora ukládání objektů task_struct. Přidán mapový typ BPF_MAP_TYPE_CGRP_STORAGE, poskytující místní úložiště pro cgroups.
- Pro mechanizmus zámků RCU (Read-copy-update) byl implementován volitelný mechanismus „líných“ callback-volání, v němž je podle časovače v dávkovém režimu najednou zpracováno několik callback-volání. Použití navrhované optimalizace umožňuje snížit energetickou spotřebu na zařízeních Android a ChromeOS o 5-10 % tím, že se RCU-žádosti odkládají během nečinnosti nebo nízkého zatížení systému.
- Byl přidán sysctl split_lock_mitigate pro řízení reakce systému na detekované rozdělené zámky („split lock“), které nastávají při přístupu k nevyrovnaným datům v paměti kvůli tomu, že při vykonávání atomické instrukce data překračují dvě cache linie CPU. Takové zámky vedou k výraznému poklesu výkonu. Při nastavení hodnoty 0 pro split_lock_mitigate se pouze zobrazí varování o existenci problému, a při nastavení hodnoty 1 se kromě varování také zpomalí vykonávání procesu, který zámek způsobil, aby se zachoval výkon zbylé části systému.
- Pro architekturu PowerPC byla navržena nová implementace zámků qspinlock, která vykazuje vyšší výkon a řeší některé problémy se zámky, které vznikají ve výjimečných případech.
- Byl přepracován kód pro zpracování přerušení MSI (Message-Signaled Interrupts), ve kterém byly odstraněny akumulované architektonické problémy a přidána podpora pro přiřazení jednotlivých zpracovatelů různým zařízením.
- Pro systémy založené na architektuře sada příkazů LoongArch, používané v procesorech Loongson 3 5000 a implementující nový RISC ISA podobný MIPS a RISC-V, byla zavedena podpora ftrace, ochrany zásobníku, spícího a čekajícího režimu.
- Byla poskytnuta možnost přiřazení názvů oblastem sdílené anonymní paměti (dříve bylo možné názvy přiřazovat pouze soukromé anonymní paměti spojené s konkrétním procesem).
- Byl přidán nový parametr příkazové řádky jádra „trace_trigger“, určený k aktivaci spouštěče trasování, který se používá k přiřazení podmínkových příkazů vyvolaných při spuštění kontrolní kontroly (například trace_trigger=„sched_switch.stacktrace if prev_state == 2“).
- Byly zvýšeny požadavky na verzi balíčku binutils. Pro sestavení jádra je nyní vyžadováno minimálně binutils 2.25.
- Při vyvolání exec() byla přidána možnost umístit proces do časového prostoru (time namespace), ve kterém se čas liší od systémového.
- Byl zahájen převod z větve Rust-for-Linux další funkčnosti související s použitím jazyka Rust jako druhého jazyka pro vývoj ovladačů a modulů jádra. Podpora Rust není ve výchozím nastavení aktivní a nezpůsobuje zahrnutí Rust do povinných závislostí sestavení jádra. Navrhovaná základní funkčnost v předchozím vydání byla rozšířena o možnosti pro podporu nízkoúrovňového kódu, jako jsou typ Vec a makra pr_debug!(), pr_cont!() a pr_alert!(), stejně jako procedurální makro „#[vtable]“, které usnadňuje práci s tabulkami ukazatelů na funkce. Přidání vysoceúrovňových Rust obalů nad subsystémy jádra, které umožní vytváření plnohodnotných ovladačů v Rustu, se očekává v příštích vydáních.
- Používaný typ „char“ v jádře je nyní pro všechny architektury ve výchozím nastavení deklarován jako bezznaménkový.
- Byl prohlášen za zastaralý mechanismus rozdělení paměti slab - SLOB (slab allocator), který byl navržen pro systémy s malým množstvím paměti. Místo SLOB se za běžných podmínek doporučuje používat SLUB nebo SLAB. Pro systémy s malým množstvím paměti se doporučuje používat SLUB v režimu SLUB_TINY.
- Povoleno zahrnout do jádra kód a změny dodané pod licencí Copyleft-Next 0.3.1. Licence Copyleft-Next byla vytvořena jedním z autorů GPLv3 a je plně kompatibilní s licencí GPLv2, což bylo potvrzeno právníky společností SUSE a Red Hat. Ve srovnání s GPLv2 je licence Copyleft-Next výrazně kompaktnější a snadněji pochopitelná (úvodní část a zmínka o zastaralých kompromisech byly odstraněny), vymezuje lhůty a postupy pro odstranění porušení, automaticky odstraňuje copyleftové požadavky pro zastaralé kódy, které mají více než 15 let.
- Diskový subsystém, vstup/výstup a souborové systémy
- Do Btrfs byly přidány vylepšení zaměřená na opravu problému „write hole“ v implementaci RAID 5/6 (pokus o obnovení RAID, pokud dojde k havárii během zápisu a není možné určit, který blok byl na kterém zařízení RAID zapsán správně, což může vést k poškození bloků odpovídajících nezapsaným blokům). Dále je pro SSD nyní pokud možno ve výchozím nastavení automaticky aktivováno asynchronní provádění operace „discard“, což umožňuje dosáhnout vyšší výkonnosti díky efektivnímu seskupování operací „discard“ do fronty a zpracování fronty na pozadí. Byla zlepšena výkonnost operací send a lseek, stejně jako ioctl FIEMAP.
- Byly rozšířeny možnosti správy zpožděného zápisu (writeback, pozadí ukládání změněných dat) pro bloková zařízení. V některých situacích, například při používání síťových blokových zařízení nebo USB flash disků, může zpožděný zápis způsobit vysokou spotřebu operační paměti. Aby bylo možné řídit chování zpožděného zápisu a udržet velikost stránkového cache v určitých mezích v sysfs (\/sys\/class\/bdi\/), byly navrženy nové parametry strict_limit, min_bytes, max_bytes, min_ratio_fine a max_ratio_fine.
- V souborovém systému F2FS byla implementována ioctl operace atomární výměny, která umožňuje provést zápis dat do souboru v rámci jedné atomární operace. V F2FS byl také přidán blokový cache rozsahů, který pomáhá určit aktivně používaná data nebo data, ke kterým nedošlo k přístupu již dlouho.
- V souborovém systému ext4 je zaznamenáno pouze oprava chyb.
- V souborovém systému ntfs3 byly navrženy nové možnosti montování: "nocase" pro správu citlivosti na velikost písmen v názvech souborů a adresářů; windows_name pro zákaz vytváření názvů souborů obsahujících znaky, které jsou pro OS Windows nepřípustné; hide_dot_files pro správu přiřazení skrytých souborů pro soubory začínající tečkou.
- V souborovém systému Squashfs byla implementována možnost montování "threads=", pomocí které lze určit počet vláken pro paralelizaci operací dekomprese. V Squashfs byla také přidána možnost mapování identifikátorů uživatelů připojených souborových systémů, která se používá pro přiřazení souborů určitého uživatele na připojené cizí části k jinému uživateli v aktuálním systému.
- Byla přepracována implementace seznamů kontrolních přístupů POSIX (POSIX ACL). V nové implementaci byly odstraněny architektonické problémy, zjednodušena údržba kódové základny a bylo využito bezpečnějších datových typů.
- Do subsystému fscrypt, který slouží k transparentnímu šifrování souborů a adresářů, byla přidána podpora šifrovacího algoritmu SM4 (čínský standard GB\/T 32907-2016).
- Byla poskytnuta možnost sestavení jádra bez podpory NFSv2 (v budoucnu plánují podporu NFSv2 zcela ukončit).
- Byla změněna organizace kontroly přístupových práv k zařízením NVMe. Byla poskytnuta možnost čtení a zápisu na zařízení NVMe, pokud má zapisující proces přístup ke speciálnímu souboru zařízení (dříve musel mít proces oprávnění CAP_SYS_ADMIN).
- Byl odstraněn ovladač pro CD/DVD, který byl vyhlášen jako zastaralý v roce 2016.
- Virtualizace a bezpečnost
- Byla implementována nová metoda ochrany proti zranitelnosti Retbleed v procesorech Intel a AMD, která využívá sledování hloubky volání, což není tak pomalé jako dříve používaná ochrana proti Retbleed. Pro aktivaci nového režimu byl navržen parametr příkazového řádku jádra "retbleed=stuff".
- Byl přidán hybridní mechanismus ochrany toku vykonávání příkazů FineIBT, který kombinuje použití hardwarových pokynů Intel IBT (Indirect Branch Tracking) a softwarové ochrany kCFI (kernel Control Flow Integrity) k zablokování porušení normálního pořadí vykonávání (control flow) v důsledku použití exploitů, které mění uložené ukazatele funkcí v paměti. FineIBT povoluje vykonávání na nepřímém skoku pouze v případě skoku na pokyn ENDBR, který je umístěn na začátku funkce. Dále, analogicky k mechanismu kCFI, následuje kontrola hashů, která zaručuje neměnnost ukazatelů.
- Byla přidána omezení pro blokaci útoků manipulujících s generováním stavů "oops", po nichž problematické úkoly končí a stav se obnovuje bez zastavení provozu systému. Při velmi vysokém počtu výskytů stavu "oops" dochází k přetečení počítadla referencí (refcount), což umožňuje využít zranitelnosti způsobené dereferencováním NULL ukazatelů. Pro ochranu před takovými útoky byl do jádra přidán limit na maximální počet výskytů "oops", po překročení kterého jádro iniciuje přechod do stavu "panic" s následným restartem, což neumožní dosáhnout požadovaného počtu iterací potřebných k přetečení refcountu. Ve výchozím nastavení je limit nastaven na 10 tisíc "oops", ale je možné ho změnit pomocí parametru oops_limit.
- Byl přidán konfigurační parametr LEGACY_TIOCSTI a sysctl legacy_tiocsti pro zakázání možnosti zapisování dat do terminálu pomocí ioctl TIOCSTI, protože tato funkčnost může být použita k vkládání libovolných znaků do vstupního bufferu terminálu a simulaci uživatelského vstupu.
- Byl navržen nový typ vnitřních struktur encoded_page, ve kterém se dolní bity ukazatele používají k uchovávání dodatečných informací, které se používají k ochraně před náhodným dereferencováním ukazatele (v případě skutečné potřeby dereferencování je nejprve nutné vyčistit tyto dodatečné bity).
- Na platformě ARM64 byla při zavádění poskytnuta možnost zapnutí a vypnutí softwarové implementace mechanismu Shadow Stack, používaného k ochraně před přepsáním návratové adresy funkce v případě přetečení bufferu na zásobníku (podstata ochrany spočívá v uložení adresy návratu do samostatného "stínového" zásobníku po předání řízení funkci a její vytažení před výstupem z funkce). Podpora jak hardwarové, tak softwarové implementace Shadow Stack v jedné verzi jádra umožňuje použití jednoho jádra na různých ARM systémech, bez ohledu na podporu instrukcí pro ověřování ukazatelů. Zapnutí softwarové implementace se provádí náhradou potřebných instrukcí v kódu během zavádění.
- Byla přidána podpora pro používání na procesorech Intel mechanismu asynchronního upozornění na výstup (asynchronous exit notification), který umožňuje odhalení single-step útoků na kód vykonávaný v enclavech SGX.
- Byl navržen soubor operací, který umožňuje hypervizoru podporovat požadavky z hostitelských systémů Intel TDX (Trusted Domain Extensions).
- Byly odstraněny konfigurační volby jádra RANDOM_TRUST_BOOTLOADER a RANDOM_TRUST_CPU, místo nich by měly být použity odpovídající volby příkazového řádku random.trust_bootloader a random.trust_cpu.
- Do mechanismu Landlock, který omezuje interakci skupiny procesů s vnějším prostředím, byla přidána podpora příznaku LANDLOCK_ACCESS_FS_TRUNCATE, umožňující kontrolovat provádění operací zkracování souborů.
- Síťová subsystém
- Byla přidána podpora PLB (Protective Load Balancing) pro IPv6, což je mechanismus vyvažování zátěže mezi síťovými linkami, zaměřený na snížení bodů přetížení na přepínačích datových center. Úpravou IPv6 Flow Label PLB náhodně mění cesty paketů pro vyrovnání zátěže na porte přepínače. Aby se snížilo přeřazení paketů, je tato operace prováděna, pokud je to možné, po obdobích nečinnosti (idle). Použití PLB v datových centrech Google umožnilo snížit disbalanci zátěže na porte přepínačů v průměru o 60 %, snížit ztrátu paketů o 33 % a snížit latenci o 20 %.
- Byl přidán ovladač pro zařízení MediaTek se podporou Wi-Fi 7 (802.11be).
- Byla přidána podpora 800gigabitových linek.
- Byla přidána možnost přejmenování síťových rozhraní za běhu, bez zastavení provozu.
- Do logovaných zpráv o SYN floodu byla přidána zmínka o IP adrese, na kterou dorazil paket.
- Pro UDP byla implementována možnost použití samostatných hashovacích tabulek pro různé síťové názvové prostory.
- Pro síťové mosty byla implementována podpora metody autentizace MAB (MAC Authentication Bypass).
- Pro protokol CAN (CAN_RAW) byla implementována podpora režimu socketů SO_MARK pro připojení filtrů provozu na základě fwmarku.
- V ipset byla zavedena nová možnost bitmask, která umožňuje nastavit masku založenou na libovolných bitech v IP adrese (například „ipset create set1 hash:ip bitmask 255.128.255.0“).
- V nf_tables byla přidána podpora zpracování vnitřních (inner) hlaviček v tunnelingových paketech.
- Hardware
- Byla přidána podsystem „accel“ s realizací rámce pro akcelerátory výpočtů, které mohou být dodávány jak ve formě samostatných ASIC, tak jako IP bloky uvnitř SoC a GPU. Hlavně jsou tyto akcelerátory zaměřeny na zrychlení řešení úloh strojového učení.
- V ovladači amdgpu byla zahrnuta podpora IP komponent GC, PSP, SMU a NBIO. Pro systémy ARM64 byla zavedena podpora DCN (Display Core Next). Implementace zabezpečeného výstupu na obrazovku byla převedena z používání DCN10 na DCN21 a nyní může být používána při připojení více obrazovek.
- V ovladači i915 (Intel) byla stabilizována podpora diskrétních grafických karet Intel Arc (DG2/Alchemist).
- V ovladači Nouveau byla zavedena podpora GPU NVIDIA GA102 (RTX 30) na základě architektury Ampere. Pro karty nva3 (GT215) byla přidána možnost ovládání podsvícení.
- Byla přidána podpora pro bezdrátové adaptéry na bázi čipů Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) a MediaTek MT7996, Bluetooth rozhraní Broadcom BCM4377/4378/4387, stejně jako Ethernetové řadiče Motorcomm yt8521, NVIDIA Tegra GE.
- Byla přidána podpora ASoC (ALSA System on Chip) pro integrované zvukové čipy HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Byla přidána podpora zvukového rozhraní Focusrite Saffire Pro 40. Byla přidána zvuková kodek Realtek RT1318.
- Byla přidána podpora pro smartphony a tablety Sony (Xperia 10 IV, 5 IV, X a X compact, OnePlus One, 3, 3T a Nord N100, Xiaomi Poco F1 a Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
- Byla přidána podpora pro ARM SoC a desky Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695), SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.
Zároveň latinskoamerický Fond svobodného softwaru vytvořil variantu zcela svobodného jádra 6.2 — Linux-libre 6.2-gnu, očištěného od prvků firmwaru a ovladačů obsahujících nesvobodné komponenty nebo části kódu, jejichž použití je omezeno výrobcem. V nové verzi byla provedena čistka nových blobů v ovladači nouveau. Bylo zakázáno načítání blobů v ovladačích mt7622, mt7996 wi-fi a bcm4377 bluetooth. Byla provedena čistka názvů blobů v dts souborech pro architekturu Aarch64. Byl aktualizován kód pro čistku blobů v různých ovladačích a subsystémech. Čistka ovladače s5k4ecgx byla ukončena, protože byl odstraněn z jádra.
Zdroj: opennet.ru
