Die Veröffentlichung des Linux-Kernels 6.15

Nach zwei Monaten Entwicklung stellte Linus Torvalds die Release des Linux-Kernels 6.15 vor. Zu den bemerkenswertesten Neuerungen gehören: ein Auditsystem in Landlock, ein Anheftungsmodus für das Mapping von Speicher, die fwctl-Subsystem, der Nova-Treiber für NVIDIA-GPUs, die Implementierung eines Host-Systems für den Hypervisor Hyper-V, die Unterstützung für zonierte Speichereinheiten in XFS, eine Optimierung der Netzwerk-Subsystem, eine Scrub-Überprüfung in Bcachefs sowie eine Möglichkeit zur Kontrolle von Operationen über io_uring.

In die neue Version wurden 15945 Korrekturen von 2154 Entwicklern übernommen, die Patchgröße beträgt 59 MB (die Änderungen betreffen 13596 Dateien, 739608 Zeilen Code wurden hinzugefügt, 312168 Zeilen wurden entfernt). In der vorherigen Version gab es 12115 Korrekturen von 1984 Entwicklern, die Patchgröße betrug 39 MB. Etwa 41% aller in 6.15 vorgestellten Änderungen sind mit Gerätetreibern verbunden, ungefähr 16% betreffen Aktualisierungen von architekturspezifischem Code, 13% sind mit dem Netzwerk-Stack verbunden, 5% betreffen Dateisysteme und 4% interne Subsysteme des Kernels.

Die wichtigsten Neuerungen im Kernel 6.15:

  • Festplattensubsystem, Ein-/Ausgabe und Dateisysteme
    • Im fanotify-Mechanismus wurde die Möglichkeit hinzugefügt, Ereignisse zum Ein- und Ausbinden zu verfolgen.
    • In XFS wurde die Unterstützung für zonierte Speichereinheiten hinzugefügt (Aufteilung in Zonen von Blockgruppen oder Sektoren, in die nur sequentiell Daten hinzugefügt werden dürfen, bei gleichzeitiger Aktualisierung der gesamten Blockgruppe). Ein rwf_dontcache-Flag wurde hinzugefügt, um das Caching beim Schreiben zu deaktivieren. Die Möglichkeit einer atomaren Aufzeichnung mehrerer Datenblöcke wurde implementiert.
    • In Btrfs wurde die Möglichkeit eingeführt, beim Einbinden negative Kompressionsstufen für zstd anzugeben (von -15 bis -1, beispielsweise "compress=zstd:-5"), die eine höhere Verarbeitungsrate auf Kosten einer verminderten Kompressionseffizienz ermöglichen. Das Caching von Dateipfaden wurde verbessert (in einem durchgeführten Test wurde die Ausführung der "send"-Operation um 30% beschleunigt). Die Unterstützung für 2KB-Blöcke wurde hinzugefügt.
    • In EXT4 wurde die Leistung bei der Verarbeitung von Journaleinträgen mit sehr vielen zurückgerufenen Aufzeichnungen erhöht (eine Belastung, die für Verzeichnisse unter dem FS Lustre charakteristisch ist). Eine lineare Suche nach "dentry"-Einträgen (interne Darstellung von Verzeichniselementen) wurde implementiert, die Probleme mit dem Zugriff auf bestimmte Dateien im ordnungsgemäßen Modus ohne Berücksichtigung der Groß- und Kleinschreibung löst. Die Option "errors=remount-ro" wurde verbessert. Die Robustheit beim Umgang mit beschädigten Dateisystemen wurde erhöht.
    • In F2FS wurde ein ioctl zur Abfrage der Priorität von I/O-Vorgängen für eine bestimmte Datei implementiert. Es wurde an der Umstellung auf die Verwendung von Seitenfolios (page folios) gearbeitet.
    • In Bcachefs wurde der Modus "scrub" hinzugefügt, der die Überprüfung der Korrektheit des Lesens aller Daten und Metadaten aus dem Dateisystem ermöglicht. Bei Feststellung von Fehlern wird ein Wiederherstellungsverfahren eingeleitet. Bcachefs unterstützt auch die Arbeit mit Dateisystemen, dessen Blockgröße größer ist als die Seitenfoliogröße. Das Format der Diskstrukturen von Bcachefs wurde stabilisiert (zukünftige Änderungen am Format werden in Form von optionalen Ergänzungen umgesetzt).
    • In EROFS wurde die Unterstützung für 48-Bit-Blockadressierung hinzugefügt.
    • In der FUSE-Subsystem wurden die sysctl-Parameter default_request_timeout und max_request_timeout implementiert, um Zeitüberschreitungen für die Durchführung von Anfragen festzulegen, was es ermöglicht, Blockierungen von FUSE-Komponenten, die im Benutzermodus arbeiten, zu überwachen. Die maximale Dateinamenlänge in FUSE wurde auf 1024 Zeichen erhöht.
    • In den Systemaufruf statmount() wurde die Möglichkeit hinzugefügt, Informationen über die Zuordnung von Benutzer-IDs für die gemounteten Dateisysteme abzurufen, die zur Zuordnung von Dateien eines bestimmten Benutzers auf einem gemounteten Fremdpartition zu einem anderen Benutzer im aktuellen System verwendet wird.
    • Es wurde die Möglichkeit realisiert, einen Mount-Punkt mit einer anderen Zuordnung der Benutzer-IDs zu erstellen als die des ursprünglichen gemounteten Abschnitts.
    • In der API zur Verwaltung von Mounts wurden Änderungen vorgenommen, die die Erstellung komplexer Hierarchien von Dateisystemen vereinfachen, ohne spezifische Teile der Dateisysteme offenlegen zu müssen, die verborgen bleiben sollen.
    • Im Blockgeräte-Subsystem wurde die Unterstützung für Hardwaregeräte zum Schutz von Verschlüsselungsschlüsseln hinzugefügt.
    • Im SMB-Dateisystem wurde die Option is_network_name_deleted implementiert und der Modus smb_server_kerberos5 standardmäßig aktiviert.
    • Für das Dateisystem OverlayFS wurde die Montageoption "override_creds" hinzugefügt, bei der für den Zugriff auf die unteren Ebenen des Speichers die Anmeldeinformationen des aufrufenden Benutzers verwendet werden, nicht des Benutzers, der den Mount-Vorgang ausgeführt hat. Diese Änderung ermöglicht beispielsweise, dass bei der Montage von OverlayFS ein Benutzer mit CAP_SYS_ADMIN-Rechten erforderlich ist, aber ein Dateisystem mit Anmeldeinformationen ohne diese Berechtigung verwendet werden kann.
    • In exFAT wurden die Dateilöschvorgänge beschleunigt. Anstatt „discard“-Anfragen einzeln für jeden freigegebenen Cluster einer zu löschenden Datei zu senden, gruppiert der Treiber nun diese Anfragen. In einem durchgeführten Test wurde die Zeit zum Löschen einer 80 GB großen Datei von 286 Sekunden auf 1,6 Sekunden verkürzt.
    • Alle Pseudo-Dateisysteme sowie das Dateisystem EXT2 wurden auf die Verwendung der neuen API zur Einbindung von Partitionen umgestellt.
    • Der Code zur Unterstützung von Dateisystemen SYSV (SystemV/386, Xenix und Coherent) wurde entfernt, der seit 2023 als nicht mehr unterstützt (orphaned) gekennzeichnet ist.
  • Speicher und Systemdienste
    • Die für den Kernbauff erforderliche minimale Version von GCC wurde auf 8.1 und von Clang auf 15.0.0 angehoben.
    • Es wurde ein fwctl (Firmware Control)-Subsystem hinzugefügt, das eine API für die sichere Verwaltung von Firmware und die Ausführung von Handlern auf der Firmware-Seite aus dem Benutzerspeicher bereitstellt. Auf Basis von fwctl wurden Treiber für CXL (Compute Express Link)-Geräte, Ethernet-Adapter von Mellanox ConnectX (mlx5) und AMD/Pensando-Servicekarten erstellt.
    • Die Möglichkeiten des pidfd-Mechanismus wurden erweitert, der es ermöglicht, Identifikatoren zu verwenden, die mit bestimmten Prozessen verbunden sind und im Gegensatz zu pid nicht erneut zugewiesen werden. Es wurde die Möglichkeit geschaffen, Daten zum Abschlussstatus eines Prozesses, der über pidfd identifiziert wird, zu extrahieren, nachdem der übergeordnete Prozess die Bestätigung des Abschlusses des untergeordneten Prozesses (reaped) erhalten hat und dessen Ressourcen freigegeben wurden. Dem Systemaufruf wurde das Flag PIDFD_SELF hinzugefügt, mit dem der Prozess auf sich selbst verweisen kann.
    • Für die Architektur RISC-V wurde die Unterstützung für die Erweiterungen BFloat16, Zaamo (atomare Speicheroperationen), Zalrsc (Load-Reserved/Store-conditional) und ZBKB (bitweise Operationen für die Kryptographie) realisiert.
    • Beim Tracing wurde die Möglichkeit geschaffen, die Argumente aufgerufener Funktionen zu speichern und sie in den Trace-Logs anzuzeigen.
    • Im asynchronen E/A-System io_uring wurde die Unterstützung zum Lesen von Informationen über epoll-Ereignisse hinzugefügt. Die Verwendung von io_uring zur Verarbeitung von epoll-Ereignissen ermöglicht die Reduzierung der Kontextwechsel und bietet die Möglichkeit, mehrere epoll-Ereignisse gleichzeitig zu verarbeiten.
    • Im eBPF-Subsystem wurde die Verifizierung von Programmen mit Schleifen verbessert. Neue Anweisungen "timed_may_goto", "load-acquire" und "store-release" wurden hinzugefügt. Es wurde die Möglichkeit geschaffen, erweiterte Dateiattribute aus BPF-Programmen zu ändern. Eine Funktion try_alloc_pages() wurde hinzugefügt, die darauf abzielt, Speicher bei hoher Wahrscheinlichkeit eines Fehlschlags der Operation (beim Ausführen von BPF-Programmen in eingeschränkten Kontexten) zuzuweisen.

      Ein neuer Sperrprimitive — rqspinlock (Resilient Queued Spin Lock) — wurde implementiert, der während der Ausführung Situationen identifiziert, die zu Deadlocks führen. Das neue Primitive ermöglicht das Laden von BPF-Programmen, für die der Verifizierer die Korrektheit im Umgang mit Sperren nicht garantieren konnte.

    • Die Zuverlässigkeit der Zuweisung von großen Speicherseiten (huge-page) wurde erheblich erhöht.
    • Die Berechnung von CRC64-Prüfziffern auf x86-Systemen wurde erheblich beschleunigt. Unter anderem wurden neue Vektor-Anweisungen aus dem AVX-512-Befehlsatz zur Beschleunigung verwendet. In einigen Fällen hat sich die Leistung um das 100-Fache verbessert.
    • Die Übertragung von Änderungen aus dem Rust-for-Linux-Zweig, die die Verwendung der Programmiersprache Rust als zweite Sprache für die Entwicklung von Treibern und Kernelmodulen betreffen, wurde fortgesetzt (die Unterstützung von Rust ist standardmäßig nicht aktiv und führt nicht dazu, dass Rust zu den obligatorischen Build-Abhängigkeiten des Kernels gehört). Es wurde die Möglichkeit geschaffen, im Kernel-Code das Makro "#[kunit_tests()]" zur Ausführung von Unit-Tests zu verwenden. Unterstützung für die ARMv7-Architektur wurde hinzugefügt. Es wurden dma- und hrtimer-Module mit Rust-Bindings für DMA (von Linus eingefügt, um den Maintainer zu umgehen, der danach von seinem Posten zurücktrat) und hochgenaue Timer implementiert. Die Module 'list', 'str', 'sync', 'error' und 'alloc' wurden erweitert. Unterstützung für die neue Syntax '&raw' (raw_ref_op) wurde hinzugefügt.
    • Im perf-Subsystem wurde die Möglichkeit zur Profilerstellung von Verzögerungen implementiert, wobei Informationen vom Scheduler verwendet werden.
    • Ein Kernel-Startparameter "traceoff_after_boot" wurde hinzugefügt, der das Tracing deaktiviert, nachdem der Kernel geladen und der Init-Prozess gestartet wurde. Der Parameter kann bei der Diagnose von Problemen im Zusammenhang mit dem Bootprozess verwendet werden und stellt sicher, dass die während des Bootvorgangs gesammelten Tracedaten nicht überschrieben werden.
    • Die Unterstützung für 32-Bit x86-Systeme mit mehr als 8 CPUs und 4 GB RAM wurde eingestellt. Solche Hardware wird seit langem nicht mehr produziert, und Systeme, die solche Ressourcen benötigen, wurden auf 64-Bit-CPUs migriert.
    • Es wurden Änderungen an der Implementierung von POSIX-Timern vorgenommen, die es dem Werkzeug CRIU (Checkpoint/Restore in Userspace) ermöglichen, Timer-IDs zu speichern und wiederherzustellen.
  • Virtualisierung und Sicherheit
    • Die Möglichkeit, Linux als Root-Umgebung (Dom0, Root-Partition) für den Hypervisor Hyper-V (Microsoft Hypervisor) zu verwenden, wurde hinzugefügt. Die Host-Umgebung ist für die Verwaltung des Hypervisors, die Organisation des Starts von Gastsystemen, die Zuweisung von Ressourcen und die Gewährleistung der Interaktion zuständig. virtuelle Maschinen Die Verwaltung des Hypervisors Hyper-V unter Linux erfolgt über das Gerät /dev/mshv.
    • Das Landlock-Modul, das unprivilegierten Programmen Mittel zur Einschränkung der Nutzung von Objekten des Linux-Kernels (Dateihierarchien, Netzwerk-Sockets, ioctl usw.) bietet, hat einen Audit-Mechanismus erhalten. Der Audit ermöglicht eine detaillierte Bewertung der Gründe für Zugriffsblockaden, die bei der Nutzung von Landlock durchgeführt werden, und gibt Aufschluss darüber, wann und welche Operation blockiert wurde, warum die Blockade erfolgt ist und welche Regel ausgelöst hat.
    • Die Möglichkeit, in LSM-Modulen (Linux Security Modules) Handler zu implementieren, die Zugriffe auf das asynchrone Ein-/Ausgabe-System io_uring kontrollieren und die Nutzung von io_uring für Umgehungen von Beschränkungen bei Systemaufrufen blockieren können, wurde hinzugefügt. Ein solcher Handler wurde im LSM-Modul SELinux implementiert.
    • In SELinux wurde die Möglichkeit geschaffen, Richtlinien auf alle von dem Kernel geladenen Datentypen anzuwenden, einschließlich Firmware-Images, Sicherheitsrichtlinien und Zertifikate.
    • Ein Versiegelungsmodus (seal) für bestimmte Gedächtnismapping-Operationen, die vom Kernel im Adressraum des Prozesses durchgeführt werden, wurde hinzugefügt. Die Versiegelung verwandelt das Mapping in einen Nur-Lese-Modus und verhindert Änderungen im Falle einer Ausnutzung von Schwachstellen. Dies gilt für die Mappings vDSO, vsyscall, vvar, sigpage und uprobes. Der Modus ist standardmäßig deaktiviert, da er die Funktion einiger Anwendungen beeinträchtigen könnte. Um ihn zu aktivieren, wurde die Build-Option CONFIG_MSEAL_SYSTEM_MAPPINGS hinzugefügt.
  • Netzwerksubsystem
    • Die Arbeiten zur Beseitigung der globalen Sperre des Netzwerk-Stacks RTNL (rtnl_lock) und deren Umwandlung in an bestimmte Netzwerk-Namensräume gebundene Sperren wurden fortgesetzt.
    • Es wurde die ursprüngliche Möglichkeit hinzugefügt, Netzwerkpakete über io_uring zu erhalten, wobei der Inhalt direkt im Programmspeicher des Benutzers ohne Zwischenpufferung (zero-copy) kopiert wird. In durchgeführten Tests ermöglichte die Änderung die Verarbeitung des Verkehrs über einen 200-Gigabit-Kanal unter Verwendung eines CPU-Kerns.
    • Es wurden sysctl tcp_rto_max_ms und die TCP-Socket-Option TCP_RTO_MAX_MS implementiert, über die die maximale Zeit zwischen den Versuchen zum erneuten Senden von Paketen festgelegt werden kann.
    • Im BPF wurde eine Reihe von Callback-Aufrufen hinzugefügt, um Informationen über die Zeit aus verschiedenen Teilen des Netzwerkstacks zu erhalten, die für die Diagnose von Problemen mit Netzwerkverzögerungen verwendet werden können.
    • Leistungsoptimierungen für Netzwerkoperationen wurden hinzugefügt:
      • Die Optimierung von GRO (Generic Receive Offload), die mehrere kleine Pakete zu einem großen zusammenführt, wird nun aktiviert, wenn die Paketverarbeitung auf eine andere CPU (zur Lastenverteilung) umgeschaltet wird, während das XDP (eXpress Data Path)-Subsystem verwendet wird, das die Verarbeitung von Paketen auf der Ebene des Netzwerktreibers vor der Übergabe an den Netzwerkstack ermöglicht. Der Leistungsgewinn bei der Verarbeitung von TCP-Strömen durch die Anwendung der Optimierung kann bis zu doppelt so hoch sein.
      • Unter starker Last wurde die Leistung der Funktion connect() durch den Austausch der Spin-Locks gegen den Synchronisierungsmechanismus RCU (Read-Copy-Update) bei der Suche nach Verbindungsinformationseinträgen (Quellen- und Zieladressen und Ports) verdoppelt. IP-Adressen Zusätzlich wurde eine Hash-Optimierung durchgeführt, die zu einem weiteren Leistungszuwachs von 229 % führte.
      • Die Implementierung von MPTCP (Multipath TCP), einer Erweiterung des TCP-Protokolls zur gleichzeitigen Paketzustellung über mehrere Routen durch verschiedene Netzwerkschnittstellen, die an unterschiedliche IP-Adressen gebunden sind, wurde beschleunigt. MPTCP im Einzelstrombetrieb wurde um 29 % beschleunigt.
      • In netfilter wurde die Durchführung von Routen-Suchoperationen in der FIB (Forwarding Information Base) bei vorhandenen Sockets eingestellt. Dank dieser Optimierung ist die Leistung um 20 % gestiegen.
      • Die Leistung von UDP unter Flood-Bedingungen wurde um 10% gesteigert, indem unnötige Operationen mit der Struktur sk_tsflags beim Empfang von Paketen ausgeschlossen wurden.
    • Ein Treiber mit der Implementierung des Protokolls MCTP-over-USB wurde hinzugefügt.
  • Ausrüstung
    • Im Kern wurde die erste Implementierung des Nova-Treibers für NVIDIA-GPUs mit GSP-Firmware angenommen, die seit der NVIDIA GeForce RTX 2000-Serie auf der Turing-Mikroarchitektur verwendet werden. Der Treiber ist in Rust geschrieben. In der ersten Phase wurde nur das Grundgerüst von nova-core hinzugefügt, das etwa 400 Zeilen Code umfasst und eine grundlegende Abstraktionsebene über die Software-Schnittstellen der GSP-Firmware bereitstellt. In der nächsten Phase plant man, den DRM-Treiber nova-drm (Direct Rendering Manager) zum Kern hinzuzufügen, um die Interaktion mit dem GPU aus dem Benutzermodus zu ermöglichen, sowie einen VFIO-Treiber mit einem vGPU-Manager, der die Verwendung virtueller NVIDIA-GPUs in Virtualisierungssystemen erlaubt.
    • Die Arbeit am DRM-Treiber (Direct Rendering Manager) Xe für GPUs auf der Basis der Intel Xe-Architektur, die in den Intel-Grafikkarten der Arc-Familie und in integrierter Grafik ab den Tiger-Lake-Prozessoren verwendet wird, wurde fortgesetzt. Unterstützung für SVM (Shared Virtual Memory), ein Bestandteil des DRM-Frameworks, das den gemeinsam genutzten Speicher zwischen CPU und GPU verwaltet, wurde hinzugefügt.
    • Im i915-Treiber wurden Identifikatoren für neue GPUs hinzugefügt.
    • Im Nouveau-Treiber wurde der GSP RPC überarbeitet und die Schnittstelle drm_slave_encoder integriert.
    • Im AMDGPU-Treiber wurde die Unterstützung für die DCN36-Architektur (Display Core Next) implementiert. Die Möglichkeit, eigene Helligkeitskurven festzulegen, die zur Helligkeitskorrektur des Displays verwendet werden, wurde hinzugefügt.
    • Im Adreno-Treiber wurde die Unterstützung für die Qualcomm Adreno 623 GPU hinzugefügt.
    • Die Unterstützung für die Apple Touch Bar-Touchpanels wurde hinzugefügt.
    • Die Unterstützung für die zweite Version der eUSB2-Erweiterung (eUSB2V2 — Embedded USB2 Version 2.0), die die Betriebsspannung (bis zu 1,2 Volt) senkt und die Leistung von USB 2.0 erhöht, wurde eingeführt. Die Datenübertragungsrate in eUSB2V2 kann 4,8 Gbit pro Sekunde erreichen, was zehnmal schneller ist als die üblichen 480 Mbit pro Sekunde, die für USB 2.0 typisch sind. eUSB2V2 ermöglicht es Laptop-Herstellern, ihre Geräte mit höherauflösenden Webcams auszustatten und weiterhin den Embedded USB2-Bus für deren Anschluss zu verwenden.
    • Die Unterstützung für Intel Killer E5000 (RTL8126) Ethernet-Adapter wurde hinzugefügt.
    • Die Unterstützung für die Bildschirm-Panel Visionox RM692E5, Rockchip w552793dba-v10, kingdisplay-kd110n11-51ie und starry-2082109qfh040022-50e wurde hinzugefügt.
    • Ein Treiber für die Samsung Galaxy Book-Laptops wurde hinzugefügt.
    • Die Unterstützung für die Audiosysteme Presonus Studio 1824c, Jabra Evolve 65 wurde hinzugefügt. Unterstützung für die DSP-Module AMD ACP 7.x, AWINC WM88166, Everest ES8388, Intel AVS PEAKVOL und GAIN. Die Audio-Unterstützung auf Laptops von ASUS, HP und Lenovo wurde verbessert.
    • Unterstützung für ARM-Plattformen, SoCs und Geräte hinzugefügt: Arm Morello, AMD (Xilinx) Versal NET, Google Pixel Pro 6, NetCube Kumquat, MYIR Remi Pi, Huawei Matebook E Go, Milk-V Jupiter ST STM32MP2, Mediatek MT8370, Apple T2, Skov (i.MX8MP), EVK (i.MX95), Rockchip RK35xx, Allwinner A523, 11 Toradex-Platinen auf Basis von i.MX6.

Gleichzeitig hat die lateinamerikanische Free Software Foundation eine vollständig freie Kernvariante 6.15 – Linux-libre 6.15-gnu – veröffentlicht, die von Firmware- und Treiberkomponenten gereinigt wurde, die nicht-freie Komponenten oder Bereiche von Code enthalten, deren Verwendung vom Hersteller eingeschränkt ist. In der Version 6.15 wurde das Laden von Blobs in den Treibern nova, Qualcomm iris v4l2, Airoha NPU, Tehuti Networks TN40xx 10G Ethernet, Realtek 8814A WiFi, Apple Silicon SoC Touchscreen, Renesas UFS und aw88166 Audio neutralisiert. Die Bereinigung des Treibers Spider 1Gb Ethernet, der aus dem Kern entfernt wurde, wurde eingestellt. Verweise auf tivalisierte Binärdateien wurden entfernt. Es wurde eine Blockierung des Ladevorgangs von Blobs aus Rust-Code implementiert.

Quelle: opennet.ru

60GB SSD 8Gb DDR4