Wydanie jądra Linux 6.6

Po dwóch miesiącach pracy Linus Torvalds zaprezentował wydanie jądra Linux 6.6. Wśród najbardziej zauważalnych zmian znajdują się: nowy harmonogram zadań EEVDF; mechanizm „shadow stack” chroniący przed exploitami; wsparcie dla fs-verity w OverlayFS; wdrożenie kwot i xattr w tmpfs; przygotowanie online fsck w XFS; wzmocnione śledzenie eksportu symboli „GPL-only”; obsługa gniazd sieciowych w io_uring; losowość pamięci w kmalloc(); ogłoszenie ReiserFS jako przestarzałego; w Nouveau dodano prymitywy dla sterownika Vulkan NVK.

Nowa wersja zawiera 15291 poprawek od 2058 programistów, rozmiar łatki wynosi 39 MB (zmiany dotknęły 14844 plików, dodano 553359 linii kodu, usunięto 284012 linii). W poprzednim wydaniu znalazło się 14674 poprawek od 2016 programistów, a rozmiar łatki wynosił 78 MB. Około 44% wszystkich zgłoszonych w wersji 6.6 zmian dotyczy sterowników urządzeń, około 17% zmian związanych jest z aktualizacją kodu specyficznego dla architektur sprzętowych, 11% dotyczy stosu sieciowego, 4% — systemów plików, a 3% — z wewnętrznych podsystemów jądra.

Główne nowości w jądrze 6.6:

  • Pamięć i usługi systemowe
    • Wprowadzono nowy harmonogram zadań EEVDF (Earliest Eligible Virtual Deadline First), który zastępuje harmonogram CFS (Completely Fair Scheduler), dostarczany od jądra 2.6.23. Nowy harmonogram przy wyborze następnego procesu do wykonania uwzględnia procesy, które nie otrzymały wystarczającej ilości zasobów procesora lub otrzymały ich zbyt wiele. W pierwszym przypadku wymuszane jest przekazanie zarządzania procesowi, natomiast w drugim odwrotnie — jest opóźniane. Stary harmonogram CFS używał heurystyk i drobnych dostosowań do określenia procesów wymagających szczególnej uwagi, podczas gdy nowy harmonogram śledzi je bardziej wyraźnie i nie wymaga skomplikowanego dostosowania. Zakłada się, że EEVDF pozwoli na zmniejszenie opóźnień w wykonaniu zadań, które sprawiały problemy z planowaniem w CFS.
    • Wprowadzono zmiany w obsłudze wewnętrznych symboli kategorii „GPL-only”, mające na celu utrudnienie korzystania z modułów właścicielskich GPL-layer do omijania ograniczeń dostępu do podsystemów jądra, które dozwalają na dostęp jedynie dla kodu objętego licencją GPL. W funkcji symbol_get() dla modułów właścicielskich zabroniono wyszukiwania symboli oznaczonych jako GPL-only, a odwrotnie, moduły GPL nie będą mogły znajdować symboli eksportowanych przez moduły właścicielskie.
    • Dodano dodatkowe ustawienia kolejki roboczej (unbound workqueue) w celu zwiększenia efektywności ponownego wykorzystania pamięci podręcznej procesora w dużych systemach, które mają wiele pamięci podręcznych trzeciego poziomu (L3). Do jądra dołączono również narzędzie tools/workqueue/wq_dump.py do sprawdzania bieżącej konfiguracji kolejek roboczych.
    • Do podsystemu io_uring dodano początkowe wsparcie dla operacji i poleceń specyficznych dla gniazd sieciowych. Dodano sysctl io_uring_disabled do wyłączania io_uring na poziomie całego systemu. W io_uring znacznie przyspieszono również bezpośrednią obsługę wejścia/wyjścia (Direct I/O) w trybie asynchronicznym. Wzrost przepustowości i zmniejszenie opóźnień podczas wykonywania operacji wejścia-wyjścia po wprowadzeniu zmian sięga 37%.
    • Dla architektury PA-RISC zaimplementowano kompilator JIT dla BPF.
    • Do ustawienia /sys/devices/system/cpu/smt/control dodano wsparcie dla numerycznych parametrów określających liczbę wątków dostępnych dla każdego rdzenia procesora CPU (wcześniej wspierane były tylko wartości „on” i „off” do włączania i wyłączania wsparcia dla symetrycznego wielowątkowości). Nową funkcję można stosować na niektórych procesorach PowerPC, które wspierają tryb gorącego podłączania symetrycznej wielowątkowości („hotplug SMT”), aby wybiórczo włączać SMT na określonych rdzeniach w trakcie pracy.
    • Kontynuacja przenoszenia zmian z gałęzi Rust-for-Linux związanych z używaniem języka Rust jako drugiego języka do rozwijania sterowników i modułów jądra (wsparcie dla Rust nie jest domyślnie aktywne i nie skutkuje dodaniem Rust do obowiązkowych zależności kompilacyjnych jądra). Przeszliśmy na wersje Rust 1.71.1 i bindgen 0.65.1. Wprowadzono trait 'Zeroable'. Dodano makra proceduralne 'paste!' oraz '#[derive(Zeroable)]'. Zapewniono zgodność z '#[pin_data]'. Dodano funkcje inicjalizacji '{,pin_}init_array_from_fn()' oraz metodę '{,pin_}chain'. Rozbudowano możliwości modułu 'types'. Do frameworka testów jednostkowych kunit dodano możliwość uruchamiania testów z dokumentacji Rust.
    • Dodano podsystem 'eventfs', który pozwala znacznie obniżyć zużycie pamięci w systemie śledzenia, eliminując konieczność przechowywania zbędnych struktur używanych do reprezentacji punktów śledzenia w systemie plików. Wcześniej podobne struktury były tworzone dla wszystkich punktów śledzenia, niezależnie od tego, czy były one używane. Dzięki eventfs takie struktury mogą być tworzone dynamicznie, tylko w momencie zagrożenia ich potrzebą.
    • Zwiększono możliwości użyteczności perf.
    • Do pliku /proc/pid/smaps dodano informacje do diagnostyki wydajności działania mechanizmu łączenia identycznych stron pamięci (KSM, Kernel Samepage Merging).
    • Usunięto API Frontswap, umożliwiające umieszczanie partycji wymiany w pamięci, do której nie można bezpośrednio adresować i która nie dostarcza aktualnych informacji o dostępności wolnego miejsca. API to było używane tylko w zswap, dlatego podjęto decyzję o bezpośrednim wykorzystaniu tej funkcjonalności w zswap, eliminując zbędne pośrednictwo.
    • Dla architektury RISC-V dodano wsparcie dla dostępu do liczników wydajności z przestrzeni użytkownika oraz możliwość umieszczania zrzutu jądra po awarii w obszarze poza 4GB.
    • Dodano wstępne wsparcie dla instrukcji ARM SME (Scalable Matrix Extension).
    • Wprowadzono możliwość używania narzędzi debugowania KDB, KGDB, kcov, KFENCE oraz KASAN w systemach z architekturą LoongArch.
    • Dodano wsparcie dla plików do testowania jądra w systemie ciągłej integracji GitLab, który jest wykorzystywany przy opracowywaniu sterowników graficznych.
  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • Do systemie plików OverlayFS dodano obsługę przechowywania hashy fs-verity w rozszerzonym atrybucie (xattr) overlay.verity, co może być używane do weryfikacji integralności i autentyczności plików w dolnych warstwach OverlayFS za pomocą kryptograficznych hashy i kluczy. W ten sposób OverlayFS zawiera teraz wszystkie zmiany potrzebne projektowi Composefs do działania jako nakładka na FS OverlayFS i EROFS.
    • W systemie plików XFS przygotowano wdrożenie możliwości stosowania narzędzia fsck do sprawdzania i naprawiania wykrytych problemów w trybie online, bez odmontowywania systemu plików. Ponadto w XFS wprowadzono możliwość używania dużych foliantów (folios) w pamięci podręcznej stron oraz dodano kilka związanych z tym optymalizacji, które znacząco zwiększyły wydajność w niektórych rodzajach obciążenia.
    • Do systemu plików tmpfs dodano obsługę niestandardowych rozszerzonych atrybutów (user xattrs), bezpośredniego wejścia/wyjścia oraz kwot związanych z użytkownikami i grupami. Stabilizowano przesunięcia dla katalogów, co rozwiązało problemy z eksportem tmpfs przez NFS.
    • W API zarządzania montowaniem dodano flagę FSCONFIG_CMD_CREATE_EXCL dla zwiększenia bezpieczeństwa, która zabrania wspólnego używania superbloku w kilku punktach montowania (zakazuje podpinania jednej partycji do kilku punktów montowania). W narzędziu mount zaproponowano opcję „—exclusive” dla aktywacji tej flagi.
    • W subsystemie VFS dodano obsługę natychmiastowej zmiany parametrów dostępu i zmian (atime, mtime). Wcześniej dane o czasie odzwierciedlane były z pewnym opóźnieniem, co przeszkadzało w śledzeniu aktualności danych w pamięci podręcznej w systemach podobnych do NFS (z powodu opóźnienia w ustaleniu zmian w pliku, system mógł błędnie uznać, że dane w pamięci podręcznej są aktualne). Nowa funkcjonalność jest dostępna dla Btrfs, Ext4, tmpfs i XFS.
    • W systemie Btrfs ogłoszono przestarzałym wbudowany mechanizm weryfikacji integralności, aktywowany na etapie budowy przez parametr BTRFS_FS_CHECK_INTEGRITY. Wspomniany mechanizm nie jest już wspierany, nie jest testowany, a jego stosowanie generuje dodatkowe obciążenie dla CPU i pamięci. Ponadto w Btrfs przeprowadzono optymalizację wydajności nowego kodu weryfikacji FS (scrub).
    • W systemie plików Ext4 dodano okresowe kontrole aktualizacji superbloku oraz przyspieszono operacje przydzielania pamięci podczas dołączania do końca pliku.
    • W podsystemie FUSE dodano wsparcie dla atrybutu btime ("czas utworzenia"), który określa czas stworzenia inode.
    • Zmiana uprawnień dostępu do linków symbolicznych jest zabroniona.
    • Dodano wywołanie systemowe fchmodat2(), które różni się od wywołania fchmodat() dodatkowym argumentem do wskazania flag. Na razie wspierane są tylko flagi AT_SYMLINK_NOFOLLOW i AT_EMPTY_PATH, które umożliwiają bezpośrednie wdrożenie w funkcji libc fchmodat() zakazu dereferencji linków symbolicznych oraz możliwość użycia deskryptora pliku przy wskazywaniu pustej ścieżki.
    • W systemie plików EROFS (Rozszerzalny System Plików Tylko do Odczytu), przeznaczonym do użytku na partycjach dostępnych tylko w trybie do odczytu, dodano wsparcie dla algorytmu kompresji Deflate. Aby przyspieszyć wyszukiwanie rozszerzonych atrybutów, wprowadzono probabilistyczną strukturę bloom filter.
    • Dodano ustawienie CONFIG_BUFFER_HEAD, które umożliwia zbudowanie jądra bez użycia struktury buffer_head. Przy kompilacji bez buffer_head można używać urządzeń blokowych i niektórych systemów plików, takich jak xfs, btrfs, cramfs, erofs oraz squashfs.
    • W sterowniku urządzeń blokowych ublk, który pozwala na przekazanie specyficznej logiki do przestrzeni użytkownika, dodano wsparcie dla strefowanych urządzeń magazynujących (podział na strefy grup bloków lub sektorów, w które można wprowadzać dane tylko w sposób sekwencyjny, aktualizując całą grupę bloków).
    • Realizacja systemu plików ReiserFS została przeniesiona z kategorii wspieranych do kategorii przestarzałych (Obsolete). Zakończenie wsparcia dla ReiserFS planowane jest na 2025 rok. Jako powód przeniesienia ReiserFS do kategorii przestarzałych wymieniono stagnację w utrzymaniu tego systemu plików, nierozwiązany problem roku 2038, brak możliwości zapewnienia odporności na awarie oraz chęć zmniejszenia nakładów pracy na utrzymanie wspólnych dla systemów plików zmian związanych z wsparciem nowego API do montowania, iomap oraz foliantów (folios).
    • W serwerze NFS wprowadzono mechanizm delegowania operacji zapisu dla NFSv4, który zwiększa efektywność buforowania zapisu plików w celu zmniejszenia ruchu. Włączono wsparcie dla operacji READ_PLUS, określonej w NFS 4.2.
    • Do systemu plików Ceph dodano wsparcie dla fscrypt.
  • Wirtualizacja i bezpieczeństwo
    • Dodano implementację mechanizmu Shadow Stack, który blokuje działanie wielu exploitów, wykorzystując możliwości sprzętowe procesorów Intel do ochrony przed nadpisywaniem adresu powrotu z funkcji w przypadku przepełnienia bufora w stosie. Sens ochrony polega na tym, że po przekazaniu kontroli do funkcji, adres powrotu jest zapisywany przez procesor nie tylko w zwykłym stosie, ale także w oddzielnym 'cienkim' stosie, który nie może być zmieniony bezpośrednio. Przed wyjściem z funkcji adres powrotu jest pobierany z cienkiego stosu i porównywany z adresem powrotu z głównego stosu. Niezgodność adresów prowadzi do wygenerowania wyjątku, który blokuje sytuacje, w których exploit mógłby nadpisać adres na głównym stosie. Sprzętowy cienki stos wspierany jest tylko w 64-bitowych wydaniach, a w 32-bitowych wydaniach zastosowano jego programową emulację.
    • Dodano wsparcie dla kompilacji z użyciem kompilatora Clang z włączonym trybem ochrony CFI (Control Flow Integrity), który blokuje naruszenia normalnego porządku wykonania (control flow) w wyniku zastosowania exploitów zmieniających przechowywane w pamięci wskaźniki do funkcji.
    • Dla architektury RISC-V włączono randomizację umiejscowienia jądra w pamięci podczas ładowania.
    • Do wywołania systemowego seccomp() dodano flagę SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP, umożliwiającą obsługę zdarzeń z monitorowanych procesów w trybie synchronicznym dla bardziej efektywnej pracy planisty zadań.
    • W funkcji kmalloc() zapewniono randomizację slab-cache, utrudniającą eksploatację luk w jądrze.
    • Z opcji związanych z włączeniem systemu przymusowej kontroli dostępu SELinux usunięto odniesienie do Agencji Bezpieczeństwa Narodowego USA. Ponieważ projekt rozwija się już od 20 lat pod skrzydłami społeczności i jest wspierany przez niezależnych konserwatorów, postanowiono przejść na użycie nazwy 'SELinux' zamiast 'NSA SELinux' w komentarzach i dokumentacji w Kconfig (na przykład wyjaśnienie do parametru kompilacji SECURITY_SELINUX zmieniono z 'Wsparcie dla NSA SELinux' na 'Wsparcie dla SELinux').
    • Do wywołania systemowego userfaultfd() dodano operację UFFDIO_POISON, która pozwala na oznaczenie stron pamięci jako 'zatruwających' (poisoned), co może być wykorzystane do przeniesienia uszkodzonych stron pamięci podczas migracji maszyn wirtualnych z jednego systemu na drugi.
    • Do podsystemy VFIO dodano nowe interfejsy znakowe (/dev/vfio/devices/vfioX) do zarządzania urządzeniami VFIO, co pozwala użytkownikowi bezpośrednio otworzyć plik z urządzeniem, bez odwoływania się do przestarzałego grupowego interfejsu /dev/vfio/$groupID.
    • W serwerze Wsparcie dla przestarzałych typów szyfrowania Kerberos, które używają algorytmów DES i 3DES, zostało usunięte z NFS.
    • Dodano wsparcie dla systemów gościnnych chronionych przez technologię AMD SEV-SNP (Secure Nested Paging) i Intel TDX (Trusted Domain Extensions) podczas uruchamiania w środowisku hypervisor Hyper-V.
    • Podczas budowania jądra w trybie 'W=1' w domyślnym kompilatorze włączono ostrzeżenia '-Wformat-overflow', '-Wformat-truncation', '-Wstringop-overflow' i '-Wrestrict'. Dla wszelkich kompilacji włączono ostrzeżenie '-Wenum-conversion'.
  • Subsystem sieciowy
    • Realizacja rodziny adresów AF_XDP (eXpress Data Path) została rozszerzona o możliwość pracy z pakietami przechowywanymi w wielu buforach (na przykład w jednym buforze może znajdować się nagłówek pakietu, a w drugim dane, lub w łańcuchu z kilku buforów mogą znajdować się duże jumbo-ramki Ethernet). Programy korzystające z gniazd AF_XDP mogą teraz odbierać i przesyłać pakiety bezpośrednio z wielu buforów.
    • Podsystem BPF zyskał wsparcie dla defragmentacji pakietów IPv4 i IPv6 oraz możliwość filtrowania fragmentowanych pakietów.
    • W BPF dodano nowy uchwyt update_socket_protocol, który umożliwia programom BPF zmianę żądanego protokołu dla nowych gniazd. Na przykład, program BPF może przezroczysto zastąpić protokół TCP protokołem MPTCP (multipath TCP) w celu optymalizacji ruchu aplikacji. W BPF dodano również wsparcie dla zarządzania routowaniem pakietów przez różne strumienie w MPTCP.
    • Zostało usunięte oznaczenie wersji eksperymentalnej z modułu ksmbd, który oferuje działającą na poziomie jądra implementację serwera plików opartą na protokole SMB3. Dodano wsparcie dla łączenia operacji odczytu (zapytania 'read compound').
  • Sprzęt
    • Do podsystemu DRM (Direct Rendering Manager) wprowadzono zmiany potrzebne do efektywnej pracy otwartego sterownika NVK z implementacją API graficznego Vulkan dla kart graficznych NVIDIA. Początkowo sterownik DRM Nouveau był zaprojektowany do implementacji OpenGL, dlatego brakuje mu prymitywów potrzebnych do efektywnej pracy sterowników Vulkan, na przykład wsparcia dla synchronizowanych obiektów i zarządzania wirtualną przestrzenią adresową.
    • W sterowniku AMDGPU zrealizowano wsparcie dla SDMA 6.1.0, HDP 6.1, SMUIO 14.0, PSP 14.0, IH 6.1 oraz GFX 9.4.3. Przepracowano kod ładowania firmware'u PSP (Platform Security Processor). Rozszerzono wsparcie dla technologii adaptacyjnej synchronizacji FreeSync (dodano wsparcie dla Freesync Panel Replay V2).
    • W sterowniku i915 kontynuowana jest realizacja wsparcia dla chipów Intel Meteor Lake. Udoskonalone wsparcie dla technologii ochrony przed kopiowaniem HDCP (High-bandwidth Digital Content Protection). Przepracowano kod do interakcji z wyświetlaczem.
    • Z Kconfig usunięto opcje wyłączania ładowania mikrokodu na etapie budowy — MICROCODE_INTEL i MICROCODE_AMD. Jądro teraz zawsze budowane jest z kodem ładowania mikrokodu dla systemów x86, ale faktyczne ładowanie mikrokodu można wyłączyć, podając parametr jądra ‘dis_ucode_ldr’.
    • Do subsystems dźwiękowej dodano możliwość zarządzania urządzeniami dźwiękowymi podłączonymi przez subsystem IIO (Industrial I/O).
    • Dodano wsparcie dla interfejsów dźwiękowych Intel LunarLake, Intel ArrowLake oraz AMD ACP5x, kodeków Cirrus Logic CS42L43, Realtek RT1017 i TI TAS2781, jak również wzmacniaczy Cirrus Logic CS35L56 i winic aw88261. Dodano wsparcie ASoC AMD Van Gogh.
    • Dodano sterownik USB MIDI 2.0 Gadget, emulujący interfejs USB MIDI 2.0, powiązany z urządzeniem ALSA UMP rawmidi.
    • Dodano wsparcie dla kontrolerów Ethernet Broadcom ASP 2.0 i Marvell 88Q2XXX.
    • Dodano wsparcie dla paneli Visionox R66451, TDO TL050HDV35, KD070FHFID015, Inanbo T28CP45TN89 i EDT ET028013DMA, kontrolerów wyświetlaczy Loongson oraz kontrolerów ekranów dotykowych Azoteq IQS7222D/IQS7210A/7211A.
    • Dodano wsparcie dla SoC ARM Qualcomm SM4450 (Snapdragon 4 Gen 2), TI AM62P5, Intel Agilex5, Qualcomm ipq5018, AN400 (Amlogic T7).
    • Dodano wsparcie dla platform ARM Samsung Galaxy Tab 3 8.0, FriendlyElec NanoPC T6, Amlogic A311D2, Khadas Vim4, Xiaomi SM7125, Facebook Yosemite 4, Orange Pi Zero 3, Radxa ROCK 4SE.

Jednocześnie latynoamerykańska Fundacja Wolnego Oprogramowania utworzyła wersję całkowicie wolnego jądra 6.6 — Linux-libre 6.6-gnu, oczyszczonego z elementów firmware'u i sterowników zawierających komponenty niekomercyjne lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W wydaniu 6.6 zaktualizowano kod czyszczenia blobów w różnych sterownikach i subsystemach, na przykład w sterownikach TI gigabit RU ethernet, MediaTek 792x wifi, Cirrus Logic cs42l43 mfd, cs35l56 HD-audio i aw88261 SoC. Przeprowadzono czyszczenie nazw blobów w plikach dts dla architektury Aarch64. Usunięto bloby w nowych sterownikach ivpu, w sterownikach bluetooth, w sterowniku do ekranów dotykowych oraz w kodowniku/dekodowniku Qualcomm Venus V4L2.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster