Nach zwei Monaten Entwicklung präsentierte Linus Torvalds die Veröffentlichung des Linux-Kernels 6.17. Zu den bemerkenswertesten Änderungen gehören: Verbesserung der Btrfs-Leistung, die Systemaufrufe file_getattr() und file_setattr(), die Vereinheitlichung von Einprozess- und Mehrprozesskonfigurationen im Scheduler, das DAMON_STAT-Modul mit Speicherzugriffsstatistiken, Unterstützung für Live-Patches auf ARM64-Systemen, die Übertragung von Core-Dumps über den AF_UNIX-Socket, die Begrenzung von SCHED_EXT über cgroup, vereinfachte Einstellungen zum Schutz vor CPU-Schwachstellen, die Kompilierung in Clang mit der Initialisierung von Variablen auf dem Stack, Schutz vor Manipulationen von /proc, die Erweiterung des RV (Runtime Verification)-Subsystems, die Beschränkung von AF_UNIX-Sockets über AppArmor, und der Algorithmus zur Überwachung von Überlastungen TCP DualPI2.
In die neue Version wurden 14.334 Korrekturen von 2.118 Entwicklern aufgenommen, die Patchgröße beträgt 46 MB (Änderungen betrafen 12.841 Dateien, 646.654 Zeilen Code wurden hinzugefügt, 398.782 Zeilen wurden entfernt). In der vorherigen Veröffentlichung gab es 15.924 Korrekturen von 2.145 Entwicklern, die Patchgröße betrug 50 MB. Etwa 43 % aller in 6.17 vorgestellten Änderungen beziehen sich auf Gerätetreiber, etwa 12 % der Änderungen beziehen sich auf die Aktualisierung von architekturspezifischem Code, 14 % betreffen den Netzwerkstack, 4 % betreffen Dateisysteme und 3 % interne Kernsubsysteme.
Die wichtigsten Neuerungen im Kernel 6.17 (1, 2, 3):
- Festplattensubsystem, Ein-/Ausgabe und Dateisysteme
- In Btrfs wurde experimentelle Unterstützung für große Speicherseiten (large folios) hinzugefügt, die die Overheadkosten senken und die Leistung einer Reihe von Operationen verbessern. Es wurde ein Caching für Anfragen an die Bitmaps der freien Speicherverteilung implementiert, was die Leistung beim Erstellen leerer Dateien um 20 % gesteigert hat. Das Vorab-Lesen in Systemen, die Datenkompression verwenden, wurde verbessert. Eine dichtere Anordnung der Schlüssel in der XArray-Datenstruktur wurde gewährleistet, was die Kompaktheit der Speicherung von Extent-Baumknoten erhöhte und die Anzahl der Endknoten um 50-70 % reduzierte. Zusätzliche Einstellungen zur Nutzung der Kompression in defragmentierten Extents wurden bereitgestellt.
- In dem ext4-Dateisystem wurde die Unterstützung für gepufferte Ein- / Ausgaben mit dem RWF_DONTCACHE-Flag hinzugefügt, bei dem Daten sofort nach Abschluss der Operation aus dem Seitenspeicher gelöscht werden.
- Im EROFS-Dateisystem wurde Unterstützung für die Komprimierung von Metadaten implementiert.
- Der NFS-Server kann nun Schreiboperationen an Clients delegieren, die Dateien im Nur-Lese-Modus öffnen.
- Im Systemaufruf fallocate() wurde das Flag FALLOC_FL_WRITE_ZEROES hinzugefügt, das es ermöglicht, einen bestimmten Bereich in einer Datei mit Nullen zu füllen, indem der von einigen SSD-Speichern unterstützte Befehl WRITE_ZERO verwendet wird, der das Nullstellen ohne Ein-/Ausgabe-Operationen durchführt. Diese Option ist momentan nur im ext4-Dateisystem verfügbar.
- Die Systemaufrufe file_getattr() und file_setattr() wurden hinzugefügt, um die Attribute des Inodes einer bestimmten Datei zu manipulieren.
- Der Treiber „pktcdvd“ für die Arbeit mit optischen Medien im Paketspeicher wurde entfernt, da er 2016 als veraltet gekennzeichnet wurde.
- Das Bcachefs-Dateisystem im Linux-Kernel wurde in den externen Unterstützungsmodus überführt, was bedeutet, dass Änderungen an Bcachefs nicht mehr in die Hauptkernelbasis aufgenommen werden, während dieses FS im Code der Kernelbasis erhalten bleibt. Die Entwicklung von Bcachefs wird außerhalb der Kernel-Codierung erfolgen, bis Kent Overstreet nachweisen kann, dass eine ordnungsgemäße Interaktion mit anderen Kernel-Entwicklern möglich ist und die etablierten Entwicklungsrichtlinien eingehalten werden.
- Speicher und Systemdienste
- Die Unterstützung für einprozesskonfigurierte Systeme wurde aus dem Task-Scheduler entfernt. Auf Systemen mit einem Prozessor sollten jetzt Kerne verwendet werden, die für multiprozessorfähige Systeme (SMP) kompiliert sind. Der Code für einprozesskonfigurierte und multiprozessorfähige Systeme wurde vereinheitlicht und von überflüssigen Bindungen an den Kernelparameter CONFIG_SMP befreit.
- Das Kernelmodul DAMON_STAT (Data Access Monitoring Results Stat) wurde hinzugefügt, um den Zugriff auf den Arbeitsspeicher unter Verwendung des DAMON-Subsystems (Data Access MONitor) zu überwachen. Das Modul bietet Statistiken zur Inaktivität (memory_idle_ms_percentiles) und zur geschätzten Speicherbandbreite (estimated_memory_bandwidth).
- Auf ARM64-Architekturen wurde die Unterstützung für Live-Patching implementiert, die es ermöglicht, Korrekturen am Linux-Kernel im laufenden Betrieb anzuwenden, ohne das System neu zu starten oder anzuhalten.
- In der minimalistischen C-Bibliothek nolibc, die mit dem Quellcode des Linux-Kernels ausgeliefert wird und eine Schnittstelle über grundlegende Systemaufrufe bereitstellt, wurde die Unterstützung für die Architekturen SuperH, x32, MIPS n32 und MIPS n34 implementiert.
- Die Möglichkeit, den Inhalt von Core-Dumps über den Socket AF_UNIX zu senden, wurde erweitert, was es ermöglicht, im Benutzerspeicher sicherere Handler für Core-Dumps zu erstellen, die nicht auf den Aufruf privilegierter Prozesse durch den Kernel angewiesen sind. In der neuen Version wurde ein Protokoll zur Erstellung hinzugefügt. Server, die in der Lage sind, die Verarbeitung von Core-Dumps auf der Ebene einzelner Aufgaben zu steuern. Zum Beispiel können für einige Prozesse Core-Dumps ignoriert werden, während andere sie über einen Socket übertragen. Ein Prototyp eines Servers zur Verwaltung von Core-Dumps wurde separat vorbereitet.
- Eine neue Option für die Kernel-Befehlszeile „crashkernel=size,cma“ wurde hinzugefügt, um über CMA (Contiguous Memory Allocator) Speicherplatz für die Speicherung von Kernel-Crash-Dumps zu reservieren.
- Die Funktionalität des pidfd-Mechanismus wurde erweitert, der es ermöglicht, Bezeichner zu verwenden, die mit bestimmten Prozessen verknüpft sind und im Gegensatz zu pid nicht erneut zugewiesen werden können. Es wurde die Möglichkeit hinzugefügt, erweiterte Attribute aus dem Benutzerraum an pidfd zu binden. Das Öffnen von Dateideskriptoren für pidfd wurde über die Funktion open_by_handle_at() ohne Bindung an das Dateisystem erlaubt. Interne Informationen, die vom Kernel zusammen mit pidfd erstellt werden, sind jetzt an den Prozess und nicht an pidfd gebunden und werden zwischen dem erneuten Öffnen desselben Prozesses gespeichert.
- Der BPF-Subsystem wurde um die Funktion bpf_cgroup_read_xattr() zum Lesen erweiterter Dateiattribute erweitert. Es wurde die Möglichkeit geschaffen, in BPF-Programmen typische String-Operationen wie bpf_strcmp, bpf_strnchr, bpf_strchrnul, bpf_strlen und bpf_strspn, die im Nur-Lese-Modus arbeiten, zu verwenden. Die Nutzung der Standardausgaben stdout und stderr zur Interaktion mit Komponenten im Benutzerraum wurde ermöglicht. Für Systeme, die auf der LoongArch-Architektur basieren, wurde in BPF die Möglichkeit der dynamischen Modifikation von Code, der Mechanismus „BPF trampoline“ (reduziert die Overheadkosten bei der Übertragung von Aufrufen zwischen Kernel und BPF-Programmen) und das Starten von Programmen, die struct_ops zur Erstellung von Kernelfunktionshandlern über BPF verwenden, implementiert.
- Im Zeitsystem wurde die Unterstützung für Hilfsuhren (auxiliary) implementiert, die nicht mit den regulären Systemuhren verbunden sind und deren eigener Rhythmus folgt (früher liefen alle Uhren mit dem gleichen Rhythmus und unterschieden sich nur durch die Verschiebung).
- Die erste Unterstützung für Proxy-Ausführung (Proxy Execution) wurde hinzugefügt, um Probleme mit der Prioritätsinvertierung abzumildern. Proxy-Ausführung ermöglicht es einem Task, der auf die Freigabe einer Sperre wartet, seinen Ausführungskontext an den Task weiterzugeben, der die Sperre hält, um die Freigabe dieser Sperre zu beschleunigen.
- 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 Kernmodulen betreffen, wurde fortgesetzt (die Unterstützung von Rust ist standardmäßig nicht aktiviert und führt nicht zur Einbeziehung von Rust in die erforderlichen Build-Abhängigkeiten des Kernels). Es wurden Abstraktionen zum Management von Spannungs- und Stromreglern, Firmware-Eigenschaften, Ein-/Ausgabe-Ressourcen und Eingabe-/Ausgabe-Speicher hinzugefügt. Das Makro „warn_on!()“ wurde implementiert. Der Typ UserPtr für Zeiger im Benutzerspeicher wurde hinzugefügt. Die Funktionalität der Module workqueue, uaccess, dma, time und list wurde erweitert. Es wurde ein Modul „bits“ mit den Funktionen „bit“ und „genmask“ hinzugefügt.
- Der Code zur Berechnung von CRC-Checksummen wurde überarbeitet, und neue Aufrufe zur Generierung von SHA-1- und SHA-2-Hashes wurden hinzugefügt. Architekturspezifische Optimierungen wurden implementiert. Die Leistung der Funktion crc32c() wurde auf neuen x86_64-CPUs, die die VPCLMULQDQ-Erweiterung (Vector Carry-Less Multiplication of Quadwords) unterstützen, verbessert.
- Für S390-Systeme wurde die Unterstützung für das Auslagern in den Swap-Bereich und die Migration großer Seiten (transparent huge page) implementiert.
- Die Möglichkeit zur Konfiguration der Aggressivität der Seitenfreigabe (proactive-reclaim) bei Mangel an Speicher wurde in Bezug auf einzelne NUMA-Knoten hinzugefügt, wodurch NUMA-Knoten выделяются werden können, für die eine aktivere Speicherfreigabe angewendet wird. Zum Beispiel: „echo „512M swappiness=10“ > /sys/devices/system/node/node1/reclaim“.
- Im SCHED_EXT-Mechanismus, der die Verwendung von BPF zur Erstellung von CPU-Scheduler ermöglicht, wurde die Möglichkeit zur Steuerung der Bandbreite über cgroups hinzugefügt. Beispielsweise kann der Parameter cpu.max verwendet werden, um die CPU-Belastung zu begrenzen.
- Das automatische Mounting des virtuellen Dateisystems tracefs im Verzeichnis /sys/kernel/debug/tracing wurde als veraltet erklärt; stattdessen sollte /sys/kernel/tracing verwendet werden.
- Virtualisierung und Sicherheit
- Die Möglichkeit zur Aktivierung wurde hinzugefügt Schutz vor Schwachstellen in CPU durch Auswahl der blockierbaren Angriffsvektoren anstatt spezifische Schwachstellen in den Einstellungen anzugeben. Die Blockierungsmethoden werden je nach Art des Isolationsbruchs ausgewählt: zwischen Benutzer und Kernel (user-kernel), zwischen Benutzern (user-user), zwischen Gastbetriebssystem und Host-Umgebung (guest-host), zwischen verschiedenen Gastbetriebssystemen (guest-guest) und zwischen verschiedenen Threads (cross-thread). Der vorgeschlagene Ansatz ermöglicht es, nur den Schutz vor den Klassen von Schwachstellen zu aktivieren, die den Benutzer tatsächlich betreffen. Beispielsweise können Eigentümer von Cloud-Umgebungen die Modi guest-host und guest-guest aktivieren, wonach die Schutzmethoden gegen die Schwachstellen BHI, GD, L1TF, MDS, MMIO, Retbleed, RFDS, Spectre_v2, SRBDS, SRSO und TAA aktiviert werden.
- Die Unterstützung für die Kompilierung mit dem Clang-Compiler wurde hinzugefügt, einschließlich des Modus zur Verfolgung der Stapeltiefe, bei dem alle im Stapel gespeicherten Variablen initialisiert werden. Die Initialisierung erfolgt, um das Auslesen von Informationen aus dem Kernel über nicht initialisierte Variablen zu verhindern, die Reste zuvor im Stapel gespeicherter Daten enthalten können. Zuvor wurde eine ähnliche Möglichkeit beim Einsatz des GCC-Plugins STACKLEAK unterstützt.
- Es wurde ein Schutz vor Angriffen auf das Dateisystem /proc durch die Einbindung im 'bind'-Modus hinzugefügt. Die Inode-Nummer des Wurzelverzeichnisses /proc ist nun fest (PROCFS_ROOT_INO) und kann vom Prozess im Benutzerspeicher überprüft werden.
- In das RV (Runtime Verification) Subsystem, das zur Überprüfung der Korrektheit von hochverfügbaren Systemen dient, wurde die Komponente rtapp (Real-time application monitor) zur Überwachung typischer Probleme in Echtzeitanwendungen hinzugefügt, sowie die Komponenten rp, sssw und opid zur Testung des Taskplaners. Es wurde die Möglichkeit implementiert, Überwachungs-Komponenten zu erstellen, die zur Bestimmung des Verhaltens lineare temporale Logik anstelle eines deterministischen Automaten verwenden. Die Überprüfung erfolgt zur Laufzeit durch das Anhängen von Handlern an Tracing-Punkten, die den tatsächlichen Verlauf der Ausführung mit einem zuvor definierten Referenzmodell vergleichen, das das erwartete Verhalten des Systems bestimmt.
- In das AppArmor-System wurde die Unterstützung für die Zugriffssteuerung auf AF_UNIX-Sockets hinzugefügt.
- Im KVM-Hypervisor wurde in ARM-Systemen die Unterstützung für den Interrupt-Controller GICv5 implementiert.
- Die Einstellung CONFIG_KVM_IOAPIC wurde hinzugefügt, um die Unterstützung der KVM-Emulation für APIC, PIC und PIT deaktivieren zu können.
- Ein Schutz gegen die Schwachstelle VMSCAPE wurde hinzugefügt.
- Der ioctl-Befehl FS_IOC_GETLBMD_CAP wurde hinzugefügt, um Informationen aus dem Benutzerraum über die Anwendung von Integritätsschutzmechanismen auf eine Datei abzurufen.
- Die Schnittstelle /sys/fs/selinux/user wurde als veraltet erklärt, bei Zugriff wird nun eine fünfsekündige Verzögerung eingeführt und eine Warnung im Log ausgegeben.
- Netzwerksubsystem
- Die Umsetzung der Technologie PSE (Power Sourcing Equipment), die zur Stromversorgung über Ethernet für Geräte wie IP-Kameras und drahtlose Zugangspunkte verwendet wird, unterstützt nun konfigurierbare Strategien zur Bewertung des Leistungsbudgets (gesamt verfügbare Leistung). Solche Strategien erlauben es, zu bestimmen, welche Ports zuerst abgeschaltet werden sollten, um Überlastungen zu vermeiden.
- In die Implementierung des MCTP-Protokolls (Management Component Transport Protocol) wurde die Unterstützung für das Routen von Paketen zu externen Knoten über Zwischenknoten (Gateway-Routing) integriert. Die nachfolgenden Regeln ermöglichen es beispielsweise, Pakete an den Knoten mit der ID 10 (Endpoint ID 10) über das Gerät mctpi2c0 unter Verwendung der Adresse 0x1d zu leiten, die direkt mit dem Knoten ID 9 verbunden ist. mctp route add 9 via mctpi2c0 mctp neigh add 9 dev mctpi2c0 lladdr 0x1d mctp route add 10 gw 9
- Für UNIX-Sockets (AF_UNIX) wurde die Option SO_INC implementiert, und für die VSOCK-Adressfamilie die Option SIOCINQ. Die implementierten Optionen sind ähnlich der TCP_INQ-Option für TCP und ermöglichen es, über eine Steueranfrage Informationen über die Anzahl der Bytes abzurufen, die im Socket zum Lesen verfügbar sind.
- Für TCP gilt nun eine strikte Einhaltung der deklarierten Größe des Empfangsfensters, das die Menge an Daten definiert, die gesendet werden dürfen, bevor eine ACK-Bestätigung von der anderen Seite empfangen wird. Zuvor verarbeitete der Kernel weiterhin Daten, die über das deklarierte Empfangsfenster hinausgingen, wird dies nun aber einstellen.
- In MPTCP (Multipath TCP) wurde die Möglichkeit hinzugefügt, die TCP_MAXSEG-Socket-Option zu nutzen, um die maximale Größe der gesendeten Segmente zu begrenzen. MPTCP ist eine Erweiterung des TCP-Protokolls zur Organisation der Paketlieferung gleichzeitig über mehrere Routen durch verschiedene Netzwerkinterfaces, die an unterschiedliche IP-Adressen gebunden sind.
- Unterstützung des TCP-Überlastkontrollalgorithmus DualPI2 (RFC 9332) hinzugefügt, der skalierbare Überlastkontroller für Traffic mit hohem Qualitätsanspruch ermöglicht (z. B. TCP-Prague und DCTCP), ohne die Leistung des klassischen Traffics zu beeinträchtigen, für den solche Überlastkontroller wie Reno und Cubic verwendet werden.
- Das sysctl «force_forwarding» hinzugefügt, mit dem der Traffic auf ausgewählten Netzwerkinterfaces mit IPv6 umgeleitet werden kann.
- Unterstützung des Verlustpaketerkennungsalgorithmus SACK (Selective Acknowledgment), beschrieben in RFC 6675, entfernt. Dieser Algorithmus wurde 2018 als veraltet erklärt. Zur Erkennung von TCP-Paketverlusten wird empfohlen, den RACK-TLP-Algorithmus zu verwenden.
- Ausrüstung
- Die Arbeit am drm-Treiber (Direct Rendering Manager) Xe für GPUs auf Basis der Intel-Xe-Architektur fortgesetzt, die in Intel-Grafikkarten der Arc-Serie und in integrierter Grafik verwendet wird, beginnend mit der Tiger-Lake-Prozessorreihe. In der neuen Version wird standardmäßig Unterstützung für Chips auf Basis der Mikroarchitektur Panthor Lake hinzugefügt und Unterstützung für die Mikroarchitektur WildCat Lake ergänzt.
- Im AMDGPU-Treiber für GFX9.x wurde die Unterstützung des Cleaner Shader-Mechanismus implementiert, der den Speicher der GPU vor der Wiederverwendung reinigt, um Datenlecks zu vermeiden, die nach der Benutzung durch einen anderen Prozess zurückbleiben. Die Unterstützung des Energiesparmodus wurde verbessert. Die Möglichkeit des Übergangs in den Schlafmodus in Umgebungen mit AMD SR-IOV wurde hinzugefügt. Das Lichtmanagement wurde verbessert.
- Im i915-Treiber wurde die Unterstützung des drm_panic-Mechanismus implementiert, der bei Abstürzen eine Art «blauen Bildschirm des Todes» anzeigt. Unterstützung für den Display-Controller, der in Wildcat-Lake-Chips verwendet wird, wurde hinzugefügt.
- Die Integration der Nova-Treiberkomponenten für NVIDIA-GPUs, die mit GSP-Firmware ausgestattet sind und seit der NVIDIA GeForce RTX 2000-Serie auf Basis der Turing-Mikroarchitektur verwendet werden, fortgesetzt. Der Treiber ist in Rust geschrieben. In der neuen Version wurde eine Abstraktionsebene für die Arbeit mit DMA hinzugefügt, ein VBIOS-Parser implementiert, Code zur Einstellung des Framebuffers eingegeben und Unterstützung für beschleunigtes Booting im Falcon-Modus bereitgestellt.
- Im Adreno-Treiber wurde die Unterstützung für die Qualcomm Adreno GPUs x1-45 und x1-85 hinzugefügt.
- Im MSM-Treiber wurde die Unterstützung für die Adreno GPU SM8750 und das Mappen von Videospeicher (VM_BIND) hinzugefügt.
- Im Panfrost-Treiber wurde die Unterstützung für Mali GPUs, die in Mediatek SoC mt8370 verwendet werden, hinzugefügt.
- Der Lima-Treiber hat Unterstützung für GPUs hinzugefügt, die in SoC Rockchip RK3528 verwendet werden.
- Ein MTD (Memory Technology Devices)-Treiber wurde hinzugefügt, um auf den in der Intel-GPU integrierten NVM-Speicher zuzugreifen.
- Unterstützung für ASoC-Audiosysteme wurde hinzugefügt: IMX WM8524, AMD ACP7.2, SoundWire ACP 7.1, Fairphone 4 & 5, Qualcomm QCS8275, Framework Laptop 13 (AMD Ryzen AI 300), CS35L41 HDA (verwendet in ASUS-Laptops), Richtek RTQ9124, TI TAS5753, HP EliteBook x360 830 G6, EliteBook 830 G6, LG 16Z90R-A, HP 15-fc000. Der HD-Audio-Code wurde reorganisiert.
- Support für ARM-Plattformen, SoCs und Geräte wurde hinzugefügt: NVIDIA Tegra264, Marvell PXA1908 (der erste 64-Bit-Chip von Marvell für Smartphones), CIX P1, Axiado AX3000, Sophgo SG2000 (kombiniert ARM- und RISC-V-Kerne), Mediatek mt6572, exynos2200 (verwendet im Samsung Galaxy S22), Renesas R-Car V4M-7, TI am62d2 und Sophgo sg2042, Laptops auf Basis von Mediatek mt8186 und Qualcomm Snapdragon X1, Smartphones und Tablets auf Basis von SoCs mt6572, tegra30 und msm8976.
Gleichzeitig hat die lateinamerikanische Stiftung für freie Software eine vollständig freie Kernel-Variante 6.17 - Linux-libre 6.17-gnu - erstellt, die von Firmware- und Treiberelementen befreit ist, die nichtfreie Komponenten oder Codeabschnitte enthalten, deren Verwendung durch den Hersteller eingeschränkt ist. In der Version 6.17 wurde der Code zur Bereinigung von Blobs in den Treibern amdgpu, prueth, iwlwifi, btusb, pci mhi host, adreno a6xx, nova-core und Intel AVS aktualisiert. Die Blob-Namen in den dts-Dateien (Gerätedatenbaum) für ARM-Chips und Intel IPU7 wurden bereinigt. Die Blob-Ladung in den neuen PCI HDA-Treibern wurde neutralisiert. Die Bereinigung der Blobs im QLogic Infiniband-Treiber, der aus dem Kernel entfernt wurde, wurde eingestellt.
Quelle: opennet.ru
