Po dwóch miesiącach prac Linus Torvalds przedstawił wydał jądro Linux 7.0. Wśród najbardziej zauważalnych zmian znajdują się: zasady stosowania asystentów AI, przekazanie Rust do podstawowych możliwości jądra, zwiększenie wydajności pamienia, włączenie domyślnie trybu PREEMPT_LAZY, wsparcie dla filtrów dla operacji io_uring, nowy system plików Nullfs, infrastruktura fserror, narzędzia monitorujące XFS, wsparcie dla remapowania w Btrfs, włączenie domyślnie wersji NFS 4.1, integracja post-kwantowego algorytmu kryptograficznego ML-DSA, aktywacja AccECN w subsystemach sieciowych, początkowe 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.
Do nowej wersji przyjęto 15624 poprawki od 2477 programistów, rozmiar łatki wynosi 56 MB (zmiany dotyczą 18053 plików, dodano 704060 linii kodu, usunięto 278132 linii). W zeszłym wydaniu było 15657 poprawek od 2237 programistów, rozmiar łatki wynosił 52 MB. Około 51% wszystkich zmian w 7.0 dotyczy sterowników urządzeń, około 11% zmian ma związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 14% związane jest z stosem sieciowym, 5% z systemami plików i 3% z wewnętrznymi subsystemami jądra.
Główne nowości w jądrze 7.0 (kernelnewbies.org, lwn.net, OpenNET):
- Podsystem dyskowy, wejście/wyjście i systemy plików
- Zrealizowano infrastrukturę fserror oraz dodano API do uzyskiwania informacji o błędach wejścia/wyjścia oraz uszkodzeniu metadanych podczas pracy z plikami. Proponowana infrastruktura ujednolica w systemach plików przekazywanie 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, pozwalający na uzyskanie informacji o awariach związanych z uszkodzeniem metadanych oraz błędami wejścia/wyjścia, a także śledzenie zmian stanu systemu plików, takich jak odmontowanie i zakończenie pracy. Dodatkowo zaproponowano zarządzany przez systemd proces w tle xfs_healer, który przetwarza zdarzenia dotyczące stanu systemu plików z przestrzeni użytkownika i w razie potrzeby automatycznie uruchamia. procedury przywracania.
- Do systemu plików Btrfs dodano eksperymentalne wsparcie dla struktury „drzewo remapowania” (remap tree), które w przyszłości może być wykorzystane jako warstwa pośrednia przy operacjach wejścia/wyjścia. Istota dodanej funkcji polega na tym, że po przeniesieniu danych na nośniku, zamiast aktualizacji wszystkich powiązanych z tymi danymi struktur, w dodatkowej strukturze „drzewo remapowania” przechowywane są stare i nowe adresy danych, co umożliwia ich zamianę podczas odwoływania się do danych. Nowe podejście przedstawiane jest jako bardziej niezawodne i elastyczne, a także ułatwiające dalsze rozszerzanie funkcjonalności Btrfs.
- W Btrfs zrealizowano wsparcie dla bezpośredniego wejścia/wyjścia w sytuacjach, gdy rozmiar bloku przekracza rozmiar strony pamięci w systemie.
- W skład wliczona nowy system plików Nullfs, który można używać jako placeholder dla systemu plików root. System plików Nullfs zawsze jest pusty, nie zawiera danych i nie obsługuje zmian. Celem Nullfs 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 wywołanie systemowe pivot_root() stosowane jest do przełączania systemu plików root zamiast czyszczenia zawartości initramfs i używania powiązanego systemu plików root.
- 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 użycie operacji bezpośredniego zapisu w trybie nieblokującym.
- W systemach plików jako osobno włączane opcje przetłumaczone wsparcie dla powiadamiania o blokadach (lease). Domyślnie taki mechanizm nie jest teraz aktywowany z powodu problemów z systemami plików, które nie były początkowo zaprojektowane do jego zastosowania. Na przykład nie obsługują go systemy plików 9p i cephfs.
- W systemie plików EROFS (Extendable Read-Only File System), przeznaczonym do użytku na partycjach dostępnych tylko w trybie do odczytu, domyślnie stosowany jest 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, który oszczędza energię poprzez opóźnianie i łączenie operacji zapisu na dysku twardym w celu wydłużenia czasu, w którym dysk pozostaje w trybie uśpienia i zmniejszenia liczby jego przebudzeń. Tryb stracił na znaczeniu, ponieważ w nowoczesnych urządzeniach mobilnych dyski twarde zostały zastąpione dyskami SSD.
- System plików F2FS został przetworzony na użycie dużych folio pamięci (large folios).
- Wznowiono prace nad sterownikiem ntfs3, rozwijanym przez firmę Paragon Software. Dodano wsparcie dla operacji z plikami opartych na iomap, zrealizowano opcje llseek SEEK_DATA/SEEK_HOLE, dodano tryb delalloc do opóźnionego przydzielania bloków. Tymczasem na liście dyskusyjnej programistów jądra w lutym zatwierdzono ogłoszono włączenie do jednej z przyszłych wersji jądra nowej implementacji NTFS — ntfsplus, zaprojektowanej w celu zastąpienia ntfs3.
- Domyślnie podczas budowy wliczona wersja protokołu NFS 4.1 (CONFIG_NFS_V4_1). Zagwarantowano blokowanie eksportu przez NFS wyspecjalizowanych pseudo-FS, takich jak pidfs i nsfs. W NFSD zrealizowano eksperymentalna możliwość użycia POSIX ACL i dodano wsparcie dla dynamicznego zmieniania puli wątków (thread-pool) w zależności od obciążenia.
- Pamięć i usługi systemowe
-
Zatwierdzono oficjalne zasady stosowania asystentów AI i włączenia do jądra automatycznie generowanej zawartości. Przy przekazywaniu wygenerowanego kodu należy oznaczyć 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 uznawana za jego autora, ponosi odpowiedzialność za przekazane zmiany i ręczy za ich jakość. Deweloperzy są zobowiązani do przeprowadzania ręcznego przeglądu kodu otrzymanego za pomocą AI oraz sprawdzania zgodności wyniku z wymaganiami licencyjnymi.
-
Wsparcie dla Rust przetłumaczone z eksperymentalnych do główne możliwości jądra.
-
Zakończono integrację z jądrem mechanizmu „Tabela Swap”, która pozwala na zwiększenie wydajności podmieniania. Przyspieszenie osiągane jest dzięki zmniejszeniu konkurencji o dostęp do pamięci podręcznej swapu, efektywniejszemu przeszukiwaniu w pamięci podręcznej oraz zmniejszeniu fragmentacji. Backend oparty na Tabeli Swap wykorzystany został do buforowania swapu zamiast backendu XArray, co pozwoliło w teście redis-benchmark z BGSAVE zwiększyć liczbę przetwarzanych zapytań o 22%.
-
Dodano wsparcie dla pojawiającego się w Clang 22 rozszerzenia Analiza Bezpieczeństwa Wątków, umożliwiającego na etapie kompilacji wykrywanie potencjalnych stanów wyścigu i błędów spowodowanych niewłaściwym wystawieniem blokad. Rozszerzenie oferuje szereg atrybutów, takich jak GUARDED_BY(…), REQUIRES(…), RELEASE(…) i ACQUIRE(…), które pozwalają na oznaczanie funkcji objętych blokadami i oddzielać obszary działania blokad (określać kontekst). Na etapie kompilacji wykonywana jest weryfikacja poprawności użycia prymitywów synchronizacji, takich jak mutexy, na podstawie oceny aktywności lub braku aktywności związanym z nimi kontekstem.
-
W wywołaniu systemowym open_tree dodano flaga OPEN_TREE_NAMESPACE w celu uproszczenia konfigurowania izolowanych kontenerów oraz przyspieszenia uruchamiania kontenerów w systemach z dużą liczbą punktów montowania. Podobnie jak OPEN_TREE_CLONE, nowy flaga kopiuje tylko określone 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 montowane jest na kopii rzeczywistego systemu plików. Flaga OPEN_TREE_NAMESPACE jest potrzebna do uniknięcia oddzielnego wykonywania operacji unshare(CLONE_NEWNS) i pivot_root(), stosowanych podczas tworzenia kontenerów.
-
W wywołaniu systemowym rseq dodano mechanizm rozszerzania kwantów czasu (time slice), pozwalający na uzyskanie dodatkowego czasu procesora dla nieprzerwanego wykonywania krytycznej sekcji. Idea polega na unikaniu przerwania przez planista zadań krytycznej sekcji z ustawioną blokadą, co prowadzi do przekazania kontroli innym wątkom, które używają zasobów, które pozostają z ustawioną blokadą. Rozszerzenie kwantu czasu odbywa się bez dodatkowych kosztów, ale i bez surowych gwarancji, jakie oferowane są w pełnym regulowaniu priorytetów.
-
Dla architektur arm64, loongarch, powerpc, riscv, s390 i x86 tryb wyprzedzenia zadań (preemption) w plannerze jest domyślny. zmieniony z PREEMPT_NONE na PREEMPT_LAZY. Liczba możliwych trybów skrócona z czterech do dwóch – PREEMPT_FULL i PREEMPT_LAZY (tryby PREEMPT_NONE i PREEMPT_VOLUNTARY pozostają tylko dla architektur, które nie wspierają PREEMPT_FULL i PREEMPT_LAZY). Tryb PREEMPT_LAZY stosuje model pełnego wyprzedzenia (PREEMPT_FULL) dla zadań realtime (RR/FIFO/DEADLINE), ale opóźnia wyprzedzenie zwykłych zadań (SCHED_NORMAL) do granicy tiku. Wprowadzone opóźnienie prowadzi do zmniejszenia przypadków wyprzedzenia posiadaczy blokad, co pozwala przybliżyć wydajność do konfiguracji, które używają modelu dobrowolnego wyprzedzenia (voluntary preemption), tzn. PREEMPT_LAZY pozwala zachować możliwości pełnego wyprzedzenia w odniesieniu do zadań realtime, ale minimalizuje spadek wydajności dla zwykłych zadań.
Włączenie PREEMPT_LAZY doprowadziło do poważnej regresji, która zmniejsza wydajność PostgreSQL na systemach ARM64 o połowę. Aby usunąć spadek wydajności, programistom PostgreSQL zaproponowano uruchomienie opcji PR_RSEQ_SLICE_EXTENSION w celu zmniejszenia prawdopodobieństwa wyprzedzenia posiadacza blokady.
-
Kontynuowano przenoszenie zmian z gałęzi Rust-for-Linux, związanych z wykorzystaniem języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra (wsparcie Rust nie jest aktywne domyślnie i nie prowadzi do włączenia Rust jako jednego z obowiązkowych zależności kompilacyjnych jądra). Dzięki wcześniej zintegrowanej bibliotece „syn (crates.io)”, ułatwiającej pisanie skomplikowanych makr, udało się zmniejszyć rozmiar kodu Rust w jądrze dzięki uproszczeniu definicji istniejących makr proceduralnych. Rozszerzone możliwości bibliotek kernel, macros i pin-init.
-
W systemie asynchronicznego wejścia/wyjścia io_uring dodano opcja do wykorzystania niecircularnych kolejek zgłoszeń (non-circular submission queue), lepiej buforowanych w sytuacjach, gdy wykonanie żądania kończy się przed powrotem z wywołania systemowego.
-
W podsystemie eBPF w mechanizmie BTF (BPF Type Format), który dostarcza informacji dla weryfikacji typów w pseudokodzie BPF, do wyszukiwania informacji debugujących zaangażowany binarne wyszukiwanie, co zwiększyło efektywność ładowania programów BPF. W eBPF dodano wsparcie dla niejawnych argumentów podczas wywołania kfunc (funkcje jądra, dostępne do użycia w programach BPF), zdefiniowane z flagą KF_IMPLICIT_ARGS.
-
Usunięto kod wspierający początkowy dysk RAM (initrd) oparty na linuxrc, długo uznawany za przestarzały. Pozostałe implementacje initrd planują usunięcie w 2027 roku. Zamiast initrd powinien być używany initramfs (różnica polega na tym, że initrd umieszcza początkowe środowisko rozruchowe w obrazie dysku, a initramfs – w systemie plików).
-
W urządzeniu blokowym zram, stosowanym do skompresowanego przechowywania segmentu swap w pamięci, zmieniona logika pracy z kompresowanymi stronami pamięci przy opcjonalnym przeniesieniu danych do trwałego magazynu w przypadku zapełnienia dostępnej pamięci RAM. Wcześniej strony pamięci były rozpakowywane przed zapisem na nośniku fizycznym, a teraz są przechowywane w skompresowanej formie, co zmniejsza obciążenie CPU i oszczędza energię podczas pracy w trybie offline.
-
W narzędziu timerlat, przeznaczonym do mierzenia opóźnień przy pracy planisty zadań, dodano opcja —bpf-action do uruchamiania programów BPF w przypadku przekroczenia określonego progu.
-
W systemie śledzenia ftrace dodano ustawienie bitmask-list do wyświetlania masek bitowych w czytelnej postaci (w formie listy bitów, a nie liczby szesnastkowej). W tracefs dodano możliwości audytu filtrów i wyzwalaczy. Dodano polecenie perf sched stats do zbierania i wyświetlania statystyk działania planisty 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 ładowania jądra zamiast standardowego logo z pingwinem Tux.
-
- Wirtualizacja i bezpieczeństwo
- W systemie asynchronicznego wejścia/wyjścia io_uring zrealizowano możliwość podłączania programów BPF z filtrami kontrolującymi, co mogą robić konkretne operacje SQE (Submission Queue Entry) (podobnie jak wywołania systemowe w io_uring). Dodana możliwość jest analogią filtrów wywołań systemowych. Filtry można przypinać do określonych zadań, a one dziedziczą się przy tworzeniu innych procesów po wywołaniu fork(). Przy aktywnych filtrach dodawane na wierzch filtry mogą jedynie wprowadzać dodatkowe ograniczenia, ale nie dezaktywować istniejące. Zrealizowana możliwość pozwoli na blokowanie metod omijania filtracji wywołań systemowych w środowiskach typu sandbox, opartych na wykonywaniu zamiast wywołań systemowych analogicznych operacji dostarczanych w io_uring.
- W SELinux dodano możliwość zarządzania dostępem do tokenów BPF, pozwalających nieuprzywilejowanym procesom realizować niektóre uprzywilejowane operacje za pomocą BPF, na przykład ładować programy BPF do jądra i tworzyć mapy-struktury.
- Dodano wsparcie algorytmu generacji podpisów cyfrowych ML-DSA (CRYSTALS-Dilithium), opartego na teorii krat i odpornego na ataki na komputerach kwantowych. Dostarczono możliwość użycia ML-DSA do uwierzytelniania modułów jądra.
- Usunięto możliwość używania schematów generowania podpisów cyfrowych z algorytmem SHA-1 do uwierzytelniania modułów jądra (wsparcie dla ładowania podpisanych modułów zostało zachowane).
- W zapisie 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 zrealizowano wsparcie rozszerzeń Zicfiss i Zicfilp, które dostarczają sprzętowych możliwości dla zastosowania ochrony CFI (Control Flow Integrity), blokującej naruszenia normalnego porządku wykonania instrukcji (control flow) w wyniku zastosowania exploitów, zmieniających przechowywane w pamięci wskaźniki do funkcji.
- W hypervisorze KVM zrealizowano możliwość przesyłania do systemów gości informacji o wsparciu rozszerzenia ERAPS (Enhanced Return Address Predictor Security), pozwalającego na ominięcie niektórych operacji resetowania stanu CPU podczas zwracania kontroli z systemu gościa do hosta. Ponadto, dodano wsparcie przypisywania sprzętu do systemów gości do monitorowania wydajności (PMU, Performance Monitoring Unit), co pozwala na zwiększenie dokładności profilowania w porównaniu do wykorzystania emulowanych PMU.
- Sterownik dla hyperwizora Hyper-V dodano wsparcie dla debugfs do przeglądania statystyk działania hyperwizora.
- Subsystem sieciowy
- Włączone domyślnie rozszerzenie AccECN (Dokładne Stwierdzanie Zatorów), które implementuje ulepszoną wersję rozszerzenia ECN (wikipedia.org), pozwalającą hostom w przypadku przeciążenia oznaczać pakiety IP zamiast je odrzucać, co umożliwia wykrycie początkowego etapu zatoru w kanałach komunikacyjnych bez utraty pakietów. Oryginalne rozszerzenie ECN ma ograniczenie, które pozwala na wysłanie tylko jednego sygnału o przeciążeniu w ramach jednego cyklu przesyłania TCP (RTT, Round-Trip Time, wysyłanie żądania i odbieranie odpowiedzi). AccECN znosi to ograniczenie i umożliwia odbiorcy wysyłanie nadawcy więcej niż jednej etykiety dotyczącej przeciążenia w nagłówku pakietu TCP. Algorytmy zarządzania przeciążeniem mogą wykorzystywać uzyskane informacje do dokładniejszego reagowania na przeciążenia i nie uciekać się do gwałtownego zmniejszania intensywności przesył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 rozłożenia obciążenia na kilka rdzeni CPU. Algorytm CAKE jest stosowany w celu ograniczenia negatywnego wpływu tymczasowego buforowania pakietów na brzegowych urządzeniach sieciowych i ma na celu osiągnięcie maksymalnej możliwej przepustowości oraz minimalnego poziomu opóźnień, nawet na wolnych kanałach komunikacyjnych.
- W gniazdach VSOCK, używanych do interakcji z maszynami wirtualnymi, dodano wsparcie dla przestrzeni nazw sieciowych (network namespace).
- Dodano wstępna implementacja przyszłego standardu WiFi 8 (802.11bn, Ultra Wysoka Niezawodność WiFi).
- Dodano optymalizacje, które pozwoliły na zwiększenie wydajności przetwarzania przychodzących pakietów UDP o 12% podczas przeprowadzania testów obciążeniowych w sieci 100-gigabitowej.
- Sprzęt
- W sterowniku AMDGPU zrealizowano wsparcie 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 i JPEG 5.3.
- W sterowniku Nouveau poprawiono zarządzanie częstotliwością na systemach Tegra 186+.
- W sterowniku i915 dodano wstępna obsługa bloków IP wyświetlacza Xe3p_LPD, stosowanych w procesorach Intel Nova Lake-P.
- Kontynuowano Prace nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU opartego na architekturze Intel Xe, który jest używany w kartach graficznych Intel z rodziny Arc oraz w grafice zintegrowanej, począwszy od procesorów Tiger Lake. Dodano tryb Multi Queue. Dodano komponenty niezbędne do diagnozowania zawieszeń GPU w Mesa. Dodano wsparcie dla mechanizmu MERT do zarządzania dostępem do pamięci GPU.
- Kontynuowano integracja komponentów sterownika Nova dla GPU NVIDIA, wyposażonych w oprogramowanie GSP, używanych począwszy od serii NVIDIA GeForce RTX 2000 opartej na mikroarchitekturze Turing. Sterownik został napisany w języku Rust. W nowej wersji przygotowano wsparcie dla GPU opartego na mikroarchitekturze Turing oraz wprowadzono różne wewnętrzne zmiany.
- 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 złączek typu C, używanych w urządzeniach opartych na chipach Apple Silicon, łączących interfejsy USB3, DP-AltMode oraz Thunderbolt/USB4.
- Dodano wsparcie dla subsystemó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ński Fundusz Wolnego Oprogramowania utworzyła wariant całkowicie wolne jądro 7.0 – Linux-libre 7.0-gnu, oczyszczone z elementów oprogramowania i sterowników zawierających niewolne komponenty lub fragmenty kodu, których zasięg ogranicza producent. W wydaniu 7.0 przeprowadzono oczyszczenie z blobów sterownika iwlwifi. Zaktualizowano kod oczyszczania w sterownikach amdgpu, adreno, TI PRUeth, air_en8811h, ath12k, TI VPE, rtw8852b, rt1320, rt5575 SPI, tas2783, Intel catpt. Wykonano oczyszczenie nazw blobów w plikach dts (devicetree) dla chipów ARM.
Źródło: linux.org.ru
