Wydanie jądra Linuksa 5.1

Po dwóch miesiącach prac nad Linusem Torvaldsem wprowadzono wydanie jądra Linux 5.1. Wśród najbardziej zauważalnych zmian: nowy interfejs dla asynchronicznego I/O io_uring, możliwość wykorzystania NVDIMM jako RAM, obsługa współdzielonej pamięci wirtualnej w Nouveau, obsługa skalowalnego monitorowania bardzo dużych systemów plików poprzez fanotify, możliwość konfiguracji kompresji Zstd poziomów w Btrfs, nowy moduł obsługi TEO procesora, implementacja wywołań systemowych w celu rozwiązania problemu 2038, możliwość uruchamiania z urządzeń mapujących urządzenia bez initramfs, moduł SafeSetID LSM, obsługa połączonych łatek na żywo.

Głównym innowacje:

  • Podsystem dyskowy, wejścia/wyjścia i systemy plików
    • Zaimplementowano nowy interfejs dla asynchronicznych wejść/wyjść - io_uring, który wyróżnia się obsługą odpytywania we/wy i możliwością pracy z buforowaniem lub bez. Przypomnijmy, że zaproponowany wcześniej mechanizm asynchronicznego wejścia/wyjścia „aio” nie obsługiwał buforowanych wejść/wyjść, mógł działać jedynie w trybie O_DIRECT (bez buforowania i omijania pamięci podręcznej), miał problemy z blokowaniem w związku z oczekiwaniem na dostępność metadanych oraz wykazywały duże koszty ogólne wynikające z kopiowania danych do pamięci.

      W ramach API
      Programiści io_uring starali się wyeliminować niedociągnięcia starego interfejsu aio. Przez wydajność io_uring jest bardzo blisko SPDK i znacznie wyprzedza libaio podczas pracy z włączonym odpytywaniem. Przygotowano bibliotekę umożliwiającą wykorzystanie io_uring w aplikacjach końcowych działających w przestrzeni użytkownika lizanie, który zapewnia framework wysokiego poziomu dla interfejsu jądra;

    • W mechanizmie śledzenia zdarzeń w FS fanotify() dodany wsparcie dla śledzenia sytuacji superbloków i zmian strukturalnych reż (zdarzenia tworzenia, usuwania i przenoszenia katalogów). Zaprezentowane funkcje pomagają rozwiązać problemy ze skalowalnością, które pojawiają się podczas tworzenia rekurencyjnego śledzenia zmian w bardzo dużych systemach plików przy użyciu mechanizmu inotify (bezpośrednie zmiany można było wcześniej śledzić tylko za pomocą inotify, ale
      wydajność w warunkach rekurencyjnego śledzenia dużych zagnieżdżonych katalogów pozostawia wiele do życzenia). Teraz takie monitorowanie można skutecznie przeprowadzić za pomocą fanotify;

    • W systemie plików Btrfs dodany możliwość dostosowania poziomu kompresji dla algorytmu zstd, co można uznać za optymalny kompromis pomiędzy szybką, ale nieefektywną kompresją lz4 i powolną, ale dobrą kompresją xz. Przez analogię do tego, jak poprzednio można było ustawić poziom kompresji podczas korzystania z zlib, do zstd dodano obsługę opcji montowania „-o compress=zstd:level”. Podczas testów minimalny pierwszy poziom zapewnił kompresję danych 2.658 razy przy prędkości kompresji 438.47 MB/s, prędkości dekompresji 910.51 MB/s i zużyciu pamięci 780 MB, a maksymalny poziom 15 zapewnił 3.126 razy, ale przy kompresji prędkość 37.30 MB/s, rozpakowywanie 878.84 MB/s i zużycie pamięci 2547 MB;
    • Dodany możliwość rozruchu z systemu plików znajdującego się na urządzeniu mapującym urządzenia, bez użycia initramfs. Począwszy od bieżącej wersji jądra, urządzenia mapujące urządzenia mogą być używane bezpośrednio podczas procesu uruchamiania, na przykład jako partycja z głównym systemem plików. Partycję konfiguruje się za pomocą parametru rozruchowego „dm-mod.create”. Dopuszczalne do ładowania moduły mapowania urządzeń obejmują: „krypt”, „opóźnienie”, „liniowy”, „snapshot-origin” i „verity”;
    • Do systemu plików F2FS zorientowanego na dyski Flash dodano flagę F2FS_NOCOW_FL, która pozwala na wyłączenie trybu kopiowania przy zapisie dla danego pliku;
    • System plików usunięty z jądra Exofy, który jest odmianą ext2, przystosowaną do pracy z obiektowymi magazynami danych OSD (Object-Based Storage Device). Usunięto również obsługę protokołu SCSI dla takich obiektowych urządzeń pamięci masowej;
  • Wirtualizacja i bezpieczeństwo
    • Dodano opcję PR_SPEC_DISABLE_NOEXEC do prctl() w celu kontrolowania spekulatywnego wykonywania instrukcji dla wybranego procesu. Nowa opcja umożliwia selektywne wyłączanie wykonywania spekulatywnego dla procesów, które mogą potencjalnie zostać zaatakowane przez atak Spectre. Blokada trwa do pierwszego wywołania exec();
    • Wdrożony moduł LSM SafeSetID, który umożliwia usługom systemowym bezpieczne zarządzanie użytkownikami bez zwiększania uprawnień (CAP_SETUID) i bez uzyskiwania uprawnień roota. Uprawnienia nadawane są poprzez zdefiniowanie reguł w securityfs w oparciu o białą listę ważnych powiązań (w postaci „UID1:UID2”);
    • Dodano zmiany niskiego poziomu wymagane do ładowania modułów bezpieczeństwa (LSM) w oparciu o stos. Wprowadzono opcję rozruchu jądra „lsm”, aby kontrolować, które moduły są ładowane i w jakiej kolejności;
    • Do podsystemu audytu dodano obsługę przestrzeni nazw plików;
    • Rozszerzony możliwości wtyczki GCC structleak, która pozwala blokować potencjalne wycieki zawartości pamięci.Zapewniona jest inicjalizacja dowolnych zmiennych użytych w kodzie poprzez dostęp referencyjny na stosie;
  • Podsystem sieciowy
    • Do gniazd wdrożone nowa opcja „SO_BINDTOIFINDEX” podobna do
      „SO_BINDTODEVICE”, ale przyjmując jako argument numer indeksu interfejsu sieciowego zamiast nazwy interfejsu;

    • Stos mac80211 dodał możliwość przypisywania wielu identyfikatorów BSSID (adresów MAC) do jednego urządzenia. W ramach projektu optymalizacji wydajności Wi-Fi, stos mac80211 dodał rozliczanie czasu połączenia i możliwość dystrybucji czasu połączenia pomiędzy wieloma stacjami (podczas pracy w trybie punktu dostępowego przydzielanie mniejszego czasu transmisji powolnym stacjom bezprzewodowym, zamiast równomiernego rozdzielania czasu pomiędzy wszystkie stacje);
    • Dodano mechanizm „zdrowie Devlinka", który dostarcza powiadomienia w przypadku wystąpienia problemów z interfejsem sieciowym;
  • Usługi pamięci i systemu
    • Wdrożone bezpieczne dostarczanie sygnału, które pozwala na ponowne wykorzystanie PID. Przykładowo, przy wcześniejszym wywołaniu kill może dojść do sytuacji, w której zaraz po wysłaniu sygnału docelowy PID może zostać zwolniony w związku z zakończeniem procesu i zajęty przez inny proces, a sygnał zostanie ostatecznie przekazany do innego procesu. Aby wyeliminować takie sytuacje, dodano nowe wywołanie systemowe pidfd_send_signal, które wykorzystuje deskryptory plików z /proc/pid w celu zapewnienia stabilnego powiązania procesu. Nawet jeśli PID zostanie ponownie użyty podczas przetwarzania wywołań systemowych, deskryptor pliku nie ulegnie zmianie i można go bezpiecznie wykorzystać do wysłania sygnału do procesu;
    • Dodany możliwość wykorzystania urządzeń pamięci trwałej (np. pamięć trwała). NVDIMM) jako pamięć RAM. Do tej pory jądro obsługiwało takie urządzenia jak urządzenia pamięci masowej, ale teraz można je wykorzystać również jako dodatkową pamięć RAM. Ta funkcja została zaimplementowana w odpowiedzi na życzenia użytkowników, którzy chcą znosić opóźnienia w wydajności i chcą używać natywnego interfejsu API zarządzania pamięcią jądra Linuksa zamiast korzystać z istniejących systemów alokacji pamięci w przestrzeni użytkownika działających na mmap dla dax plik;
    • Dodano nowy moduł obsługi bezczynności procesora (cpuidle decyduje, kiedy procesor może zostać przełączony w tryb głębokiego oszczędzania energii; im głębszy tryb, tym większe oszczędności, ale także dłuższy czas potrzebny na wyjście z trybu) - TEO (gubernator zorientowany na zdarzenia czasowe ). Do tej pory zaproponowano dwie procedury obsługi procesora – „menu” i „drabina”, różniące się heurystyką. Program obsługi „menu” ma znane problemy z podejmowaniem decyzji heurystycznych, aby je wyeliminować zdecydowano się przygotować nowy moduł obsługi. TEO jest alternatywą dla obsługi „menu”, pozwalając na wyższą wydajność przy zachowaniu tego samego poziomu zużycia energii.
      Możesz aktywować nowy moduł obsługi za pomocą parametru rozruchowego „cpuidle.governor=teo”;

    • W ramach pracy do wyeliminowania problemy roku 2038, spowodowane przepełnieniem 32-bitowego typu time_t, zawiera wywołania systemowe oferujące 32-bitowe liczniki czasu dla architektur 64-bitowych. W rezultacie 64-bitowa struktura time_t może być teraz używana na wszystkich architekturach. Podobne zmiany zaimplementowano także w podsystemie sieciowym dla opcji znak czasu gniazda sieciowe;
    • Do systemu łatania na gorąco dla rdzenia (łatanie na żywo) dodany Funkcja „Atomic Zamień” umożliwiająca atomowe zastosowanie serii zmian w jednej funkcji. Ta funkcja pozwala na dystrybucję podsumowujących poprawek obejmujących kilka zmian na raz, zamiast procesu etapowego nakładania żywych poprawek w ściśle określonej kolejności, co jest dość trudne w utrzymaniu. Podczas gdy poprzednio każda kolejna zmiana musiała opierać się na stanie funkcji po ostatniej zmianie, obecnie możliwe jest propagowanie kilku zmian jednocześnie związanych z jednym stanem początkowym (tj. opiekunowie mogą zamiast tego utrzymywać jedną skonsolidowaną łatkę w stosunku do podstawowego jądra łańcucha łatek, które są od siebie zależne);
    • Ogłoszony przestarzała obsługa formatu pliku wykonywalnego a.out i
      REMOVED kod do generowania plików core w formacie a.out, który jest w stanie porzuconym. Format a.out nie był już dawno używany w systemach Linux, a generowanie plików a.out od dawna nie jest obsługiwane przez nowoczesne narzędzia w domyślnych konfiguracjach Linuksa. Dodatkowo moduł ładujący pliki a.out można zaimplementować całkowicie w przestrzeni użytkownika;

    • Do mechanizmu weryfikacji programu BPF dodano możliwość identyfikacji i usunięcia niewykorzystanego kodu. Jądro zawiera także łatki obsługujące spinlock dla podsystemu BPF, zapewniające dodatkowe możliwości zarządzania równoległym wykonywaniem programów BPF;
  • Sprzęt
    • W stylu Nouveau kierowcy dodany obsługa heterogenicznego zarządzania pamięcią, umożliwiająca procesorowi i procesorowi graficznemu dostęp do wspólnych zsynchronizowanych obszarów pamięci. System współdzielonej pamięci wirtualnej (SVM, wspólna pamięć wirtualna) realizowany jest w oparciu o podsystem HMM (Heterogeneous memory Management), który pozwala na wykorzystanie urządzeń posiadających własne jednostki zarządzania pamięcią (MMU, memory Management Unit), do których można uzyskać dostęp pamięć główna. W szczególności za pomocą HMM można zorganizować wspólną przestrzeń adresową pomiędzy procesorem graficznym i procesorem, w której procesor graficzny może uzyskać dostęp do pamięci głównej procesu. Obsługa SVM jest obecnie włączona tylko dla procesorów graficznych z rodziny Pascal, chociaż zapewniona jest także obsługa procesorów graficznych Volta i Turing. Co więcej, w Nouveau dodany nowy ioctl do kontroli migracji obszarów pamięci procesowej do pamięci GPU;
    • W sterowniku Intel DRM dla GPU Skylake i nowszych wersji (gen9+) dołączony Domyślnie tryb fastboot eliminuje niepotrzebne zmiany trybu podczas uruchamiania. Dodany новые identyfikatory urządzeń oparte na mikroarchitekturach Coffelake i Ice Lake. Do chipsów Coffelake dodany Wsparcie GVT (Wirtualizacja GPU). Dla wirtualnych procesorów graficznych wdrożone Obsługa VFIO EDID. Do paneli LCD MIPI/DSI dodany obsługa elementów ACPI/PMIC. Wdrożone nowe tryby telewizji 1080p30/50/60;
    • Dodano obsługę procesora graficznego Vega10/20 BACO do sterownika amdgpu. Zaimplementowano zarządzanie energią Vega 10/20 i tablice sterujące chłodnicy Vega 10. Dodano nowe identyfikatory urządzeń PCI dla procesorów graficznych Picasso. обавлен interfejs do zarządzania planowanymi zależnościami w celu uniknięcia zakleszczeń;
    • обавлен Sterownik DRM/KMS dla akceleratorów ekranowych ARM Komedy (Mali D71);
    • Dodano obsługę paneli ekranowych Toppoly TPG110, Sitronix ST7701, PDA 91-00156-A0, LeMaker BL035-RGB-002 3.5 i Kingdisplay kd097d04;
    • Dodano obsługę kodeków audio Rockchip RK3328, Cirrus Logic CS4341 i CS35L36, MediaTek MT6358, Qualcomm WCD9335 i Ingenic JZ4725B, a także platformy audio Mediatek MT8183;
    • Dodano obsługę kontrolerów NAND Flash STMicroelectronics FMC2, Amlogic Meson;
    • Dodano obsługę akceleratorów dla systemów sprzętowych Habana AI;
    • Dodano obsługę kontrolerów Gigabit Ethernet NXP ENETC oraz interfejsów bezprzewodowych MediaTek MT7603E (PCIe) i MT76x8.

Jednocześnie Latynoamerykańska Fundacja Wolnego Oprogramowania uformowany
вариант całkowicie darmowe jądro 5.1 - Linux-libre 5.1-gnu, oczyszczone z elementów oprogramowania sprzętowego i sterowników zawierających niewolne komponenty lub sekcje kodu, których zakres jest ograniczony przez producenta. W nowej wersji ładowanie obiektów BLOB jest wyłączone w sterownikach mt7603 i goya. Zaktualizowano kod czyszczenia obiektów blob w sterownikach i podsystemach wilc1000, iwlwifi, soc-acpi-intel, brcmfmac, mwifiex, btmrvl, btmtk i touchscreen_dmi. Czyszczenie obiektów blob w programie ładującym oprogramowanie sprzętowe lantiq xrx200 zostało zatrzymane z powodu jego usunięcia z jądra.

Źródło: opennet.ru

Dodaj komentarz