Wydanie jądra Linux 6.17

Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.17. Wśród najbardziej zauważalnych zmian znajdują się: zwiększenie wydajności Btrfs, wywołania systemowe file_getattr() i file_setattr(), unifikacja konfiguracji jednoprocesorowych i wieloprocesorowych w harmonogramie zadań, moduł DAMON_STAT z statystyką dostępu do pamięci, wsparcie dla live patching na systemach ARM64, przesyłanie zrzutów rdzeni przez gniazdo AF_UNIX, ograniczanie SCHED_EXT przez cgroup, uproszczona konfiguracja ochrony przed lukami w CPU, kompilacja w Clang z inicjalizacją zmiennych na stosie, ochrona przed oszustwem w /proc, rozszerzenie podsystemu RV (Runtime Verification), ograniczenie gniazd AF_UNIX przez AppArmor, algorytm kontroli przeciążenia TCP DualPI2.

Nowa wersja zawiera 14334 poprawek od 2118 programistów, rozmiar łaty wynosi 46 MB (zmiany obejmują 12841 plików, dodano 646654 linie kodu, usunięto 398782 linie). W poprzednim wydaniu było 15924 poprawek od 2145 programistów, rozmiar łaty wynosił 50 MB. Około 43% wszystkich zmian w 6.17 dotyczy sterowników urządzeń, około 12% zmian odnosi się do aktualizacji kodu specyficznego dla architektur sprzętowych, 14% związane jest z stosem sieciowym, 4% – z systemami plików, a 3% z wewnętrznymi podsystemami jądra.

Główne nowości w jądrze 6.17 (1, 2, 3):

  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • W Btrfs dodano eksperymentalne wsparcie dla dużych folio stron pamięci (large folios), co pozwala na obniżenie kosztów i zwiększenie wydajności szeregów operacji. Wdrożono cache zapytań do bitmap rozkładu wolnego miejsca, dzięki czemu wydajność tworzenia pustych plików wzrosła o 20%. Ulepszono działanie wstępnego odczytu w systemach wykorzystujących kompresję danych. Zapewniono gęstsze rozmieszczenie kluczy w strukturze XArray, co zwiększyło kompaktowość przechowywania węzłów drzewa extentów i pozwoliło na skrócenie liczby końcowych węzłów o 50-70%. Zapewniono dodatkowe ustawienia użycia kompresji w zdefragmentowanych extentach.
    • W systemie plików ext4 dodano wsparcie dla buforowanego wejścia/wyjścia z flagą RWF_DONTCACHE, przy której dane są usuwane z pamięci podręcznej stron natychmiast po zakończeniu operacji.
    • W systemie plików EROFS wdrożono wsparcie dla kompresji metadanych.
    • Serwer NFS może teraz delegować operacje zapisu klientom, którzy otwierają pliki w trybie tylko do odczytu.
    • Do wywołania systemowego fallocate() dodano flagę FALLOC_FL_WRITE_ZEROES, która umożliwia wypełnienie zerami określonego zakresu w pliku, wykorzystując polecenie WRITE_ZERO obsługiwane przez niektóre dyski SSD, realizujące zerowanie bez operacji wejścia/wyjścia. Opcja ta jest na razie dostępna tylko w systemie plików ext4.
    • Dodano wywołania systemowe file_getattr() i file_setattr() do manipulacji atrybutami inode określonego pliku.
    • Usunięto sterownik „pktcdvd” do obsługi nośników optycznych w trybie pakietowym, który został oznaczony jako przestarzały w 2016 roku.
    • System plików Bcachefs w jądrze Linux przeszedł na tryb zewnętrznego wsparcia, co oznacza zaprzestanie przyjmowania zmian dla Bcachefs do głównego składu jądra, przy zachowaniu tego systemu plików w kodzie źródłowym jądra. Rozwój Bcachefs będzie się odbywał poza kodem jądra, dopóki Kent Overstreet nie udowodni właściwego współdziałania z innymi deweloperami jądra oraz zdolności do przestrzegania ustalonych zasad rozwoju.
  • Pamięć i usługi systemowe
    • Wsparcie dla konfiguracji jednoprocesorowych zostało usunięte z planisty zadań. Na systemach z jednym procesorem należy teraz korzystać z jąder skompilowanych dla systemów wieloprocesorowych (SMP). Kod dla systemów jednoprocesorowych i wieloprocesorowych został unifikowany i pozbawiony zbędnych powiązań z parametrem jądra CONFIG_SMP.
    • Dodano moduł jądra DAMON_STAT (Statystyka wyników monitorowania dostępu do danych), który umożliwia śledzenie dostępu do pamięci operacyjnej, wykorzystując podsystem DAMON (monitorowanie dostępu do danych). Moduł dostarcza statystyki dotyczące nieaktywności (memory_idle_ms_percentiles) oraz prognozowanej przepustowości pamięci (estimated_memory_bandwidth).
    • Na systemach z architekturą ARM64 zaimplementowano wsparcie dla Live-patchy, które pozwalają na stosowanie poprawek do jądra Linux w locie, bez potrzeby restartowania i zatrzymywania systemu.
    • W minimalistycznej bibliotece C nolibc, dołączonej do źródeł jądra Linux i oferującej interfejs do podstawowych wywołań systemowych, dodano wsparcie dla architektur SuperH, x32, MIPS n32 oraz MIPS n34.
    • Rozszerzono możliwość przesyłania zawartości core-dumpów przez gniazdo AF_UNIX, co umożliwia tworzenie w przestrzeni użytkownika bardziej bezpiecznych handlerów core-dumpów, niezwiązanych z wywołaniem przez jądro procesów uprzywilejowanych. W nowej wersji dodano protokół do tworzenia. serwerów, zdolnych do zarządzania przetwarzaniem zrzutów pamięci na poziomie poszczególnych zadań. Na przykład, dla niektórych procesów można zignorować zrzuty pamięci, a dla innych przesłać je przez gniazdo. Odzielnie przygotowano prototyp serwera do zarządzania zrzutami pamięci.
    • Dodano opcję wiersza poleceń jądra „crashkernel=size,cma” do rezerwacji przez CMA (Contiguous Memory Allocator) miejsca w pamięci na zrzut pamięci jądra.
    • Rozszerzono możliwości mechanizmu pidfd, który umożliwia korzystanie z identyfikatorów związanych z określonymi procesami i w przeciwieństwie do pid nie są one ponownie przypisywane. Dodano możliwość powiązania z pidfd rozszerzonych atrybutów z przestrzeni użytkownika. Zezwolono na otwieranie deskryptorów plików dla pidfd za pomocą funkcji open_by_handle_at() bez powiązania z systemem plików. Informacje wewnętrzne utworzone przez jądro wraz z pidfd są teraz powiązane z procesem, a nie pidfd, i są przechowywane między ponownym otwarciem tego samego procesu.
    • W podsystemie BPF dodano funkcję bpf_cgroup_read_xattr() do odczytu rozszerzonych atrybutów plików. Umożliwiono korzystanie w programach BPF z typowych operacji na łańcuchach, takich jak bpf_strcmp, bpf_strnchr, bpf_strchrnul, bpf_strlen i bpf_strspn, działających w trybie tylko do odczytu. Dodano możliwość korzystania z standardowych strumieni stdout i stderr do interakcji z komponentami w przestrzeni użytkownika. Dla systemów opartych na architekturze LoongArch w BPF wprowadzono możliwość dynamicznej modyfikacji kodu, mechanizm „BPF trampoline” (zmniejsza narzuty przy przekazywaniu wywołań między jądrem a programami BPF) oraz uruchamiania programów korzystających ze struct_ops do tworzenia obsługi funkcji jądra przez BPF.
    • W systemie pomiaru czasu wprowadzono wsparcie dla pomocniczych zegarów (auxiliary), które nie są powiązane z normalnymi zegarami systemowymi i działają w swoim własnym rytmie (wcześniej wszystkie zegary działały w tym samym rytmie i różniły się tylko przesunięciem).
    • Dodano wstępne wsparcie dla wykonania proxy (Proxy Execution) w celu złagodzenia problemów związanych z odwrotną priorytetyzacją. Wykonanie proxy pozwala zadaniu czekającemu na zwolnienie blokady przekazać swój kontekst wykonania zadaniu, które utrzymuje blokadę, aby przyspieszyć zwolnienie tej blokady.
    • Kontynuowane prace nad przenoszeniem zmian z gałęzi Rust-for-Linux związanych z używaniem języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra (wsparcie dla Rust nie jest domyślnie aktywne i nie prowadzi do dodania Rust do obowiązkowych zależności budowlanych jądra). Dodano abstrakcje do zarządzania regulatorami napięcia i prądu, właściwościami oprogramowania, zasobami wejścia/wyjścia oraz pamięcią wejścia/wyjścia. Zaimplementowano makro „warn_on!()”. Dodano typ UserPtr dla wskaźników w przestrzeni użytkownika. Rozszerzono funkcjonalność modułów workqueue, uaccess, dma, time oraz list. Dodano moduł 'bits' z funkcjami 'bit' i 'genmask'.
    • Przeprojektowano kod do obliczania sum kontrolnych CRC oraz dodano nowe wywołania do generacji hashy SHA-1 i SHA-2. Dodano specyficzne dla architektur sprzętowych optymalizacje. Zwiększono wydajność funkcji crc32c() na nowych procesorach x86_64, które wspierają rozszerzenie VPCLMULQDQ (Vector Carry-Less Multiplication of Quadwords).
    • Dla systemów S390 zaimplementowano wsparcie dla wymuszenia do pamięci w pliku wymiany oraz migracji dużych stron pamięci (transparent huge page).
    • Dodano możliwość konfigurowania agresywności zwalniania stron pamięci (proactive-reclaim) w przypadku jej niedoboru przypisanego do poszczególnych węzłów NUMA, co pozwala na wyodrębnienie węzłów NUMA, dla których zastosowane będzie bardziej aktywne zwalnianie pamięci. Na przykład, „echo „512M swappiness=10” > /sys/devices/system/node/node1/reclaim”.
    • Do mechanizmu SCHED_EXT, który pozwala na użycie BPF do tworzenia schedulerów CPU, dodano możliwość zarządzania przepustowością przez cgroup. Na przykład, można użyć parametru cpu.max do ograniczenia obciążenia CPU.
    • Ogłoszono przestarzałą automatyczną montaż wirtualnego systemu plików tracefs w katalogu /sys/kernel/debug/tracing, zamiast tego należy używać /sys/kernel/tracing.
  • Wirtualizacja i bezpieczeństwo
    • Dodano możliwość włączenia ochrony przed podatnościami w CPU poprzez wybór blokowanych wektorów ataku. zamiast wskazywania w ustawieniach konkretnych podatności. Metody blokowania są wybierane w zależności od rodzaju naruszenia izolacji: między użytkownikiem a rdzeniem (user-kernel), między użytkownikiem a innym użytkownikiem (user-user), między systemem gościa a środowiskiem hosta (guest-host), między różnymi systemami gośćmi (guest-guest) oraz między różnymi wątkami (cross-thread). Proponowane podejście pozwala aktywować tylko ochronę przed tymi klasami podatności, które rzeczywiście niepokoją użytkownika. Na przykład właściciele środowisk chmurowych mogą włączyć tryby guest-host i guest-guest, co aktywuje metody ochrony przed podatnościami BHI, GD, L1TF, MDS, MMIO, Retbleed, RFDS, Spectre_v2, SRBDS, SRSO i TAA.
    • Dodano wsparcie dla kompilacji za pomocą kompilatora Clang z włączonym trybem śledzenia głębokości stosu, w którym inicjowane są wszystkie zmienne przechowywane na stosie. Inicjalizacja jest przeprowadzana w celu zapobieżenia wyciekom informacji z jądra przez nieinicjowane zmienne, które mogą zawierać pozostałości wcześniejszych danych zapisanych na stosie. Wcześniej podobna funkcjonalność była wspierana przy użyciu wtyczki GCC STACKLEAK.
    • Dodano ochronę przed podmienieniem atakujących systemu plików /proc przez montowanie w trybie „bind”. Numer inode korzenia /proc jest teraz stały (PROCFS_ROOT_INO) i może być sprawdzany przez proces w przestrzeni użytkownika.
    • Do podsystemu RV (Runtime Verification), przeznaczonego do weryfikacji poprawności działania systemów o wysokiej niezawodności, dodano komponent monitorowania rtapp (Monitor aplikacji w czasie rzeczywistym) do śledzenia typowych problemów w aplikacjach działających w czasie rzeczywistym, a także komponenty rp, sssw i opid do testowania harmonogramu zadań. Wprowadzono możliwość tworzenia komponentów monitorujących, które wykorzystują liniową logikę temporalną zamiast deterministycznego automatu do określenia modelu zachowania. Weryfikacja odbywa się w czasie rzeczywistym poprzez przyczepianie obsługi błędów do punktów śledzenia, porównujących rzeczywisty przebieg wykonania z wcześniej określonym wzorcowym modelem, definiującym oczekiwane zachowanie systemu.
    • Do systemu AppArmor dodano wsparcie dla zarządzania dostępem do gniazd AF_UNIX.
    • W hipernadzorze KVM na systemach ARM wprowadzono wsparcie dla kontrolera przerwań GICv5.
    • Dodano ustawienie CONFIG_KVM_IOAPIC, które pozwala wyłączyć wsparcie dla emulacji APIC, PIC i PIT w KVM.
    • Dodana ochrona przed podatnością VMSCAPE.
    • Dodana komenda ioctl FS_IOC_GETLBMD_CAP do uzyskiwania w przestrzeni użytkownika informacji o zastosowanych środkach ochrony integralności pliku.
    • Interfejs /sys/fs/selinux/user został uznany za przestarzały, a jego użycie będzie skutkowało pięciosekundowym opóźnieniem oraz wyświetleniem ostrzeżenia w logu.
  • Subsystem sieciowy
    • W implementacji technologii PSE (Power Sourcing Equipment), używanej do zasilania przez Ethernet takich urządzeń jak kamerki IP i punkty dostępowe, dodano wsparcie dla konfigurowalnych strategii oceny budżetu zasilania (całkowitej dostępnej mocy). Takie strategie pozwalają określić, które porty powinny zostać wyłączone jako pierwsze, aby zapobiec przeciążeniu.
    • W implementacji protokołu MCTP (Management Component Transport Protocol) dodano wsparcie dla routingu pakietów do zewnętrznych węzłów przez węzły pośrednie (gateway-routing). Przykładowe reguły pozwalają na kierowanie pakietów do węzła o identyfikatorze 10 (Endpoint ID 10) przez urządzenie mctpi2c0, używając adresu 0x1d, bezpośrednio przypiętego do węzła o identyfikatorze 9. mctp route add 9 via mctpi2c0 mctp neigh add 9 dev mctpi2c0 lladdr 0x1d mctp route add 10 gw 9
    • Dla gniazd UNIX (AF_UNIX) zaimplementowano opcję SO_INC, a dla rodziny adresów VSOCK opcję SIOCINQ. Zaimplementowane opcje są analogiczne do opcji TCP_INQ dla TCP i umożliwiają uzyskanie informacji o liczbie bajtów dostępnych do odczytu w gnieździe za pomocą komunikatu sterującego.
    • Dla TCP wprowadzono ścisłe przestrzeganie zadeklarowanego rozmiaru okna odbiorczego, które określa rozmiar danych, które mogą być przesyłane do czasu otrzymania potwierdzenia ACK od drugiej strony. Wcześniej jądro kontynuowało przetwarzanie danych przekraczających zadeklarowane okno odbiorcze, ale teraz przestanie to robić.
    • W MPTCP (Multipath TCP) dodano możliwość wykorzystania opcji gniazda TCP_MAXSEG do ograniczenia maksymalnego rozmiaru przesyłanych segmentów. MPTCP jest rozszerzeniem protokołu TCP służącym do dostarczania pakietów jednocześnie przez kilka tras za pomocą różnych interfejsów sieciowych przypisanych do różnych adresów IP.
    • Dodano wsparcie dla algorytmu kontroli przeciążenia TCP DualPI2 (RFC 9332), który umożliwia wykorzystanie skalowalnych kontrolerów przeciążenia dla ruchu o wysokich wymaganiach dotyczących jakości obsługi (np. TCP-Prague i DCTCP), bez wpływu na wydajność klasycznego ruchu, dla którego stosowane są takie kontrolery przeciążenia jak Reno i Cubic.
    • Dodano sysctl „force_forwarding”, który pozwala włączyć przekierowanie ruchu na wybranych interfejsach sieciowych z IPv6.
    • Usunięto wsparcie dla algorytmu określania utraty pakietów SACK (Selective Acknowledgment), opisanego w RFC 6675. Algorytm ten został uznany za przestarzały w 2018 roku. Do określania utraty pakietów TCP rekomenduje się wykorzystanie algorytmu RACK-TLP.
  • Sprzęt
    • Kontynuowana jest praca nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU opartych na architekturze Intel Xe, wykorzystywanych w kartach graficznych Intel z rodziny Arc oraz w grafice zintegrowanej, począwszy od procesorów Tiger Lake. Nowa wersja domyślnie wprowadza wsparcie dla chipów opartych na mikroarchitekturze Panthor Lake oraz dodaje wsparcie dla mikroarchitektury WildCat Lake.
    • W sterowniku AMDGPU dla GPU GFX9.x wdrożono wsparcie dla mechanizmu Cleaner Shader, zapewniającego czyszczenie pamięci GPU przed jej ponownym wykorzystaniem, aby zapobiec wyciekom danych pozostałych po pracy innego procesu. Ulepszono wsparcie dla trybu uśpienia. Dodano możliwość przechodzenia w tryb spoczynku w środowiskach z AMD SR-IOV. Poprawiono zarządzanie podświetleniem.
    • W sterowniku i915 dodano wsparcie dla mechanizmu drm_panic, który wyświetla w przypadku awarii coś na wzór 'niebieskiego ekranu śmierci'. Dodano wsparcie dla kontrolera wyświetlacza używanego w chipach z rodziny Wildcat Lake.
    • Kontynuowana jest integracja komponentów sterownika Nova dla GPU NVIDIA z oprogramowaniem GSP, stosowanym od serii NVIDIA GeForce RTX 2000 opartej na mikroarchitekturze Turing. Sterownik napisany jest w języku Rust. Nowa wersja zawiera poziom abstrakcji do pracy z DMA, wdrożono parser VBIOS, dodano kod do konfiguracji bufora ramek i zapewniono wsparcie dla przyspieszonego rozruchu w trybie Falcon.
    • W sterowniku adreno dodano wsparcie dla GPU Qualcomm Adreno x1-45 i x1-85.
    • W sterowniku msm dodano wsparcie dla GPU Adreno SM8750 oraz mapowania pamięci wideo (VM_BIND).
    • W sterowniku panfrost dodano wsparcie dla GPU Mali, stosowanych w SoC Mediatek mt8370.
    • W sterowniku lima dodano wsparcie dla GPU stosowanych w SoC Rockchip RK3528.
    • Dodano sterownik mtd (Memory Technology Devices) do dostępu do pamięci NVM zintegrowanej z GPU Intel.
    • Dodano wsparcie dla systemów audio ASoC IMX WM8524, AMD ACP7.2, SoundWire ACP 7.1, Fairphone 4 & 5, Qualcomm QCS8275, Framework Laptop 13 (AMD Ryzen AI 300), CS35L41 HDA (stosowanego w laptopach ASUS), Richtek RTQ9124, TI TAS5753, HP EliteBook x360 830 G6, EliteBook 830 G6, LG 16Z90R-A, HP 15-fc000. Przeprowadzono reorganizację kodu HD-audio.
    • Dodano wsparcie dla platform ARM, SoC i urządzeń: NVIDIA Tegra264, Marvell PXA1908 (pierwszy 64-bitowy chip od Marvell dla smartfonów), CIX P1, Axiado AX3000, Sophgo SG2000 (łączącego rdzenie ARM i RISC-V), Mediatek mt6572, exynos2200 (używanego w Samsung Galaxy S22), Renesas R-Car V4M-7, TI am62d2 i Sophgo sg2042, laptopy oparte na Mediatek mt8186 i Qualcomm Snapdragon X1, smartfony i tablety oparte na SoC mt6572, tegra30 i msm8976.

Jednocześnie latynoamerykańska Fundacja Wolnego Oprogramowania opracowała całkowicie wolną wersję jądra 6.17 — Linux-libre 6.17-gnu, oczyszczoną z elementów firmware i sterowników zawierających nieliczne komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W wydaniu 6.17 zaktualizowano kod czyszczenia blobów w sterownikach amdgpu, prueth, iwlwifi, btusb, pci mhi host, adreno a6xx, nova-core i Intel AVS. Przeprowadzono czyszczenie nazw blobów w plikach dts (devicetree) dla chipów ARM i Intel IPU7. Zneutralizowano ładowanie blobów w nowych sterownikach pci hda. Zaprzestano czyszczenia blobów w sterowniku QLogic infiniband, usuniętym z jądra.

Ź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