Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.7. Wśród najbardziej zauważalnych zmian znajdują się: integracja systemu plików Bcachefs, zakończenie wsparcia dla architektury Itanium, możliwość pracy Nouveau z firmware'ami GSP-R, wsparcie dla szyfrowania TLS w NVMe-TCP, możliwość użycia wyjątków w BPF, wsparcie dla futex w io_uring, optymalizacja wydajności harmonogramu fq (Fair Queuing), wsparcie dla rozszerzenia TCP-AO (TCP Authentication Option) oraz możliwość ograniczenia połączeń sieciowych w mechanizmie ochrony Landlock, dodano zarządzanie dostępem do przestrzeni nazw użytkownika oraz io_uring przez AppArmor.
Do nowej wersji przyjęto 18405 poprawek od 2066 deweloperów, rozmiar łatki wynosi 72 MB (zmiany dotknęły 13467 plików, dodano 906147 wierszy kodu, usunięto 341048 wierszy). W poprzednim wydaniu było 15291 poprawek od 2058 deweloperów, rozmiar łatki wynosił 39 MB. Około 45% wszystkich zmian wprowadzonych w 6.7 dotyczyło sterowników urządzeń, około 14% odnosiło się do aktualizacji kodu specyficznego dla architektur sprzętowych, 13% było związane z stosem sieciowym, 5% dotyczyło systemów plików, a 3% dotyczyło wewnętrznych podsystemów jądra.
Główne nowości w jądrze 6.7:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- Do zestawu jądra przyjęto kod systemu plików Bcachefs, w którym podjęto próbę osiągnięcia poziomu wydajności, niezawodności i skalowalności charakterystycznego dla XFS, w połączeniu z elementami rozszerzonej funkcjonalności dostępnej w Btrfs i ZFS. Na przykład Bcachefs obsługuje takie możliwości, jak włączenie do partycji wielu urządzeń, wielowarstwowe układy nośników (dolna warstwa z danymi często używanymi na szybkim SSD, a górna warstwa z danymi mniej istotnymi z dysków twardych), replikację (RAID 1/10), buforowanie, transparentną kompresję danych (tryby LZ4, gzip i ZSTD), migawki stanu (snapshots), weryfikację integralności za pomocą sum kontrolnych, możliwość przechowywania kodów korekcji błędów Reed-Solomon (RAID 5/6), przechowywanie informacji w postaci zaszyfrowanej (wykorzystywane ChaCha20 i Poly1305). Wydajność Bcachefs przewyższa Btrfs i inne systemy plików oparte na mechanizmie Copy-on-Write, wykazując prędkość pracy zbliżoną do Ext4 i XFS.
- W systemie plików Btrfs wprowadzono uproszczony tryb limitów, który umożliwia osiągnięcie wyższej wydajności poprzez śledzenie rozszerzeń tylko w tym poddziale, w którym zostały utworzone, co znacznie upraszcza obliczenia i poprawia wydajność, ale nie pozwala uwzględniać rozszerzeń wspólnie używanych w kilku poddziałach.
- W Btrfs dodano nową strukturę danych "stripe tree", która jest odpowiednia do logicznego mapowania rozszerzeń w sytuacjach, gdy fizyczne mapowanie nie pokrywa się na różnych urządzeniach. Struktura ta jest obecnie wykorzystywana w implementacjach RAID0 i RAID1 dla strefowanych urządzeń blokowych. W przyszłości planuje się wykorzystanie tej struktury również w RAID wyższych poziomów, co pozwoli rozwiązać szereg problemów występujących w obecnej implementacji.
- W systemie plików Ceph wdrożono wsparcie dla mapowania identyfikatorów użytkowników zamontowanych systemów plików, stosowanego do kojarzenia plików przypisanych do konkretnego użytkownika na zamontowanej obcej partycji z innym użytkownikiem w bieżącym systemie.
- W efivarfs dodano możliwość wskazania uid i gid podczas montowania, aby umożliwić procesom uruchamianym bez uprawnień roota zmianę zmiennych UEFI.
- W exFAT dodano wywołania ioctl do odczytu i zmiany atrybutów systemu plików. Dodano obsługę katalogów o zerowej wielkości.
- W F2FS wdrożono możliwość korzystania z bloków o rozmiarze 16K.
- Mechanizm automatycznego montowania autofs został przetworzony tak, aby korzystać z nowego API montowania partycji.
- W OverlayFS zaproponowano opcje montowania "lowerdir+" i "datadir+". Dodano wsparcie dla zagnieżdżonego montowania OverlayFS z xattrs.
- W XFS zoptymalizowano obciążenie CPU w kodzie przydzielania bloków w czasie rzeczywistym. Zapewniono możliwość jednoczesnego wykonywania operacji odczytu i FICLONE.
- Kod EXT2 został przetworzony tak, aby korzystać z foliantów stron pamięci (page folios).
- Pamięć i usługi systemowe
- Wsparcie dla architektury ia64, stosowanej w procesorach Intel Itanium, zostało zakończone, a sprzedaż tych procesorów została całkowicie wstrzymana w 2021 roku. Procesory Itanium zostały wprowadzone przez firmę Intel w 2001 roku, jednak architektura ia64 nie zdołała skonkurować z AMD64, głównie z powodu wyższej wydajności AMD64 oraz płynniejszego przejścia z 32-bitowych procesorów x86. W rezultacie zainteresowanie Intel przesunęło się na procesory x86-64, a Itanium pozostało serwery HP Integrity, na które zamówienia zostały wstrzymane trzy lata temu. Kod do wsparcia ia64 został usunięty z jądra głównie z powodu długotrwałego braku wsparcia tej platformy, przy czym Linus Torvalds wyraził gotowość przywrócenia wsparcia ia64 w jądrze, ale tylko jeśli znajdzie się osoba odpowiedzialna, która wykazuje wysoką jakość wsparcia tej platformy poza głównym jądrem przez co najmniej rok.
- Dodano parametr wiersza poleceń jądra „ia32_emulation”, umożliwiający włączenie i wyłączenie wsparcia dla emulacji trybu 32-bitowego podczas rozruchu w jądrach skompilowanych dla architektury x86-64. Z praktycznego punktu widzenia nowy parametr pozwala na kompilację jądra z wsparciem dla zgodności z aplikacjami 32-bitowymi, ale domyślnie wyłącza ten tryb, aby zmniejszyć wektory ataku na jądro, ponieważ API zapewniające zgodność jest mniej przetestowane niż podstawowe interfejsy jądra.
- Kontynuowano przenoszenie 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 Rust nie jest domyślnie aktywne i nie powoduje włączenia Rust do obowiązkowych zależności przy kompilacji jądra). W nowej wersji dokonano przejścia na wydanie Rust 1.73 i zaproponowano zestaw powiązań do pracy z kolejkami roboczymi (workqueues).
- Umożliwiono wykorzystanie mechanizmu binfmt_misc do dodania wsparcia dla nowych formatów plików wykonywalnych (np. do uruchamiania skompilowanych aplikacji w Javie lub Pythonie) wewnątrz oddzielnych przestrzeni nazw (namespace).
- W kontrolerze cpuset cgroup, który umożliwia zarządzanie przydziałem rdzeni CPU podczas wykonywania zadania, zapewniono podział na lokalne i zdalne partycjonowanie (remote partition), które różnią się tym, czy macierzysta cgroup jest poprawnie skonfigurowaną sekcją korzeniową, czy nie. W cpuset wprowadzono również nowe ustawienia „cpuset.cpus.exclusive” oraz „cpuset.cpus.exclusive.effective” do wyłącznego przypisania do CPU.
- W podsystemie BPF wprowadzono wsparcie dla wyjątków, które są obsługiwane jako natychmiastowe zakończenie programu BPF z możliwością bezpiecznego rozwinięcia stosu. Ponadto, w programach BPF dozwolone jest użycie wskaźników kptr w przypisaniu do CPU.
- W podsystemie io_uring dodano wsparcie dla operacji z futexami, a także wprowadzono nowe operacje: IORING_OP_WAITID (asynchroniczna wersja waitid), SOCKET_URING_OP_GETSOCKOPT (wariant getsockopt) oraz SOCKET_URING_OP_SETSOCKOPT (wariant setsockopt) i IORING_OP_READ_MULTISHOT (wielokrotne operacje odczytu, które nie kończą się, dopóki są dane lub bufor nie jest pełny).
- Dodano implementację lekkich, jednokierunkowych kolej FIFO, które wymagają blokowania spinującego tylko dla usunięcia z kolejki w kontekście procesu i nie wymagają blokady spinującej dla atomowego dodawania do kolejki w dowolnym kontekście.
- Dodano bufor pierścieniowy „objpool” z skalowalną implementacją wysokowydajnej kolejki do alokacji i zwracania obiektów.
- Dodano początkową część zmian dla nowego API futex2, które charakteryzuje się wyższą wydajnością na systemach NUMA, obsługuje rozmiary inne niż 32 bity i może być używane zamiast zmultiplikowanego wywołania systemowego futex().
- Dla architektur ARM32 i S390x dodano wsparcie dla aktualnego zestawu instrukcji BPF (cpuv4).
- Dla architektury RISC-V wprowadzono możliwość użycia dostępnego w Clang 17 trybu weryfikacji Shadow-Call Stack, przeznaczonego do ochrony przed nadpisywaniem adresu powrotu z funkcji w przypadku przepełnienia bufora na stosie. Ochrona polega na zapisaniu adresu powrotu w osobnym „cieniu” stosu po przekazaniu kontroli do funkcji i wydobywaniu tego adresu przed wyjściem z funkcji.
- Do mechanizmu scalania identycznych stron pamięci (KSM: Kernel Samepage Merging) dodano nowy inteligentny tryb skanowania stron pamięci, który śledzi nieudane skanowanie stron i zmniejsza intensywność ich ponownego skanowania. Aby włączyć nowy tryb, dodano ustawienie /sys/kernel/mm/ksm/smart_scan.
- Dodano nową komendę ioctl PAGEMAP_SCAN, która w połączeniu z userfaultfd() umożliwia określenie faktów zapisu w określonym zakresie pamięci. Nowa funkcjonalność może być na przykład używana w systemie do zapisywania i przywracania stanu procesów CRIU lub w systemach antycheat w grach.
- W systemie budowania, przy użyciu kompilatora Clang, domyślnie włączona jest kompilacja przykładów użycia podsystemu perf, napisanych jako programy BPF.
- Usunięto stary warstwę videobuf, używaną do zarządzania ramkami buforów w podsystemie multimedialnym, która ponad 10 lat temu została zastąpiona nową implementacją videobuf2.
- Wirtualizacja i bezpieczeństwo
- Do podsystemu fscrypt dodano możliwość szyfrowania danych blokami mniejszymi niż rozmiar bloku w systemie plików. Takie rozwiązanie może być wymagane do wykorzystania sprzętowych mechanizmów szyfrowania, które obsługują jedynie małe bloki (na przykład kontrolery UFS, obsługujące jedynie rozmiar bloku 4096, będą mogły być używane z systemem plików o rozmiarze bloku 16K).
- Do podsystemu 'iommufd', umożliwiającego zarządzanie tabelami stron pamięci wejścia/wyjścia IOMMU (I/O Memory-Management Unit) za pomocą deskryptorów plików z przestrzeni użytkownika, dodano śledzenie jeszcze nie wyczyszczonych danych z pamięci podręcznej (dirty) dla operacji DMA, co jest niezbędne do określenia pamięci z nieczyszczonymi danymi podczas migracji procesów.
- Do mechanizmu Landlock, który pozwala na ograniczenie interakcji grupy procesów z otoczeniem zewnętrznym, dodano wsparcie dla definiowania reguł zarządzania dostępem do gniazd TCP. Na przykład, można utworzyć regułę, która zezwala na połączenie tylko przez port sieciowy 443 w celu nawiązania połączeń HTTPS.
- Do podsystemu AppArmor dodano możliwość zarządzania dostępem do mechanizmu io_uring oraz tworzenia przestrzeni nazw identyfikatorów użytkowników (user namespaces), co pozwala na selektywne zezwalanie na dostęp do tych możliwości tylko wybranym procesom.
- Dodano API do certyfikacji maszyn wirtualnych dla potwierdzenia integralności procesu ich ładowania.
- Na systemach LoongArch wprowadzono wsparcie dla wirtualizacji z użyciem hipernadzorcy KVM.
- Podczas korzystania z hipernadzorcy KVM na systemach RISC-V dodano wsparcie rozszerzenia Smstateen, które blokuje dostęp wirtualnej maszyny do rejestrów CPU, które wyraźnie nie są wspierane przez hipernadzorcę. Dodatkowo dodano wsparcie dla używania w systemach gościa rozszerzenia Zicond, które pozwala na wykorzystanie niektórych warunkowych operacji całkowitoliczbowych.
- W systemach gościa działających na KVM, opartych na architekturze x86, dozwolone jest wykorzystanie do 4096 wirtualnych CPU.
- Subsystem sieciowy
- W sterowniku NVMe-TCP (NVMe przez TCP), który umożliwia dostęp do dysków NVMe przez sieć (NVM Express over Fabrics) z użyciem protokołu TCP, dodano wsparcie dla szyfrowania kanału przesyłania danych z wykorzystaniem TLS (używa KTLS oraz proces w przestrzeni użytkownika tlshd do negocjacji połączenia).
- Przeprowadzono optymalizację wydajności planisty pakietów fq (Fair Queuing), co pozwoliło na zwiększenie przepustowości o 5% przy dużych obciążeniach w teście tcp_rr (TCP Request/Response) i o 13% przy nieograniczonym przepływie pakietów UDP.
- W protokole TCP dodano opcjonalną możliwość używania znaczników czasowych (TCP TS) z dokładnością do mikrosekund (RFC 7323), co pozwala na dokładniejsze ocenianie opóźnień i tworzenie bardziej zaawansowanych modułów sterowania przeciążeniem. Aby włączyć tę funkcję, można użyć polecenia „ip route add 10/8 … features tcp_usec_ts.”
- W stosie TCP dodano wsparcie dla rozszerzenia TCP-AO (TCP Authentication Option, RFC 5925), które umożliwia weryfikację nagłówków TCP za pomocą kodów MAC (Message Authentication Code), używając nowoczesnych algorytmów HMAC-SHA1 i CMAC-AES-128 zamiast wcześniej dostępnej opcji TCP-MD5 opartej na przestarzałym algorytmie MD5.
- Dodano nowy typ wirtualnych urządzeń sieciowych „netkit”, w którym logika przesyłania danych jest definiowana przy użyciu programu BPF.
- W KSMBD, realizacji serwera SMB działającej na poziomie jądra, dodano wsparcie dla przekształcania nazw plików, które zawierają pary surrogate composited characters.
- W NFS ulepszono realizację wątków z usługami RPC. Dodano wsparcie dla delegacji zapisu (dla NFSv4.1+). W NFSD dodano wsparcie dla przetwornika netlink rpc_status. Ulepszono wsparcie klientów NFSv4.x przy ponownym eksporcie do knfsd.
- Sprzęt
- Do jądra Nouveau dodano wstępną obsługę oprogramowania GSP-RM, które jest używane w GPU NVIDIA RTX 20+ do przenoszenia operacji inicjalizacji i zarządzania GPU na zewnętrzny mikrokontroler GSP (GPU System Processor). Obsługa GSP-RM pozwala sterownikowi Nouveau działać poprzez odwołania do oprogramowania zamiast bezpośredniego programowania operacji interakcji z hardwarem, co znacznie ułatwia dodawanie wsparcia dla nowych GPU NVIDIA dzięki wykorzystaniu już gotowych wywołań do inicjalizacji i zarządzania zużyciem energii.
- W sterowniku AMDGPU zaimplementowano wsparcie dla GC 11.5, NBIO 7.11, SMU 14, SMU 13.0 OD, DCN 3.5, VPE 6.1 oraz DML2. Ulepszono wsparcie dla bezszwowego ładowania (bez migotania przy przełączaniu trybu wyświetlania).
- W sterowniku i915 zaimplementowano obsługę procesorów Intel Meteor Lake oraz dodano wstępną implementację Intel LunarLake (Xe 2).
- Dodano wsparcie dla asymetrycznych kanałów transmisyjnych, zawartych w specyfikacji USB4 v2 (120/40G).
- Dodano obsługę SoC ARM: Qualcomm Snapdragon 720G (stosowany w smartfonach Xiaomi), AMD Pensando Elba, Renesas, R8A779F4 (R-Car S4-8), USRobotics USR8200 (stosowany w routerach i NAS).
- Dodano wsparcie dla smartfona Fairphone 5 oraz płyt ARM Orange Pi 5, QuartzPro64, Turing RK1, Variscite MX6, BigTreeTech CB1, Freescale LX2162, Google Spherion, Google Hayato, Genio 1200 EVK, RK3566 Powkiddy RGB30.
- Dodano wsparcie dla płyt RISC-V Milk-V Pioneer i Milk-V Duo.
- Dodano wsparcie dla interfejsów dźwiękowych laptopów HUAWEI wyposażonych w CPU AMD. Dodano wsparcie dla dodatkowych głośników montowanych w laptopach Dell Oasis 13/14/16. Dodano wsparcie dla wbudowanych głośników ASUS K6500ZC. Dodano wsparcie dla wskaźnika wyciszenia w laptopach HP 255 G8 i G10. Dodano wsparcie dla sterowników dźwiękowych acp6.3. Dodano wsparcie dla profesjonalnych interfejsów nagrywania dźwięku Focusrite Clarett+ 2Pre i 4Pre.
Równocześnie latynoamerykańska Fundacja Wolnego Oprogramowania opracowała całkowicie wolną wersję jądra 6.7 — Linux-libre 6.7-gnu, oczyszczoną z elementów firmware i sterowników zawierających zamknięte komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W wydaniu 6.7 zaktualizowano kod czyszczenia blobów w różnych sterownikach i podsystemach, na przykład w sterownikach amdgpu, nouveau, adreno, mwifiex, mt7988, ath11k, avs i btqca. Usunięto kod czyszczenia sterowników localtalk i rtl8192u z powodu ich wyłączenia z jądra. Usunięto zbędne komponenty czyszczenia sterowników xhci-pci, rtl8xxxu i rtw8822b, wcześniej dodane przez pomyłkę. Przeprowadzono czyszczenie nazw blobów w plikach dts dla architektury Aarch64. Usunięto blobsy w nowych sterownikach mt7925, tps6598x, aw87390 i aw88399.
Źródło: opennet.ru
