Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 7.0. Wśród najbardziej zauważalnych zmian znajdują się: zasady zastosowania asystentów AI, włączenie Rust do głównych możliwości jądra, poprawa wydajności swapu, domyślne włączenie trybu PREEMPT_LAZY, wsparcie dla filtrów w operacjach io_uring, nowy system plików Nullfs, infrastruktura fserror, narzędzia monitorowania XFS, wsparcie dla remapowania w Btrfs, domyślne włączenie wersji NFS 4.1, integracja postkwantowego algorytmu kryptograficznego ML-DSA, aktywacja AccECN w podsystemie sieciowym, wstępne wsparcie dla WiFi 8.
Numer 7.0 został przyznany, ponieważ w gałęzi 6.x zebrało się wystarczająco dużo wydań, aby zmienić pierwszą cyfrę w numerze wersji (w momencie wydania 6.0 powstał raport po 5.19). Zmiana numeracji odbywa się z powodów estetycznych i jest formalnym krokiem, eliminującym dyskomfort spowodowany dużą liczbą wydanych wersji w serii.
Nowa wersja zawiera 15624 poprawek od 2477 programistów, a rozmiar łatki wynosi 56 MB (zmiany obejmowały 18053 plików, dodano 704060 linii kodu, usunięto 278132 linie). W poprzednim wydaniu było 15657 poprawek od 2237 programistów, a rozmiar łatki wynosił 52 MB. Około 51% wszystkich zmian w 7.0 dotyczy sterowników urządzeń, około 11% zmian związanych jest z aktualizacją kodu specyficznego dla architektur sprzętowych, 14% dotyczy stosu sieciowego, 5% - systemów plików, a 3% z wewnętrznymi podsystemami jądra.
Główne nowości w jądrze 7.0 (1, 2, 3):
- Podsystem dyskowy, wejście/wyjście i systemy plików
- Zrealizowano infrastrukturę fserror i dodano API do pozyskiwania informacji o błędach wejścia/wyjścia oraz uszkodzeniu metadanych w trakcie pracy z plikami. Proponowana infrastruktura ujednolica w systemach plików przesyłanie informacji o błędach do przestrzeni użytkownika za pomocą mechanizmu fsnotify.
- W XFS dodano nowe możliwości monitorowania stanu systemu plików z przestrzeni użytkownika. Zaproponowano operację ioctl XFS_IOC_HEALTH_MONITOR, która zwraca deskryptor pliku, za pomocą którego można uzyskać informacje o awariach związanych z uszkodzeniem metadanych lub problemach z wejściem/wyjściem, a także śledzić zmiany stanów FS, takie jak odmontowanie i zakończenie pracy. Dodatkowo zaproponowano zarządzany przez systemd proces w tle xfs_healer, który przetwarza zdarzenia o stanie FS z przestrzeni użytkownika i w razie potrzeby automatycznie uruchamia procedury odzyskiwania.
- Do systemu plików Btrfs dodano eksperymentalne wsparcie dla struktury „drzewo remapingu” (remap tree), które w przyszłości może być wykorzystywane jako warstwa pośrednia podczas operacji we/wy. Istota nowej funkcji polega na tym, że po przeniesieniu danych na nośniku, zamiast aktualizowania wszystkich powiązanych z tymi danymi struktur, w dodatkowej strukturze „remap tree” zachowywane są stare i nowe adresy danych, a następnie podczas odwoływania się do danych adresy są zamieniane. Nowe podejście przedstawiane jest jako bardziej niezawodne i elastyczne, a także ułatwiające dalsze rozszerzanie funkcjonalności Btrfs.
- W Btrfs wprowadzono wsparcie dla bezpośredniego wejścia/wyjścia w sytuacjach, gdy rozmiar bloku przekracza rozmiar strony pamięci w systemie.
- W skład systemu wprowadzono nowy system plików „Nullfs”, który można wykorzystywać jako zastępczą przestrzeń dla głównego systemu plików. System plików Nullfs jest zawsze pusty, nie zawiera danych i nie wspiera zmian. Jego celem jest użycie jako początkowego systemu plików w celu uproszczenia procesu uruchamiania systemu — na Nullfs montowane są następnie inne systemy plików, a do przełączania głównego systemu plików używany jest wywołanie systemowe pivot_root() zamiast czyszczenia zawartości initramfs i korzystania z powiązanego z nim głównego systemu plików.
- Zrealizowano aktualizację informacji o czasie modyfikacji plików w trybie nieblokującym. Wcześniej wywołanie file_update_time_flags() z flagą IOCB_NOWAIT zwracało błąd „-EAGAIN”, co uniemożliwiało korzystanie z operacji bezpośredniego zapisania w trybie nieblokującym.
- W systemach plików do kategorii oddzielnie włączanych opcji dodano wsparcie dla blokad powiadomień (lease). Domyślnie taki mechanizm nie jest teraz aktywowany z powodu problemów z systemami plików, które pierwotnie nie były zaprojektowane do jego stosowania. Na przykład, nie wspierają go systemy plików 9p i cephfs.
- W systemie plików EROFS (Rozszerzalny System Plików Tylko do Odczytu), przeznaczonym do używania na partycjach dostępnych w trybie tylko do odczytu, domyślnie zastosowano algorytm LZMA do kompresji. Opcjonalnie dostępne są algorytmy DEFLATE i Zstandard, które nie są już oznaczane jako eksperymentalne. Zrealizowano współdzielenie wpisów w pamięci podręcznej stron (page-cache) dla identycznych plików w oddzielnych systemach plików EROFS.
- Usunięto tryb laptop_mode, oszczędzający energię poprzez odkładanie i łączenie operacji zapisu na twardym dysku, aby wydłużyć czas, w którym dysk znajduje się w trybie uśpienia i zmniejszyć liczbę wybudzeń. Tryb stracił na znaczeniu, ponieważ w nowoczesnych urządzeniach mobilnych twarde dyski zostały zastąpione dyskami półprzewodnikowymi.
- System plików F2FS został przetłumaczony na wykorzystanie dużych folii stron pamięci (large folios).
- Wznowiono prace nad sterownikiem ntfs3, rozwijanym przez firmę Paragon Software. Dodano wsparcie dla operacji na plikach opartych na iomap, zrealizowane opcje llseek SEEK_DATA/SEEK_HOLE, dodany tryb delalloc dla opóźnionego przydzielania bloków. Tymczasem, na liście mailingowej deweloperów jądra w lutym zatwierdzono włączenie do jednej z przyszłych wersji jądra nowej implementacji NTFS — ntfsplus, opracowanej w celu zastąpienia ntfs3.
- Domyślnie, podczas kompilacji włączona jest wersja protokołu NFS 4.1 (CONFIG_NFS_V4_1). Zapewniono blokadę eksportu przez NFS wyspecjalizowanych pseudo-systems, takich jak pidfs i nsfs. W NFSD wdrożono eksperymentalną możliwość używania POSIX ACL i dodano wsparcie dla dynamicznej zmiany puli wątków (thread-pool) w zależności od obciążenia.
- Pamięć i usługi systemowe
- Zatwierdzono oficjalne zasady dotyczące stosowania asystentów AI i włączania automatycznie generowanej treści do jądra. Przy przekazywaniu wygenerowanego kodu zaleca się oznaczanie go poprzez wskazanie używanego asystenta AI za pomocą tagu „Assisted-by”. Asystentom AI zabrania się dodawania tagu „Signed-off-by” — osoba przekazująca patch jest uważana za jego autora, ponosi odpowiedzialność za przesuwaną zmianę i ręczy za jej jakość. Programiści są zobowiązani do przeprowadzania ręcznego przeglądu kodu uzyskanego przez AI oraz do sprawdzania zgodności wyniku z wymaganiami licencyjnymi.
- Wsparcie dla Rustu zostało przeniesione z eksperymentalnych do podstawowych funkcji jądra. Wsparcie dla Rustu nie jest domyślnie aktywne i nie prowadzi do włączenia Rustu do listy obowiązkowych zależności kompilacyjnych dla jądra.
- Zakończono integrację z rdzeniem mechanizmu „Swap Table”, który pozwala zwiększyć wydajność podsystemu swap. Przyspieszenie osiągane jest dzięki redukcji konkurencji o dostęp do pamięci cache, efektywniejszemu przeszukiwaniu w cache oraz zmniejszeniu fragmentacji. Backend oparty na Swap Table jest wykorzystywany do cache'owania swap zamiast backendu XArray i pozwolił w teście redis-benchmark z BGSAVE zwiększyć liczbę przetwarzanych zapytań o 22%.
- Dodano wsparcie dla nowego rozszerzenia Analiza Bezpieczeństwa Wątków (Thread Safety Analysis) w Clang 22, które pozwala na etapie kompilacji identyfikować potencjalne stany wyścigu oraz błędy spowodowane niewłaściwym stosowaniem blokad. Rozszerzenie oferuje szereg atrybutów, takich jak GUARDED_BY(…), REQUIRES(…), RELEASE(…) i ACQUIRE(…), które pozwalają oznaczać funkcje objęte blokadami oraz rozdzielać zakresy blokad (określać kontekst). Na etapie kompilacji sprawdzana jest poprawność stosowania prymitywów synchronizacji, takich jak mutexy, na podstawie oceny aktywności lub nieaktywności powiązanego z nimi kontekstu.
- Do wywołania systemowego open_tree dodano flagę OPEN_TREE_NAMESPACE w celu uproszczenia konfiguracji izolowanych kontenerów i przyspieszenia uruchamiania kontenerów w systemach z dużą liczbą punktów montowania. Podobnie jak OPEN_TREE_CLONE, nowa flaga kopiuje tylko wskazane drzewo punktów montowania (mount tree), ale zamiast lokalnego deskryptora pliku zwraca deskryptor pliku w nowej przestrzeni nazw punktów montowania, w której skopiowane drzewo jest montowane na kopii prawdziwego systemu plików. Flaga OPEN_TREE_NAMESPACE jest potrzebna do zredukowania oddzielnego wykonywania operacji unshare(CLONE_NEWNS) i pivot_root() stosowanych podczas tworzenia kontenerów.
- Do wywołania systemowego rseq dodano mechanizm rozszerzenia kwantów czasu (time slice), który pozwala uzyskać dodatkowy czas procesora dla nieprzerwanego wykonywania sekcji krytycznej. Idea polega na uniknięciu przerywania planowaniem zadań sekcji krytycznej z ustawioną blokadą, co prowadzi do przekazania kontroli innym wątkom, które wykorzystują zasoby, na których nadal pozostaje ustawiona blokada. Rozszerzenie kwantu czasu odbywa się bez dodatkowych kosztów, ale także bez rygorystycznych gwarancji zapewnianych przy pełnym regulowaniu priorytetów.
- Dla architektur arm64, loongarch, powerpc, riscv, s390 i x86 tryb preempcji zadań (preemption) w domyślnym planowaniu został zmieniony z PREEMPT_NONE na PREEMPT_LAZY. Liczba możliwych trybów została zredukowana z czterech do dwóch — PREEMPT_FULL i PREEMPT_LAZY (tryby PREEMPT_NONE i PREEMPT_VOLUNTARY pozostają tylko dla architektur, które nie obsługują PREEMPT_FULL i PREEMPT_LAZY). Tryb PREEMPT_LAZY stosuje model pełnej preempcji (PREEMPT_FULL) dla zadań realtime (RR/FIFO/DEADLINE), ale opóźnia preempcję zwykłych zadań (SCHED_NORMAL) do granicy tików. Wprowadzone opóźnienie prowadzi do zmniejszenia przypadków preempcji posiadaczy blokad, co pozwala zbliżyć wydajność do konfiguracji korzystających z modelu dobrowolnej preempcji (voluntary preemption), tzn. PREEMPT_LAZY pozwala zachować możliwości pełnej preempcji w odniesieniu do zadań realtime, ale minimalizuje spadki wydajności dla zwykłych zadań.
Włączenie PREEMPT_LAZY doprowadziło do poważnej regresji, dwukrotnie obniżającej wydajność PostgreSQL na systemach ARM64. Aby wyeliminować spadek wydajności, deweloperzy PostgreSQL zostali poproszeni o wykorzystanie opcji PR_RSEQ_SLICE_EXTENSION w celu zmniejszenia prawdopodobieństwa preempcji posiadacza blokady.
- Kontynuowane są prace nad przeniesieniem zmian z gałęzi Rust-for-Linux związanych z użyciem języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra. Dzięki wcześniej zintegrowanej bibliotece „syn”, która upraszcza pisanie złożonych makr, udało się zmniejszyć rozmiar kodu Rust w jądrze poprzez uproszczenie definicji istniejących makr proceduralnych. Rozszerzono możliwości bibliotek kernel, macros i pin-init.
- Do systemu asynchronicznego wejścia/wyjścia io_uring dodano opcję umożliwiającą korzystanie z niecyklicznych kolejek zgłaszania (non-circular submission queue), które są bardziej efektywnie cache'owane w sytuacji, gdy wykonanie żądania kończy się przed zwrotem z wywołania systemowego.
- W podsystemie eBPF w mechanizmie BTF (BPF Type Format), dostarczającym informacje do sprawdzania typów w pseudokodzie BPF, do wyszukiwania informacji debugowania wykorzystano algorytm wyszukiwania binarnego, co zwiększyło efektywność ładowania programów BPF. W eBPF dodano obsługę argumentów niejawnych przy wywołaniu kfunc (funkcji jądra dostępnych do wykorzystania w programach BPF), zdefiniowanych z flagą KF_IMPLICIT_ARGS.
- Usunięto kod obsługi początkowego dysku RAM (initrd) opartego na linuxrc, który od dawna uznawany jest za przestarzały. Pozostałe implementacje initrd planują usunąć do 2027 roku. Zamiast initrd należy używać initramfs (różnica polega na tym, że initrd umieszcza początkowe środowisko rozruchowe w obrazie dysku, podczas gdy initramfs – w systemie plików).
- W blokowym urządzeniu zram, stosowanym do skompresowanego przechowywania partycji wymiany w pamięci, zmieniono logikę pracy z kompresowanymi stronami pamięci w przypadku opcjonalnego przenoszenia danych do trwałego magazynu w przypadku napełnienia dostępnej pamięci RAM. Wcześniej strony pamięci były dekompresowane przed zapisaniem na fizycznym nośniku, a teraz są zapisywane w skompresowanej formie, co zmniejsza obciążenie CPU i oszczędza energię podczas pracy w trybie autonomicznym.
- Do narzędzia timerlat, przeznaczonego do pomiaru opóźnień podczas pracy harmonogramu zadań, dodano opcję „—bpf-action” do uruchamiania programów BPF w przypadku przekroczenia określonego progu.
- Do systemu śledzenia ftrace dodano konfigurację „bitmask-list” do wyjścia masek bitowych w czytelnej formie (w postaci listy bitów, a nie liczby szesnastkowej). W tracefs dodano funkcje do audytu filtrów i wyzwalaczy. Dodano komendę „perf sched stats” do zbierania i wyświetlania statystyk dotyczących działania harmonogramu zadań.
- Dodano opcje kompilacji LOGO_LINUX_MONO_FILE, LOGO_LINUX_VGA16_FILE i LOGO_LINUX_CLUT224_FILE do określenia pliku z obrazem logo, które będzie wyświetlane podczas uruchamiania jądra zamiast domyślnego logo z pingwinem Tux.
- Wirtualizacja i bezpieczeństwo
- W systemie asynchronicznego wejścia/wyjścia io_uring wprowadzono możliwość dołączania programów BPF z filtrami, które kontrolują, co mogą robić konkretne operacje SQE (Submission Queue Entry) (podobne do wywołań systemowych w io_uring). Wprowadzona funkcjonalność jest analogiczna do filtrów wywołań systemowych. Filtry można wiązać z określonymi zadaniami, a są one dziedziczone podczas tworzenia innych procesów po wywołaniu fork(). W przypadku aktywnych filtrów, dodawane filtry mogą jedynie nakładać dodatkowe ograniczenia, ale nie wyłączać istniejących. Wprowadzona funkcjonalność umożliwi blokowanie metod omijania filtracji wywołań systemowych w środowiskach sandboxowych, opartych na wykonywaniu operacji analogicznych do wywołań systemowych, udostępnionych w io_uring.
- W SELinux dodano zarządzanie dostępem do tokenów BPF, umożliwiające nieuprzywilejowanym procesom wykonywanie niektórych uprzywilejowanych operacji z BPF, takich jak ładowanie programów BPF do jądra i tworzenie struktur map.
- Dodano wsparcie dla algorytmu tworzenia podpisów cyfrowych ML-DSA (CRYSTALS-Dilithium), opartego na teorii krat i odpornego na ataki kwantowe. Umożliwiono korzystanie z ML-DSA do autoryzacji modułów jądra.
- Usunięto możliwość korzystania z schematu tworzenia podpisów cyfrowych z algorytmem SHA-1 do podpisywania modułów jądra (wsparcie dla ładowania podpisanych modułów pozostaje).
- Do rekordu audytu NETFILTER_PKT dodano pola ‘sport’ i ‘dport’ do inspekcji numerów portów sieciowych, a nie tylko adresów IP.
- Dla systemów z architekturą RISC-V wprowadzono wsparcie dla rozszerzeń Zicfiss i Zicfilp, które zapewniają możliwości sprzętowe do zastosowania ochrony CFI (Control Flow Integrity), blokującej naruszenia normalnej kolejności wykonywania instrukcji w wyniku wykorzystania exploitów zmieniających przechowywane w pamięci wskaźniki do funkcji.
- W hiperwizorze KVM wprowadzono możliwość przesyłania do systemów gości informacji o wsparciu procesora dla rozszerzenia ERAPS (Enhanced Return Address Predictor Security), co pozwala na zredukowanie liczby operacji resetowania stanu CPU przy przekazywaniu kontroli z powrotem do hosta przez system gościa. Ponadto dodano wsparcie dla przypisywania sprzętu do systemów gości w celu monitorowania wydajności (PMU, Performance Monitoring Unit), co zwiększa dokładność profilowania w porównaniu z używaniem emulowanych PMU.
- Do sterownika hiperwizora Hyper-V dodano wsparcie dla interfejsu debugfs do przeglądania statystyk dotyczących działania hiperwizora.
- Subsystem sieciowy
- Domyślnie włączone jest rozszerzenie AccECN (Accurate Explicit Congestion Notification), które implementuje ulepszona wersja rozszerzenia ECN, pozwalająca hostom oznaczać pakiety IP w przypadku przeciążenia zamiast je odrzucać, co umożliwia identyfikację początkowego etapu zatoru w kanałach komunikacyjnych bez utraty pakietów. Pierwotne rozszerzenie ECN ma ograniczenie, które pozwala na wysłanie tylko jednego sygnału o przeciążeniu w ramach jednego cyklu odbioru-wysyłania TCP (RTT, Round-Trip Time, wysłanie żądania i odbiór odpowiedzi). AccECN znosi to ograniczenie i umożliwia odbiorcy przekazywanie nadawcy więcej niż jednej etykiety o przeciążeniu w nagłówku pakietu TCP. Algorytmy zarządzania przeciążeniem mogą wykorzystać uzyskane informacje do dokładniejszego reagowania na przeciążenia, unikając drastycznego zmniejszenia intensywności wysyłania pakietów przy pojawieniu się niewielkiego przeciążenia.
- W implementacji algorytmu zarządzania kolejkami sieciowymi Cake dodano możliwość obsługi wielu kolejek w celu rozkładu obciążenia na kilka rdzeni CPU. Algorytm CAKE jest stosowany w celu zmniejszenia negatywnego wpływu pośredniego buforowania pakietów na granicznym sprzęcie sieciowym i jest skierowany na osiągnięcie maksymalnej możliwej przepustowości i minimalnego poziomu opóźnień, nawet w wolnych kanałach komunikacyjnych.
- Do gniazd VSOCK, używanych do interakcji z maszynami wirtualnymi, dodano obsługę przestrzeni nazw sieci (network namespace).
- Dodano wstępną implementację przyszłego standardu WiFi 8 (802.11bn, Ultra High Reliability WiFi).
- Dodano optymalizacje, które pozwoliły zwiększyć wydajność przetwarzania przychodzących pakietów UDP o 12% podczas przeprowadzania testów obciążeniowych w sieci 100-gigabitowej.
- Sprzęt
- W sterowniku AMDGPU zaimplementowano wsparcie dla bloków IP używanych w nowych GPU AMD, takich jak 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 oraz JPEG 5.3.
- W sterowniku Nouveau poprawiono zarządzanie częstotliwością na systemach Tegra 186+.
- W sterowniku i915 dodano wstępną obsługę bloku IP wyświetlacza Xe3p_LPD, stosowanego w procesorach Intel Nova Lake-P.
- Prace nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU na bazie architektury Intel Xe, używanej w kartach graficznych Intel z rodziny Arc oraz w zintegrowanej grafice od procesorów Tiger Lake, zostały kontynuowane. Dodano tryb Multi Queue. Wprowadzono komponenty niezbędne do diagnozowania zawieszeń GPU w Mesa. Dodano wsparcie dla mechanizmu MERT do zarządzania dostępem do pamięci GPU.
- Kontynuowana jest integracja komponentów sterownika Nova dla GPU NVIDIA z wbudowanymi oprogramowaniami GSP, stosowanymi od serii NVIDIA GeForce RTX 2000 opartych na mikroarchitekturze Turing. Sterownik został napisany w języku Rust. W nowej wersji przygotowano wsparcie dla GPU opartych na mikroarchitekturze Turing oraz wprowadzono różne zmiany wewnętrzne.
- Dodano wsparcie dla kontrolerów i urządzeń peryferyjnych z wielokanałowym interfejsem SPI (Serial Peripheral Interface), umożliwiającym przesyłanie danych w kilku równoległych strumieniach.
- Dodano sterownik dla zintegrowanych złącz Type-C, wykorzystywanych w urządzeniach z chipami Apple Silicon, łączących interfejsy USB3, DP-AltMode oraz Thunderbolt/USB4.
- Dodano wsparcie dla systemów dźwiękowych chipów Tegra238, Minisforum V3 SE, iBasso DC04U, Intel Nova Lake, Nova Lake S oraz Focusrite Forte.
- Dodano wsparcie dla płyt ARM, SoC i urządzeń: 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.
- Dodano wsparcie dla smartfonów i tabletów: Fairphone Gen 6 (SoC Qualcomm Milos/Snapdragon 7s Gen 3), Pixel 3/3 xl, Microsoft Surface Pro 11.
Jednocześnie latynoamerykańska Fundacja Wolnego Oprogramowania opracowała wersję całkowicie wolnego jądra 7.0 — Linux-libre 7.0-gnu, oczyszczonego z elementów oprogramowania układowego i sterowników zawierających komponenty lub fragmenty kodu, których użycie jest ograniczone przez producenta. W wydaniu 7.0 dokonano czyszczenia z blobów sterownika iwlwifi. Zaktualizowano kod czyszczenia w sterownikach amdgpu, adreno, TI PRUeth, air_en8811h, ath12k, TI VPE, rtw8852b, rt1320, rt5575 SPI, tas2783, Intel catpt. Wykonano czyszczenie nazw blobów w plikach dts (devicetree) dla chipów ARM.
Źródło: opennet.ru
