Po dwóch miesiącach prac Linus Torvalds wydał jądro . Wśród najbardziej zauważalnych zmian: integracja interfejsu VPN WireGuard, wsparcie dla USB4, przestrzenie nazw dla czasu, możliwość tworzenia obsługi przeciążenia TCP przy użyciu BPF, wstępne wsparcie dla MultiPath TCP, usunięcie problemu roku 2038 z jądra, mechanizm „bootconfig”, system plików ZoneFS.
Nowa wersja zawiera 13702 poprawek od 1810 programistów,
rozmiar łatki wynosi 40 MB (zmiany obejmują 11577 plików, dodano 610012 linijek kodu,
usunięto 294828 linijek). Około 45% wszystkich zmian w wersji 5.6
zmian dotyczy sterowników urządzeń, około 15% zmian dotyczy
odpowiedzialne jest za aktualizację kodu specyficznego dla architektur sprzętowych, 12%
dotyczy stosu sieciowego, 4% — systemów plików, a 3% — wewnętrznych
podsystemami jądra.
:
- Subsystem sieciowy
- wdrożenie interfejsu VPN , który oparty jest na nowoczesnych metodach szyfrowania (ChaCha20, Poly1305, Curve25519, BLAKE2s), jest łatwy w użyciu, pozbawiony komplikacji, sprawdził się w wielu dużych wdrożeniach i zapewnia bardzo wysoką wydajność (3,9 razy przewyższa OpenVPN pod względem przepustowości). W WireGuard zastosowano koncepcję routingu według kluczy szyfrowania, co polega na przypisaniu do każdego interfejsu sieciowego klucza prywatnego i wykorzystaniu go do łączenia kluczy publicznych. Wymiana kluczy publicznych w celu ustanowienia połączenia odbywa się na zasadzie podobnej do SSH. Niezbędne do pracy WireGuard prymitywy kryptograficzne z biblioteki są częścią standardowego Crypto API oraz częścią jądra .
- integracja komponentów niezbędnych do wsparcia MPTCP (MultiPath TCP), rozszerzenia protokołu TCP w celu umożliwienia działania połączenia TCP z jednoczesną dostawą pakietów przez różne trasy przez różne interfejsy sieciowe przypisane do różnych adresów IP. Dla aplikacji sieciowych takie skonsolidowane połączenie wygląda jak zwykłe połączenie TCP, a cała logika podziału strumieni jest realizowana przez MPTCP. Multipath TCP może być używane zarówno do zwiększenia przepustowości, jak i poprawy niezawodności. Na przykład, MPTCP można stosować do przesyłania danych na smartfonie przy użyciu jednocześnie połączeń WiFi i 4G lub do obniżenia kosztów, łącząc serwer przy użyciu kilku tanich połączeń zamiast jednego drogiego.
- wsparcie dla dyscypliny obsługi kolejek sieciowych sch_ets (, IEEE 802.1Qaz), która umożliwia przydzielanie przepustowości między różnymi klasami ruchu. Jeśli obciążenie danej klasy ruchu jest poniżej przydzielonej przepustowości, to ETS pozwala innym klasom ruchu korzystać z dostępnej (niewykorzystanej) przepustowości. Qdisc sch_ets jest ustawiana jako dyscyplina PRIO i wykorzystuje klasy ruchu do określenia ścisłych i współdzielonych ograniczeń przepustowości. ETS działa jako kombinacja dyscyplin i — gdy są sztywno ograniczone klasy ruchu, stosuje się PRIO, ale jeśli w kolejce ruchu nie ma, działa jak DRR.
- Dodano nowy typ programów BPF , pozwalający na implementację funkcji obsługi w jądrze za pośrednictwem BPF. Obecnie tę funkcjonalność można już wykorzystać do realizacji algorytmów kontroli przeciążenia TCP w formie programów BPF. Na przykład program BPF implementujący algorytm .
- Zostały przyjęte do jądra , narzędzia do tłumaczenia z ioctl() na użycie . Nowy interfejs upraszcza dodawanie rozszerzeń, poprawia obsługę błędów, umożliwia wysyłanie powiadomień przy zmianie stanu, ułatwia interakcję między jądrem a przestrzenią użytkownika oraz zmniejsza liczbę synchronizowanych nazwanych list.
- Dodano implementację algorytmu zarządzania kolejkami sieciowymi FQ-PIE (Flow Queue PIE), mającego na celu zmniejszenie negatywnego wpływu pośredniego buforowania pakietów na granicznym sprzęcie sieciowym (bufferbloat). FQ-PIE wykazuje wysoką wydajność w systemach z modemami kablowymi.
- Podsystem dyskowy, wejście/wyjście i systemy plików
- Dla systemu plików Btrfs asynchroniczna realizacja operacji DISCARD (oznaczanie zwolnionych bloków, które można już nie przechowywać fizycznie). Początkowo operacje DISCARD były wykonywane synchronicznie, co mogło prowadzić do spadku wydajności z powodu oczekiwania na zakończenie odpowiednich poleceń przez nośniki. Asynchroniczna realizacja pozwala na nieczekanie na zakończenie DISCARD przez nośnik i wykonywanie tej operacji w tle.
- W XFS oczyszczenie kodu, w którym używane były stare 32-bitowe liczniki czasu (typ time_t został zastąpiony przez time64_t), co prowadziło do problemu roku 2038. Usunięto błędy i uszkodzenia pamięci, które pojawiały się na 32-bitowych platformach. Przepisano kod, aby działał z rozszerzonymi atrybutami.
- W systemie plików ext4 optymalizacja wydajności związana z obsługą blokady inode podczas operacji odczytu i zapisu. Zwiększono wydajność nadpisywania w trybie bezpośredniego wejścia/wyjścia (Direct I/O). Aby uprościć diagnozowanie problemów, zapewniono zapis w superbloku pierwszego i ostatniego kodu błędu.
- W systemie plików F2FS możliwość przechowywania danych w skompresowanej formie. Dla pojedynczego pliku lub katalogu kompresję można włączyć za pomocą polecenia „chattr +c file” lub „chattr +c dir; touch dir/file”. Aby skompresować cały partycję, w narzędziu mount można użyć opcji „-o compress_extension=ext”.
- Do jądra została przyjęta system plików , upraszczający niskopoziomową pracę z zasięgniętymi urządzeniami pamięci. Pod zasięgniętymi nośnikami rozumie się urządzenia na twardych dyskach magnetycznych lub NVMe SSD, gdzie przestrzeń do przechowywania jest podzielona na strefy, składające się z grup bloków lub sektorów, do których dozwolone jest jedynie sekwencyjne dodawanie danych z aktualizacją całej grupy bloków. System plików ZoneFS został opracowany przez firmę Western Digital i łączy każdą strefę w nośniku z osobnym plikiem, który można wykorzystać do przechowywania danych w trybie raw bez manipulacji na poziomie sektorów i bloków, co pozwala aplikacjom korzystać z API plików zamiast bezpośredniego dostępu do urządzenia blokowego za pomocą ioctl.
- W NFS domyślnie wyłączono montowanie partycji nad UDP. Dodano wsparcie dla specyfikacji NFS 4.2 dla możliwości bezpośredniego kopiowania plików między serwerami. Dodano nową opcję montowania „softreval”, która w przypadku awarii serwera pozwala na korzystanie z zapisanych w pamięci podręcznej wartości atrybutów. Na przykład, przy wskazaniu tej opcji po niedostępności serwera, nadal można poruszać się po ścieżkach w sekcji NFS oraz uzyskiwać dostęp do informacji, które osiadły w pamięci podręcznej.
- optymalizacja wydajności mechanizmu fs-verity, stosowanego do kontroli integralności i weryfikacji autentyczności poszczególnych plików. Zwiększono prędkość sekwencyjnego odczytu dzięki zastosowaniu drzewa Merkle'a. Optymalizowana wydajność FS_IOC_ENABLE_VERITY w warunkach braku danych w pamięci podręcznej (zastosowano prefetching stron z danymi).
- Wirtualizacja i bezpieczeństwo
- Ogłoszono przestarzałą możliwość wyłączania modułu SELinux w czasie działania, a w przyszłości załadowanie już aktywowanego SELinux będzie zabronione. Aby wyłączyć SELinux, należy przekazać parametr „selinux=0” w linii poleceń jądra.
- wsparcie dla przestrzeni nazw czasu (time namespaces), które pozwalają powiązać stan zegarów systemowych (CLOCK_REALTIME,
CLOCK_MONOTONIC, CLOCK_BOOTTIME) z kontenerem, umożliwiając w kontenerze swoje własne czas i zapewniając niezmienność wskazań CLOCK_MONOTONIC i CLOCK_BOOTTIME przy migracji kontenera na inny host (uwzględniając czas po załadunku z uwzględnieniem lub bez uwzględnienia stanu w uśpieniu). - Usunięto blokowany pul /dev/random. Zachowanie /dev/random przybliżono do /dev/urandom pod względem zapobiegania blokowaniu entropii po inicjalizacji puli.
- Do głównej części jądra dodano sterownik, który pozwala systemom gościnnym działającym w VirtualBox montować katalogi udostępniane przez środowisko hosta (VirtualBox Shared Folder).
- Do podsystemu BPF dodano zestaw poprawek (), w warunkach stosowania mechanizmu Retpoline w celu ochrony przed atakami klasy Spectre V2, co pozwala zwiększyć wydajność wywoływania programów BPF przy wystąpieniu powiązanych z nimi zdarzeń (na przykład umożliwia przyspieszenie wywoływania przetworników XDP przy przybyciu pakietu sieciowego).
- Dodano sterownik do wsparcia wbudowanych w APU AMD środowisk TEE (Trusted Execution Environment).
- Pamięć i usługi systemowe
- W BPF dodano wsparcie dla globalnych funkcji. Rozwój odbywa się w ramach inicjatywy dotyczącej dodania wsparcia bibliotek funkcji, które można podłączać w programach BPF. Następnym krokiem będzie wsparcie dla dynamicznych rozszerzeń, które umożliwiają ładowanie globalnych funkcji, w tym do zastąpienia istniejących globalnych funkcji podczas ich użycia. W podsystemie BPF dodano również wsparcie dla wariantu operacji map (stosowanego do przechowywania danych trwałych), wspierającego wykonywanie w trybie wsadowym.
- Urządzenie „cpu_cooling” umożliwiające chłodzenie przegrzanego CPU poprzez wprowadzenie go w stan bezczynności (idle) na krótkie okresy czasu.
- Dodano wywołanie systemowe , oferujące zestaw dodatkowych flag do ograniczenia dostępu do ścieżki plików (zakaz przekraczania punktów montowania, linków symbolicznych, magicznych linków (\/proc\/PID\/fd), komponentów „..\/”).
- Dla heterogenicznych systemów opartych na architekturze big.LITTLE, łączących w jednym chipie mocne i mniej wydajne energooszczędne rdzenie CPU, w trakcie realizacji zadań czasu rzeczywistego zapewnia wystawienie parametru uclamp_min ( w jądrze 5.3 mechanizm przypinania obciążenia). Określony parametr gwarantuje, że zadanie zostanie umieszczone przez planistę na rdzeniu CPU, który ma wystarczającą wydajność.
- Jądro zostało uwolnione od . Zastąpiono ostatnie pozostałe obsługiwacze, w których dla licznika epokowego czasu używano 32-bitowego (signed int) typu time_t, który w związku z raportem od 1970 roku powinien przepełnić się w 2038 roku.
- Kontynuowano doskonalenie interfejsu asynchronicznego wejścia/wyjścia , że postanowienie dyskryminuje dostawców i narusza wsparcie nowych operacji: IORING_OP_FALLOCATE (rezerwacja pustych obszarów), IORING_OP_OPENAT,
IORING_OP_OPENAT2,
IORING_OP_CLOSE (otwieranie i zamykanie plików),
IORING_OP_FILES_UPDATE (dodawanie i usuwanie plików z listy szybkiego dostępu),
IORING_OP_STATX (zapytanie o informacje o pliku),
IORING_OP_READ,
IORING_OP_WRITE (uproszczone odpowiedniki IORING_OP_READV i IORING_OP_WRITEV),
IORING_OP_FADVISE,
IORING_OP_MADVISE (asynchroniczne wersje wywołań posix_fadvise i madvise), IORING_OP_SEND,
IORING_OP_RECV (wysyłanie i odbieranie danych sieciowych),
IORING_OP_EPOLL_CTL (wykonywanie operacji na deskryptorach plików epoll). - Dodano wywołanie systemowe , dające możliwość procesowi wydobycia z innego procesu deskryptora pliku otwartego pliku.
- mechanizm „bootconfig”, umożliwiający oprócz opcji wiersza poleceń określenie parametrów działania jądra za pośrednictwem pliku konfiguracyjnego. Do dodawania takich plików w obrazie initramfs zaproponowano narzędzie bootconfig. Wskazana możliwość może być stosowana, na przykład, do konfiguracji kprobes podczas rozruchu.
- mechanizm oczekiwania na zapis i odczyt danych w nieoznaczonych kanałach (pipe). Zmiana ta umożliwiła przyspieszenie realizacji zadań, takich jak równoległa kompilacja dużych projektów. Optymalizacja ta może prowadzić do warunków wyścigu w GNU make z powodu błędu w wersji 4.2.1, który został usunięty w wersji 4.3.
- W prctl() dodano flagę PR_SET_IO_FLUSHER, która może być używana do oznaczania procesów zajmujących się zwalnianiem pamięci, dla których nie należy stosować ograniczeń w przypadku niedoboru pamięci w systemie.
- Na podstawie stosowanego w systemie Android systemu alokacji pamięci ION zrealizowano podsystem , który pozwala zarządzać alokacją buforów DMA do współdzielenia obszarów pamięci przez sterowniki, aplikacje i różne podsystemy.
- Architektury sprzętowe
- Dodano wsparcie dla rozszerzenia E0PD, wprowadzonego w ARMv8.5, które umożliwia implementację zabezpieczeń przed atakami związanymi z spekulatywnym wykonaniem instrukcji w CPU. Ochrona oparta na E0PD wiąże się z mniejszymi kosztami niż ochrona KPTI (Kernel Page Table Isolation).
- Dla systemów opartych na architekturze ARMv8.5 dodano wsparcie dla instrukcji RNG, która zapewnia dostęp do sprzętowego generatora liczb pseudolosowych. W jądrze instrukcja RNG jest wykorzystywana do generowania entropii podczas inicjalizacji dostarczanego przez jądro generatora liczb pseudolosowych.
- Usunięto wsparcie dla rozszerzeń MPX (Memory Protection Extensions), wprowadzonych w jądrze i umożliwiających weryfikację wskaźników na zgodność z granicami obszarów pamięci. Technologia ta nie znalazła szerokiego zastosowania w kompilatorach i została usunięta z GCC.
- Dla architektury RISC-V zrealizowano wsparcie dla narzędzia do debugowania KASan (Kernel address sanitizer), które pozwala na wykrywanie błędów w obsłudze pamięci.
- Sprzęt
- Wprowadzono wsparcie dla specyfikacji , która oparta jest na protokole Thunderbolt 3 i zapewnia przepustowość do 40 Gbit/s, zachowując zgodność wsteczną z USB 2.0 i USB 3.2. Podobnie jak , interfejs USB 4.0 umożliwia tunelowanie różnych protokołów przez jeden kabel z gniazdem , w tym PCIe, Display Port i USB 3.x, a także programowe realizacje protokołów, na przykład do organizacji połączeń sieciowych między hostami. Realizacja opiera się na już zawartym w jądrze Linux driverze Thunderbolt i dostosowuje go do pracy z hostami i urządzeniami zgodnymi z USB4. Zmiany również dodają wsparcie dla urządzeń Thunderbolt 3 w programowej realizacji menedżera połączeń (Connection Manager), który odpowiada za tworzenie tuneli do podłączania wielu urządzeń przez jeden port.
- W sterowniku amdgpu została dodana początkowa obsługa technologii zabezpieczeń przed kopiowaniem HDCP 2.x (High-bandwidth Digital Content Protection). Dodano wsparcie dla chipu ASIC AMD Pollock, opartego na Raven 2. Zrealizowano możliwość resetowania GPU dla rodzin Renoir i Navi.
- W sterowniku DRM dla kart graficznych Intel dodano wsparcie DSI VDSC dla chipów opartych na mikroarchitekturze Ice Lake i Tiger Lake, zrealizowano LMEM mmap (pamięć lokalna urządzenia), ulepszono analizę VBT (Video BIOS Table), zrealizowano wsparcie HDCP 2.2 dla chipów Coffee Lake.
- Kontynuowano prace nad unifikacją kodu sterownika amdkfd (dla dyskretnych GPU, takich jak Fiji, Tonga, Polaris) ze sterownikiem amdgpu.
- Przeprojektowano sterownik k10temp, który zyskał wsparcie dla wyjścia parametrów napięcia i natężenia prądu dla CPU AMD Zen, oraz rozszerzonych informacji z czujników temperatury stosowanych w CPU Zen i Zen 2.
- W sterowniku nouveau dodano wsparcie dla weryfikowanego trybu ładowania firmware'u dla GPU NVIDIA opartego na mikroarchitekturze Turing (GeForce RTX 2000), co pozwoliło na włączenie wsparcia dla przyspieszenia 3D dla tych kart (wymaga załadowania oficjalnych firmware'ów z podpisem cyfrowym NVIDIA). Dodano wsparcie dla silnika graficznego TU10x. Rozwiązano problemy z HD Audio.
- Dodano wsparcie dla kompresji danych podczas transmisji przez DisplayPort MST (Multi-Stream Transport).
- Dodano nowy sterownik „” dla bezprzewodowych chipów Qualcomm z obsługą 802.11ax.
Sterownik oparty na stosie mac80211 wspiera tryby punktu dostępowego, stacji roboczej i węzła sieci Mesh. - Poprzez sysfs udostępniono dostęp do odczytów z czujników temperatury używanych w nowoczesnych twardych dyskach i SSD.
- zna znaczące zmiany w systemie dźwiękowym ALSA, mające na celu pozbycie się kodu (odejście od użycia 32-bitowego typu time_t w interfejsach snd_pcm_mmap_status i snd_pcm_mmap_control). Dodano wsparcie dla nowych kodeków audio
Qualcomm WCD9340/WCD9341, Realtek RT700, RT711, RT715, RT1308, Ingenic JZ4770. - sterowniki do paneli LCD Logic PD 28, Jimax8729d MIPI-DSI, igenic JZ4770, Sony acx424AKP, Leadtek LTK500HD1829, Xinpeng XPP055C272, AUO B116XAK01, GiantPlus GPM940B0,
BOE NV140FHM-N49,
Satoz SAT050AT40H12R2,
Sharp LS020B1DD01D. - wsparcie dla platform ARM i Gen1 Amazon Echo (oparty na OMAP3630), Samsung Galaxy S III mini (GT-I8190), Allwinner Emlid Neutis, Libre Computer ALL-H3-IT, PineH64 Model B, Aibretech Amlogic GX PC,
Armada SolidRun Clearfog GTR, NXPGateworks GW59xx,
czytnik eBook Tolino Shine 3,
Embedded Artists COM (i.MX7ULP), SolidRun Clearfog CX/ITX oraz HoneyComb (LX2160A), Google Coral Edge TPU (i.MX8MQ),
Rockchip Radxa Dalang Carrier, Radxa Rock Pi N10, VMARC RK3399Pro SOM
ST Ericsson HREF520, Inforce 6640, SC7180 IDP, Atmel/Microchip AM9X60 (SoC ARM926, Kizboxmini), ST stm32mp15, AM3703/AM3715/DM3725, ST Ericsson ab8505, Unisoc SC9863A, Qualcomm SC7180. Dodano wsparcie dla kontrolera PCIe używanego w Raspberry Pi 4.
Jednocześnie latynoamerykański Fundusz Wolnego Oprogramowania
wariant — , oczyszczone z elementów firmware i sterowników zawierających niewolne komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W nowym wydaniu wyłączono ładowanie blobów w sterownikach dla AMD TEE, ATH11K i Mediatek SCP. Zaktualizowano kod czyszczenia blobów w sterownikach i subsystemach AMD PSP, amdgpu i nouveau.
Źródło: opennet.ru
