Po dvou měsících vývoje Linus Torvalds představil uvolnění jádra Linux 6.9. Mezi nejvýznamnějšími změnami je modul dm-vdo pro deduplikaci a kompresi blokových zařízení, režim přístupu k souborům v FUSE, podpora vytváření pidfd pro jednotlivé vlákna, mechanismus BPF-tokenů, podpora Rustu na systémech ARM64, převedení FS Ext2 do kategorie zastaralých, odstranění starého ovladače NTFS a podpora mechanismu Intel FRED.
Nová verze obsahuje 15680 oprav od 2106 vývojářů, velikost patchů činí 54 MB (změny zasáhly 11825 souborů, přidáno 687954 řádků kódu, odstraněno 225344 řádků). V minulém vydání bylo 15641 oprava od 2018 vývojářů, velikost patchů byla 44 MB. Přibližně 42 % všech prezentovaných změn v 6.9 se týká ovladačů zařízení, asi 17 % změn se vztahuje na aktualizaci kódu specifického pro hardwarové architektury, 13 % souvisí se síťovým stackem, 7 % s filesystémy a 4 % s vnitřními subsystémy jádra.
Hlavní novinky v jádru 6.9:
- Diskový subsystém, vstup/výstup a souborové systémy
- Do Device Mapper (DM) byl přidán nový zpracovatel dm-vdo (virtual data optimizer), který umožňuje na základě existujících blokových zařízení implementovat virtuální blokové zařízení disponující takovými možnostmi, jako je deduplikace opakovaných dat, komprese dat, vyloučení prázdných bloků a zvyšování velikosti blokového zařízení podle potřeby (thin provisioning). Tyto možnosti jsou realizovány na úrovni blokového zařízení a nezávisí na používaném filesystému (například pomocí dm-vdo lze implementovat automatické spojení duplicitních dat a uchování informací v komprimované podobě pro jakýkoli FS). Podporuje se použití dm-vdo pro fyzická úložiště o velikosti až 256 TB a vytváření logických objemů o velikosti až 4 PB. Pro správu oddílů vdo se doporučuje používat lvm. Technologie VDO byla vyvinuta společností Permabit a byla otevřena po jejím převzetí firmou Red Hat v roce 2017.
- V subsystému FUSE, používaném pro implementaci souborových systémů v uživatelském prostoru, byla přidána počáteční implementace režimu „passthrough“, která umožňuje přímo na úrovni jádra získávat data souborů, a to bez zásahu procesu běžícího v uživatelském prostoru, což v některých situacích může výrazně zvýšit výkon. Například FUSE-implementace FS fungující v režimu pouze pro čtení a omezující přístup k souborům mohou poskytovat obsah souborů z původního FS bez jeho předání do procesu FUSE.
- Do kategorie zastaralých (deprecated) byl převeden ovladač s implementací souborového systému Ext2. Jako důvod je uvedena podpora pouze 32bitových časových čítačů v inode, které se přeplní 19. ledna 2038. Místo ovladače ext2 se doporučuje používat ovladač ext4, který podporuje práci s souborovým systémem Ext2 a je s ním plně kompatibilní, avšak může využívat v ext2 oddílech časové značky, které nejsou vystaveny problému 2038, pokud byl FS vytvořen s inode větším než 255 bajtů (ve ovladači ext2 byly 32bitové časové čítače používané bez ohledu na velikost inode).
- Byl odstraněn starý ovladač souborového systému NTFS, kterého se od vydání 5.15 ujme nový ovladač NTFS3. Dodávka dvou ovladačů s implementací NTFS v jádře byla považována za nevhodnou, vzhledem k tomu, že starý ovladač nebyl aktualizován již mnoho let, je v žalostném stavu a může fungovat pouze v režimu čtení.
- Do souborových systémů zonefs a hugetlbfs byla přidána podpora 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 v připojeném cizím oddílu k jinému uživateli v aktuálním systému.
- Pro administrátory byla v NFSv4 poskytnuta možnost vymazání otvorových a blokovacích stavů souborů.
- Pro souborový systém Ext4 se zaznamenávají pouze opravy chyb a aktualizace kunit testů.
- V Btrfs pokračuje převod funkcí na používání svazků paměti (page folios).
- V souborovém systému XFS bylo pokračováno v práci na implementaci možnosti využití nástroje fsck pro kontrolu a opravu zjištěných problémů v online režimu, bez potřeby odpojení souborového systému.
- Do systémového volání pwritev2() byl přidán příznak RWF_NOAPPEND, který umožňuje specifikovat offset pro zápis, i když byl soubor otevřen v režimu pouze pro přidávání dat na konec souboru.
- Byly přidány nové ioctl příkazy: FS_IOC_GETUUID — vrací UUID identifikátor daného souborového systému, a FS_IOC_GETFSSYSFSPATH — určuje umístění v /sys/fs pro daný připojený FS.
- Soubory systémů efs, qnx4 a coda byly převedeny na používání nového API pro montáž oddílů.
- Byla vylepšena implementace operací se soubory prováděných v režimu bez ohledu na velikost písmen. Výkon byl zlepšen prováděním porovnání pro začátek s ohledem na velikost písmen a zpětným přechodem na bezohledné vyhledávání. Byly vyřešeny problémy při montáži overlayfs na adresáře, které mají nastavený režim bez ohledu na velikost písmen.
- Paměť a systémové služby
- Byla implementována podpora mechanismu Intel FRED (Flexible Return and Event Delivery), vytvořeného pro zvýšení efektivity a spolehlivosti přenosu informací o nízkoúrovňových událostech ve srovnání se současným mechanismem IDT (Interrupt Descriptor Table). Zlepšení výkonu a snížení latencí je zajištěno návratem událostí procesorovým pokynem IRET místo přenosu událostí prostřednictvím tabulky IDT. Zvýšení spolehlivosti je dosaženo díky oddělenému zpracování příchozí události v kontextu jádra a kontextu uživatele, ochraně před vnořeným prováděním NMI a uchovávání v rozšířeném rámci zásobníku všech spojených s výjimkou registrů CPU.
- Byla přidána možnost optimalizace přístupu k datům jednotlivých jader CPU prostřednictvím využití v kódu jádra pojmenovaných adresních prostorů (Named Address Spaces), realizovaných v GCC ve formě rozšíření GNU C.
- Do funkce pidfd_open() byl přidán příznak PIDFD_THREAD, který umožňuje vytvářet pidfd pro jednotlivé vláknové procesy, a ne pouze používat pidfd v kontextu lídra skupiny vláken. Byla také navržena implementace pseudo-FS pro přístup k pidfd prostřednictvím virtuální souborové systému. Na rozdíl od identifikace procesů pomocí pid, identifikátor pidfd je vázán na konkrétní proces a nemění se, zatímco PID po ukončení aktuálního procesu může být přidělen jinému procesu.
- Do subsystémy BPF byl přidán mechanismus BPF tokenů, který umožňuje selektivně delegovat programům práva přístupu k privilegovaným operacím BPF. Například je možné poskytnout neprivilegované aplikaci přístup k jednotlivým subsystémům BPF bez udělení plných práv CAP_BPF.
- Do subsystémy BPF byl přidán nový typ sdílené paměti bpf_arena, která definuje oblast dostupnou pro sdílení mezi programy BPF a procesy ve virtuálním prostoru. Byla přidána instrukce may_goto, která umožňuje organizovat práci cyklů, které mohou být přerušeny verifikátorem. Přidána možnost generování libovolných TCP SYN cookie z programů BPF a vytvoření BPF handlerů pro boj proti SYN floodům.
- Pokračuje převod změn z větve Rust-for-Linux, které se týkají využití 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 jako povinné závislosti při kompilaci jádra). Přidána podpora jazyka Rust při práci na 64bitových procesorech ARM. Bylo převedeno na verzi Rust 1.76. Přidán makro ‘container_of!’. Místo nestabilní funkčnosti ‘ptr_metadata’ byla využita stabilní metoda ‘byte_sub’. Přidán modul ‘time’ s funkcí převodu času ‘msecs_to_jiffies()’.
- Do subsystémy io_uring byla přidána možnost zkrácení souborů (ftruncate_file).
- Byl přidán nový typ pracovních front WQ_BH (workqueue Bottom Halves) pro asynchronní vykonávání kódu v kontextu softwarových přerušení, zaměřený na využití místo zastaralých taskletů.
- Byla výrazně přepracována subsystém pro práci s časovačem, ve kterém byla vylepšena logika výběru aktivního jádra CPU pro provádění spuštěného časovače, aby se neprobouzela neaktivní jádra.
- Byla implementována možnost aktualizace modelu spotřeby energie jádra (EM, Energy Model) během provozu, což může být využito například k zohlednění vlivu pracovní teploty na energetickou účinnost CPU. Výrazně byla zvýšena výkonnost funkce em_cpu_energy(), která v testech na stacionárním systému nyní běží 1,43krát rychleji, a v testu na desce RockPi 4B pak 1,69krát rychleji.
- Byla přidána podpora pro spuštění systémů založených na architektuře ARM64 v režimu LPA2 s 52bitovým virtuálním adresovým prostorem.
- Pro systémy ARM64 byla implementována podpora pro kontinuální záznamy PTE (Page Table Entry), což zvyšuje výkon díky efektivnějšímu využití TLB (Translation Lookaside Buffer).
- Byly přijaty patche pro zlepšení výkonu subsystému správy paměti snížením výskytu konkurenčních zablokování ve vmalloc().
- Pro architekturu LoongArch byl implementován mechanismus živého patchování jádra (live patching), který umožňuje aplikaci oprav na jádro bez restartu.
- Pro systémy RISC-V byla implementována podpora systémového volání membarrier(), které zajišťuje nastavení bariér na paměť pro aktivní vlákna v systému.
- Byly zvýšeny požadavky na verzi LLVM/Clang, kterou lze použít pro sestavení jádra. Nyní je pro sestavení vyžadována alespoň verze LLVM 13.0.1 (dříve bylo možné sestavovat i s LLVM 11+).
- Do mechanismu „User trace events“, který umožňuje vytvářet události sledování z uživatelských procesů pro sledování aktivity v uživatelském prostoru, byla přidána podpora pro export informací o události v různých formátech (USER_EVENT_REG_MULTI_FORMAT).
- Do mechanismu sledování volání funkcí byla přidána možnost sledování stavu vstupních argumentů funkce při sledování výstupu z funkce. Hodnoty operátoru return nyní lze porovnat s argumenty použitými při volání funkce.
- Do utility perf byla přidána podpora pro agregovaný režim výstupu „cluster“ („perf stat -a —per-cluster“) pro slučování statistik sdílených zdrojů. Byla implementována možnost využití knihovny libcapstone pro disassemblaci procesorových instrukcí („perf script -F disasm“). Byla provedena optimalizace využití paměti při vykonávání příkazů perf report a perf annotate.
- Virtualizace a bezpečnost
- Byla přidána ochrana proti zranitelnosti RFDS (Register File Data Sampling) v procesorech Intel Atom, která umožňuje extrahovat zbytkové informace z registrů (RF, Register File) procesoru, jež se používají pro společné ukládání obsahu registrů ve všech úlohách na stejném jádru CPU. K blokaci zranitelnosti je zapotřebí aktualizace mikrocode a použití instrukce VERW k vyčištění obsahu mikroarchitektonických bufferů v okamžiku návratu z jádra do uživatelského prostoru. Pro aktivaci ochrany při zavádění jádra lze uvést přepínač „reg_file_data_sampling=on“. Informace o zranitelnosti a dostupnosti potřebné ochrany mikrocode lze vyhodnotit v souboru „/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling“.
- Byla přidána základní podpora ochrany hostitelských systémů pomocí rozšíření AMD SEV-SNP (Secure Nested Paging), které zajišťuje bezpečný provoz s vnořenými stránkovacími tabulkami a chrání před útoky „undeSErVed“ a „SEVerity“ na procesorech AMD EPYC, které umožňují obcházet ochranný mechanismus AMD SEV (Secure Encrypted Virtualization). KVM Nezbytné úpravy pro použití SNP se plánují přidat ve větvi 6.10.
- Moduly s implementací technologií IMA (Integrity Measurement Architecture) a EVM (Extended Verification Module) byly převedeny na použití rámce LSM (Linux Security Modules), což bez ztráty funkčnosti umožnilo výrazné zjednodušení kódu, sloučení duplicitní funkčnosti a využití dostupných typových možností prostřednictvím LSM. Modul IMA je určen k ověřování integrity komponent operačního systému podle digitálních podpisů a hashů. Modul EVM umožňuje chránit rozšířené atributy souborů (xattrs) před útoky, které by mohly narušit jejich integritu (EVM neumožní offline útok, při němž by útočník mohl měnit metadata, například nasazením z vlastního zařízení).
- Systémové volání lsm_list_modules(), lsm_get_self_attr() a lsm_set_self_attr() byly přepracovány pro lepší kompatibilitu s 32bitovými prostředími, jsou určeny k výpisu seznamu načtených modulů LSM (Linux Security Modules) a k získání/nastavení atributů modulu LSM. Změna porušuje zpětnou kompatibilitu, ale protože nové systémové volání byla přidána v minulém vydání jádra a zatím nejsou používána v aplikacích, Linus Torvalds považoval tuto změnu za přijatelnou.
- Bylo podniknuto pokusy o obnovení používání mechanismu UBSAN (Undefined Behavior Sanitizer). Podstatou problému je, že kompilátory různě zpracovávají celočíselná přetečení podepsaných a nepodepsaných typů. Podepsaná přetečení a přetečení ukazatelů patří do kategorie nejednoznačného chování, zatímco nepodepsaná přetečení jsou odsekávána modulo 2n se zachováním pouze nejnižších bitů výsledku („wrap-around“) a nespadá pod nejednoznačné chování. Aby se vyloučily situace s vznikem nejednoznačného chování, jádro je sestaveno s volbou „-fno-strict-overflow“, která vede k použití „wrap-around“ pro všechna celočíselná přetečení. GCC a Clang nemohou správně diagnostikovat některé problémy při použití flagu „-fno-strict-overflow“ a zapnutí UBSAN je zaměřeno na provedení společné práce s vývojáři kompilátorů na odstranění vznikajících falešných poplachů a identifikaci celočíselných přetečení na místech, kde chybí výslovné kontroly.
Pro kontrolu možných přetečení v jádře se používají konstrukce jako „var + offset PAGE_SHIFT) < pgoff) {..}“), které jsou vázány na sestavení s flagem „-fno-strict-overflow“ a nezahrnují celý kód, ve kterém může potenciálně vzniknout přetečení. Problém spočívá v tom, že při používání UBSAN tyto kontroly vedly k výstupu velkého počtu falešných varování, a proto muselo být v roce 2021 UBSAN vypnuto. V aktualizované implementaci je navrženo použít speciální anotace __signed_wrap a __unsigned_wrap, stejně jako hotové makro s kontrolami add_would_overflow(a, b) a add_wrap(a, b), které umožňují oddělit zamýšlené použití celočíselných přetečení od náhodných přetečení, která mohou vést k zranitelnostem. Návrh na rozsáhlou přepracování jádra s zavedením dodatečných definic typů byl zamítnut Linusem Torvaldsem.
- Síťová subsystém
- V síťovém subsystému byly provedeny kroky ke snížení výskytu soutěžních zámků („lock contention“, pokus o získání zámku drženého jiným vláknem). Používání zámků RTNL bylo omezeno.
- Byla přidána možnost aktivního polling socketů (busy polling) v kontextu jednotlivých volání epoll. Velikost poolu a parametry rozpočtu mohou být nastaveny nezávisle na systémových výchozích parametrech.
- Byla implementována struktura net_hotdata pro zvýšení efektivity cacheování nejčastěji používaných proměnných síťové konfigurace.
- V MPTCP byla přidána podpora nastavení pro sockety pro možnost TCP_NOTSENT_LOWAT, která umožňuje omezit velikost odesílacího bufferu. V API pro sockety MCTP byla přidána podpora identifikátorů sítí ('network ID'), což umožňuje používat na jednom hostu několik nekorespondujících sítí MCTP.
- V IPSec byla přidána podpora přesměrování ICMP zpráv s informacemi o chybách (RFC 4301).
- Byl urychlen proces skenování tras s vypršelou životností.
- Byla urychlena práce XDP díky přísnějšímu vyhýbání se alokaci velkých bloků paměti.
- Byla přidána možnost připojení metadat k zprávám netconsole.
- V Netfilter bylo povoleno definování z uživatelského prostoru tabulek, které se vážou na ovládací proces na pozadí a po ukončení uživatelské aplikace se automaticky nezruší.
- V nftables byl urychlen proces přidávání prvků do setů se sloučenými rozsahy.
- Hardware
- V ovladači i915 pokračovala práce na implementaci podpory čipů Intel LunarLake (Xe 2). Byly přidány nové PCI identifikátory pro zařízení založená na čipech Intel Arrow Lake a Alder Lake N. Pro DisplayPort byla přidána podpora tunelování (DP tunneling) a přidělování šířky pásma (bandwidth allocation). Pro všechny platformy byl zapnut režim fastboot. Byla přidána podpora ladicího výstupu vázaného k jednotlivým zařízením.
- V ovladači AMDGPU byla provedena příprava na implementaci podpory GPU AMD RDNA3.5 a RDNA4. Byla přidána podpora 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 a rámce RAS ACA. Přidán parametr freesync_video pro zapnutí experimentální podpory optimalizace přepínání video režimů pomocí technologie adaptivní synchronizace FreeSync.
- V ovladači Nouveau byl kód pro správu obrazovky převeden na použití funkce kmemdup().
- Pokračuje práce na drm ovladači (Direct Rendering Manager) Xe pro GPU založené na architektuře Intel Xe, který se používá ve grafických kartách Intel rodiny Arc a integrované grafice, počínaje procesory Tiger Lake.
- Byl přidán DRM ovladač pro čipy Mediatek MT8188 VDOSYS1.
- Nastavení související s video subsystémy byla přesunuta do sekce CONFIG_VIDEO.
- Byla přidána podpora ARM64 SoC: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
- Byla přidána podpora ARM platforem a zařízení: Android telefony založené na čipu Tegra30, modely Chromebook na bázi Mediatek MT8186, NAS, tablety a herní konzole na bázi Rockchips RK35xx, desky White Hawk na bázi SoC Renesas, desky na bázi Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
- Byla provedena refaktorizace kódu zvukového subsystému ALSA. Přidána podpora zvukových systémů Microchip SAM9x7, NXP i.MX95 a Qualcomm WCD939x. V ovladači SoundWire byla přidána podpora ASoC se zvukovými koprocesory AMD ACP 6.3, a pro systémy Intel byl realizován režim DSPless. Byla přidána podpora dalších zvukových kodeků Cirrus HD. V ovladači virtio bylo zlepšeno řízení zvukových zařízení.
- Byla přidána podpora Ethernetových řadičů Marvell Octeon PCI Endpoint NIC VF a Intel E825-C 100G.
Současně latinskoamerická Nadace svobodného softwaru představila verzi zcela svobodného jádra 6.9 — Linux-libre 6.9-gnu, očištěného od prvků firmwaru a ovladačů, které obsahují nesvobodné komponenty nebo části kódu, jejichž použití je omezeno výrobcem. V vydání 6.9 byl aktualizován kód pro čištění blobů v ovladačích amdgpu, ath12k, adreno, btusb a r8169. Bylo provedeno čištění nového ovladače ptp_fc3. Bylo provedeno čištění názvů blobů v dts souborech (devicetree) pro architekturu Aarch64. Byly odstraněny problémy s čištěním ovladače i915, které vedly k zaseknutí při inicializaci. Byly provedeny změny související s zpracováním blobů dodávaných ve formě hexadecimálních dumpů.
Zdroj: opennet.ru
