Wydanie jądra Linux 6.9

Po dwóch miesiącach prac, Linus Torvalds zaprezentował wydanie jądra Linux 6.9. Spośród najważniejszych zmian: moduł dm-vdo do deduplikacji i kompresji urządzeń blokowych, tryb dostępu do plików w FUSE, wsparcie dla tworzenia pidfd dla poszczególnych wątków, mechanizm tokenów BPF, wsparcie dla Rust na systemach ARM64, przekształcenie systemu plików Ext2 w działający archaicznie, usunięcie starego sterownika NTFS, wsparcie dla mechanizmu Intel FRED.

W nowej wersji wprowadzono 15680 poprawek od 2106 deweloperów, rozmiar łatki wynosi 54 MB (zmiany dotknęły 11825 plików, dodano 687954 linie kodu, usunięto 225344 linie). W poprzednim wydaniu było 15641 poprawek od 2018 deweloperów, rozmiar łatki wynosił 44 MB. Około 42% wszystkich przedstawionych w 6.9 zmian dotyczy sterowników urządzeń, około 17% zmian ma związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 13% dotyczy stosu sieciowego, 7% — systemów plików, a 4% z wewnętrznymi podsystemami jądra.

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

  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • W Device Mapper (DM) dodano nowy przetwornik dm-vdo (virtual data optimizer), umożliwiający, na podstawie istniejących urządzeń blokowych, utworzenie wirtualnego urządzenia blokowego, które oferuje takie możliwości, jak deduplikacja powtarzających się danych, kompresja danych, eliminacja pustych bloków oraz zwiększanie rozmiaru urządzenia blokowego w miarę pojawiającej się potrzeby (thin provisioning). Wskazane możliwości są realizowane na poziomie urządzenia blokowego i nie zależą od używanego systemu plików (na przykład, przy użyciu dm-vdo można zrealizować automatyczne łączenie dublujących się danych i przechowywanie informacji w skompresowanej formie dla dowolnych systemów plików). Wspierane jest wykorzystanie dm-vdo dla fizycznych magazynów o rozmiarze do 256 TB oraz tworzenie logicznych woluminów o rozmiarze do 4 PB. Do zarządzania partycjami vdo zaleca się używanie lvm. Technologia VDO została opracowana przez firmę Permabit i otwarta po jej przejęciu przez Red Hat w 2017 roku.
    • W podsystemie FUSE, stosowanym do realizacji systemów plików w przestrzeni użytkownika, dodano wstępną implementację trybu „passthrough”, pozwalającą na bezpośrednie na poziomie jądra uzyskiwanie danych plików, omijając proces pracujący w przestrzeni użytkownika, co pozwala w niektórych sytuacjach znacznie zwiększyć wydajność. Na przykład, implementacje FUSE systemów plików działające w trybie tylko do odczytu i ograniczające dostęp do plików mogą zwracać zawartość plików z oryginalnego systemu plików bez ich przekazywania do procesu FUSE.
    • Do kategorii przestarzałych (deprecated) przeniesiono sterownik implementacji systemu plików Ext2. Jako powód podano wsparcie w sterowniku tylko 32-bitowych liczników czasu w inode, które przepełnią się 19 stycznia 2038 roku. Zamiast sterownika ext2 zaleca się użycie sterownika ext4, który obsługuje pracę z systemem plików Ext2 i jest z nim całkowicie zgodny, ale może używać w podziałach ext2 znaczników czasu, które nie są narażone na problem 2038 roku, jeśli system plików został utworzony z inode o rozmiarze większym niż 255 bajtów (w sterowniku ext2 32-bitowe liczniki czasu były używane niezależnie od rozmiaru inode).
    • Usunięto stary sterownik systemu plików NTFS, którego miejsce zajął nowy sterownik NTFS3, dostępny od wersji 5.15. Dostarczanie w jądrze dwóch sterowników z implementacją NTFS uznano za niecelowe, biorąc pod uwagę, że stary sterownik nie był aktualizowany od wielu lat, jest w opłakanym stanie i może działać tylko w trybie do odczytu.
    • W systemach plików zonefs i hugetlbfs dodano wsparcie dla mapowania identyfikatorów użytkowników zamontowanych systemów plików, stosowanego dowiązywania plików określonego użytkownika w zamontowanej obcej partycji z innym użytkownikiem w obecnym systemie.
    • W NFSv4 udostępniono administratorom możliwość czyszczenia stanów otwarcia i blokady plików.
    • W systemie plików Ext4 odnotowano jedynie poprawki błędów oraz aktualizację testów kunit.
    • W Btrfs kontynuowano przenoszenie funkcji do wykorzystania foliantów stron pamięci (page folios).
    • W systemie plików XFS kontynuowane są prace nad implementacją możliwości użycia narzędzia fsck do sprawdzania i naprawy wykrytych problemów w trybie online, bez odmontowywania systemu plików.
    • Do wywołania systemowego pwritev2() dodano flagę RWF_NOAPPEND, która pozwala na wskazanie przesunięcia do zapisu, nawet jeśli plik został otwarty w trybie tylko do dodawania danych na końcu pliku.
    • Dodano nowe polecenia ioctl: FS_IOC_GETUUID — zwraca identyfikator UUID określonego systemu plików, oraz FS_IOC_GETFSSYSFSPATH — definiuje lokalizację w /sys/fs zadanego zamontowanego systemu plików.
    • Systemy plików efs, qnx4 i coda zostały przekształcone do używania nowego API montowania partycji.
    • Udoskonalono realizację operacji na plikach wykonywanych w trybie bez rozróżnienia wielkości liter. Zwiększono wydajność dzięki wstępnemu porównaniu z uwzględnieniem wielkości liter i powrotem do wyszukiwania bez rozróżnienia wielkości liter. Rozwiązano problemy podczas montowania overlayfs na katalogach, dla których ustawiony został tryb bez rozróżnienia wielkości liter.
  • Pamięć i usługi systemowe
    • Wdrożono wsparcie dla mechanizmu Intel FRED (Flexible Return and Event Delivery), zaprojektowanego w celu zwiększenia efektywności i niezawodności dostarczania informacji o niskopoziomowych zdarzeniach, w porównaniu z obecnie stosowanym mechanizmem IDT (Interrupt Descriptor Table). Zwiększenie wydajności i redukcja opóźnień są możliwe dzięki zwracaniu zdarzeń instrukcją procesora IRET zamiast przesyłania zdarzeń przez tabelę IDT. Niezawodność jest zwiększona dzięki oddzielnemu przetwarzaniu przychodzącego zdarzenia w kontekście jądra oraz w kontekście użytkownika, ochronie przed zagnieżdżonym wykonywaniem NMI oraz przechowywaniu w rozszerzonej ramce stosu wszystkich rejestrów CPU związanych z wyjątkiem.
    • Dodano możliwość optymalizacji dostępu do danych poszczególnych rdzeni CPU poprzez wykorzystanie w kodzie jądra nazwanych przestrzeni adresowych (Named Address Spaces), zaimplementowanych w GCC jako rozszerzenie GNU C.
    • Do funkcji pidfd_open() dodano flagę PIDFD_THREAD, która umożliwia tworzenie pidfd dla poszczególnych wątków, a nie tylko używanie pidfd w kontekście lidera grupy wątków. Zaproponowano również realizację pseudo-FS do uzyskania dostępu do pidfd przez wirtualny system plików. W przeciwieństwie do identyfikacji procesów za pomocą pid, identyfikator pidfd jest związany z konkretnym procesem i nie zmienia się, podczas gdy PID po zakończeniu bieżącego procesu może być przypisany do innego procesu.
    • W podsystemie BPF dodano mechanizm tokenów BPF, który umożliwia wybiórcze delegowanie aplikacjom praw dostępu do uprzywilejowanych operacji BPF, na przykład można przyznać aplikacji bez uprawnień dostęp do pojedynczych podsystemów BPF bez nadawania pełnych praw CAP_BPF.
    • W podsystemie BPF dodano nowy typ pamięci dzielonej bpf_arena, definiujący obszar dostępny do współdzielenia przez programy BPF i procesy w przestrzeni użytkownika. Dodano instrukcję may_goto, która umożliwia organizację pracy pętli, które mogą być przerywane przez weryfikator. Dodano możliwość generowania z programów BPF losowych ciasteczek TCP SYN i tworzenia BPF-obsługiwaczy do walki z SYN flood.
    • Kontynuowany jest transfer 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 prowadzi do włączenia Rust do obowiązkowych zależności budowlanych jądra). Dodano wsparcie dla użycia języka Rust do pracy na 64-bitowych procesorach ARM. Zrealizowano przejście na wersję Rust 1.76. Dodano makro ‘container_of!’. Zamiast niestabilnej funkcji ‘ptr_metadata’ wykorzystano stabilną metodę ‘byte_sub’. Dodano moduł ‘time’ z funkcją konwersji czasu ‘msecs_to_jiffies()’.
    • W podsystemie io_uring dodano możliwość skracania plików (ftruncate_file).
    • Dodano nowy typ kolejek roboczych WQ_BH (workqueue Bottom Halves) do asynchronicznego wykonywania kodu w kontekście przerwań programowych, mający na celu zastąpienie przestarzałych taskletów.
    • Znacząco przebudowano podsystem zarządzania timerami, w którym poprawiono logikę wyboru aktywnego rdzenia CPU do wykonania aktywnego timera, aby nie wybudzać z trybu uśpienia nieaktywnych rdzeni.
    • Zrealizowano możliwość aktualizacji modelu zużycia energii jądra (EM, Energy Model) w trakcie pracy, co może być wykorzystywane, na przykład, do uwzględnienia wpływu temperatury roboczej na efektywność energetyczną CPU. Znacząco zwiększono wydajność funkcji em_cpu_energy(), która w testach na stacjonarnym systemie działa teraz 1.43 razy szybciej, a w teście na płycie RockPi 4B — 1.69 razy.
    • Dodano wsparcie dla uruchamiania systemów opartych na architekturze ARM64 w trybie LPA2 z 52-bitową przestrzenią adresową.
    • Dla systemów ARM64 wprowadzono wsparcie dla ciągłych wpisów PTE (Page Table Entry), co pozwala na zwiększenie wydajności poprzez poprawę efektywności wykorzystania TLB (Translation Lookaside Buffer).
    • Zaakceptowano łatki poprawiające wydajność podsystemu zarządzania pamięcią poprzez zmniejszenie występowania konkurencyjnych blokad w vmalloc().
    • Dla architektury LoongArch wdrożono mechanizm gorącego nakładania poprawek na jądro (live patching), umożliwiający stosowanie poprawek do jądra bez przerywania pracy.
    • Dla systemów RISC-V wprowadzono obsługę wywołania systemowego membarrier(), które zapewnia ustalanie barier pamięci dla pracujących w systemie wątków.
    • Podniesiono wymagania dotyczące wersji LLVM/Clang, której można używać do kompilacji jądra. Do kompilacji wymagany jest teraz co najmniej wersja LLVM 13.0.1 (wcześniej wspierana była kompilacja w LLVM 11+).
    • Do mechanizmu „User trace events”, który umożliwia tworzenie zdarzeń śledzenia z procesów użytkownika w celu monitorowania aktywności w przestrzeni użytkownika, dodano wsparcie dla eksportu informacji o zdarzeniu w różnych formatach (USER_EVENT_REG_MULTI_FORMAT).
    • W mechanizmie śledzenia wywołań funkcji dodano możliwość monitorowania stanu wchodzących argumentów funkcji podczas śledzenia powrotu z funkcji. Wartości operatora return można teraz powiązać z argumentami użytymi przy wywołaniu funkcji.
    • Do narzędzia perf dodano wsparcie dla trybu agregacji wyjścia „cluster” („perf stat -a —per-cluster”) do łączenia statystyk zasobów współdzielonych. Wprowadzono możliwość wykorzystania biblioteki libcapstone do dezasemblowania instrukcji procesora („perf script -F disasm”). Przeprowadzono optymalizacje zużycia pamięci podczas wykonywania poleceń perf report oraz perf annotate.
  • Wirtualizacja i bezpieczeństwo
    • Dodano ochronę przed podatnością RFDS (Register File Data Sampling) w procesorach Intel Atom, umożliwiającą wydobycie pozostałych informacji z rejestrów (RF, Register File) procesora, które są używane do wspólnego przechowywania zawartości rejestrów we wszystkich zadaniach na tej samej rdzeniu CPU. Aby zablokować podatność, wymagane jest zaktualizowanie mikrokodu i użycie instrukcji VERW do oczyszczenia zawartości buforów mikroarchitektonicznych w momencie powrotu z jądra do przestrzeni użytkownika. Aby włączyć ochronę przy uruchamianiu jądra, można podać flagę „reg_file_data_sampling=on”. Informacje o podatności na podatność i dostępności niezbędnego mikrokodu można ocenić w pliku „/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling”.
    • Dodano podstawowe wsparcie dla ochrony systemów gościnnych za pomocą rozszerzenia AMD SEV-SNP (Secure Nested Paging), które zapewnia bezpieczną pracę z zagnieżdżonymi tabelami stron pamięci i chroni przed atakami „undeSErVed” oraz „SEVerity” na procesorach AMD EPYC, umożliwiających obejście mechanizmu ochrony AMD SEV (Secure Encrypted Virtualization). W KVM niezbędne do wykorzystania SNP zmiany planowane są do dodania w gałęzi 6.10.
    • Moduły z implementacją technologii IMA (Integrity Measurement Architecture) i EVM (Extended Verification Module) zostały przekształcone na użycie frameworka LSM (Linux Security Modules), co bez utraty funkcjonalności pozwoliło znacznie uprościć kod, połączyć powtarzającą się funkcjonalność i wykorzystać dostępne przez LSM typowe możliwości. Moduł IMA ma na celu weryfikację integralności komponentów systemu operacyjnego na podstawie podpisów cyfrowych i skrótów. Moduł EVM pozwala zabezpieczyć rozszerzone atrybuty plików (xattrs) przed atakami, które mają na celu naruszenie ich integralności (EVM nie pozwoli przeprowadzić ataku offline, w którym napastnik mógłby zmienić metadane, na przykład rozruchując ze swojego nośnika).
    • Przerobiono dla większej kompatybilności z 32-bitowymi środowiskami wywołania systemowe lsm_list_modules(), lsm_get_self_attr() i lsm_set_self_attr(), przeznaczone do wyświetlania listy załadowanych modułów LSM (Linux Security Modules) oraz uzyskiwania/wystawiania atrybutów modułu LSM. Zmiana narusza wsteczną zgodność, ale ponieważ nowe wywołania systemowe zostały dodane w poprzednim wydaniu jądra i na razie nie są używane w aplikacjach, Linus Torvalds uznał, że zmiana jest dopuszczalna.
    • Podjęto próbę przywrócenia działania mechanizmu UBSAN (Undefined Behavior Sanitizer). Sedno problemu polega na tym, że kompilatory różnie obsługują przepełnienia całkowite typów ze znakami i bez. Przepełnienia ze znakami oraz przepełnienia wskaźników należą do kategorii zachowań nieokreślonych, natomiast przepełnienia bezznakowe są weryfikowane według modułu 2n, zachowując jedynie najmłodsze bity wyniku („wrap-around”), co nie kwalifikuje ich jako zachowanie nieokreślone. Aby wyeliminować sytuacje prowadzące do wystąpienia zachowania nieokreślonego, jądro jest kompilowane z opcją „-fno-strict-overflow”, co prowadzi do stosowania „wrap-around” dla wszystkich przepełnień całkowitych. GCC i Clang nie potrafią poprawnie diagnozować niektórych problemów przy użyciu flagi „-fno-strict-overflow”, a włączenie UBSAN ma na celu współpracę z twórcami kompilatorów w celu usunięcia nieprawdziwych alarmów oraz identyfikacji przepełnień całkowitych w miejscach, w których brak jest jawnych sprawdzeń.

      Do sprawdzania możliwych przepełnień w jądrze stosowane są konstrukcje typu „var + offset PAGE_SHIFT) < pgoff){..}"), które opierają się na kompilacji z flagą "-fno-strict-overflow" i nie obejmują całego kodu, w którym potencjalnie może wystąpić przepełnienie. Problem polega na tym, że przy użyciu UBSAN takie sprawdzenia prowadziły do wyświetlenia dużej liczby fałszywych ostrzeżeń, z tego powodu w 2021 roku UBSAN musiał zostać wyłączony. W zaktualizowanej implementacji zaproponowano zastosowanie specjalnych adnotacji __signed_wrap oraz __unsigned_wrap, a także gotowych makr z kontrolami add_would_overflow(a, b) i add_wrap(a, b), które pozwalają oddzielić zamierzone przez twórców użycie przepełnień całkowitych od przypadkowych przepełnień, które mogą prowadzić do podatności. Propozycja znacznej przebudowy jądra poprzez wprowadzenie dodatkowych definicji typów została odrzucona przez Linusa Torvaldsa.

  • Subsystem sieciowy
    • Przeprowadzono prace w systemie sieciowym mające na celu zmniejszenie występowania konkurencyjnych blokad („lock contention”, próba uzyskania blokady, która jest utrzymywana przez inny wątek). Zredukowano użycie blokad RTNL.
    • Dodano wsparcie dla aktywnego polowania na gniazda (busy polling) w kontekście poszczególnych wywołań epoll. Rozmiar puli i parametry budżetowe mogą być ustawiane niezależnie od domyślnych parametrów systemowych.
    • Zrealizowano strukturę net_hotdata w celu zwiększenia efektywności buforowania najczęściej używanych zmiennych konfiguracji sieciowej.
    • W MPTCP dodano wsparcie dla opcji TCP_NOTSENT_LOWAT dla gniazd, umożliwiające ograniczenie rozmiaru bufora wysyłania. W API dla gniazd MCTP dodano wsparcie identyfikatorów sieci („network ID”), co pozwala na korzystanie z kilku nieprzecinających się sieci MCTP na jednym hoście.
    • W IPSec dodano wsparcie dla przekierowywania komunikatów ICMP z informacjami o błędach (RFC 4301).
    • Przyspieszono proces skanowania tras z wygasłymi czasami życia.
    • Przyspieszono działanie XDP dzięki bardziej rygorystycznemu unikaniu przydzielania dużych bloków pamięci.
    • Dodano możliwość dołączania metadanych do komunikatów netconsole.
    • W Netfilter zezwolono na definiowanie w przestrzeni użytkownika tabel, które są związane z zarządzającym procesem w tle i nie są automatycznie usuwane po zakończeniu aplikacji użytkownika.
    • W nftables przyspieszono dodawanie elementów do zestawów set z połączonymi zakresami.
  • Sprzęt
    • W sterowniku i915 kontynuowano prace nad wsparciem chipów Intel LunarLake (Xe 2). Dodano nowe identyfikatory PCI dla urządzeń opartych na chipach Intel Arrow Lake i Alder Lake N. Dla DisplayPort dodano wsparcie dla tunelowania (DP tunneling) oraz przydziału pasma (bandwidth allocation). Dla wszystkich platform włączono tryb fastboot. Dodano wsparcie dla wyjścia debugowego powiązanego z poszczególnymi urządzeniami.
    • W sterowniku AMDGPU przygotowano się do wdrożenia wsparcia dla GPU AMD RDNA3.5 i RDNA4. Dodano wsparcie dla 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 oraz frameworka RAS ACA. Do modułu jądra dodano parametr freesync_video do włączenia eksperymentalnego wsparcia dla optymalizacji przełączania trybów wideo z wykorzystaniem technologii adaptywnej synchronizacji FreeSync.
    • W sterowniku Nouveau kod obsługi wyświetlacza został przetłumaczony na użycie funkcji kmemdup().
    • Kontynuowane są 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 zintegrowanej grafice, począwszy od procesorów Tiger Lake.
    • Dodano sterownik DRM dla chipów Mediatek MT8188 VDOSYS1.
    • Powiązane z podsystemami wideo ustawienia jądra przeniesiono do sekcji CONFIG_VIDEO.
    • Dodano wsparcie dla SoC ARM64: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
    • Dodano wsparcie dla płyt ARM i urządzeń: telefony z Androidem oparte na chipie Tegra30, modele Chromebook oparte na Mediatek MT8186, NAS, tablety i konsole do gier oparte na Rockchips RK35xx, płytę White Hawk opartą na SoC Renesas, płyty oparte na Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
    • Przeprowadzono refaktoryzację kodu podsystemu dźwięku ALSA. Dodano wsparcie dla systemów dźwiękowych Microchip SAM9x7, NXP i.MX95 oraz Qualcomm WCD939x. W sterowniku SoundWire dodano wsparcie ASoC z procesorami dźwiękowymi AMD ACP 6.3, a dla systemów Intel wdrożono tryb DSPless. Dodano wsparcie dla dodatkowych kodeków dźwiękowych Cirrus HD. W sterowniku virtio poprawiono zarządzanie urządzeniami dźwiękowymi.
    • Dodano wsparcie dla kontrolerów Ethernet Marvell Octeon PCI Endpoint NIC VF oraz Intel E825-C 100G.

Jednocześnie latynoamerykańska Fundacja Wolnego Oprogramowania opracowała w pełni wolne jądro 6.9 — Linux-libre 6.9-gnu, oczyszczone z elementów firmware i sterowników zawierających komponenty lub fragmenty kodu, których zakres zastosowania jest ograniczony przez producenta. W wydaniu 6.9 zaktualizowano kod oczyszczania blobów w sterownikach amdgpu, ath12k, adreno, btusb i r8169. Przeprowadzono oczyszczenie nowego sterownika ptp_fc3. Przeprowadzono oczyszczenie nazw blobów w plikach dts (devicetree) dla architektury Aarch64. Usunięto problemy z oczyszczaniem sterownika i915, które prowadziły do zawieszania się podczas inicjalizacji. Wprowadzono zmiany związane z przetwarzaniem blobów dostarczanych w postaci heksadecymalnych zrzutów.

Ź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