Nach zwei Monaten Entwicklung hat Linus Torvalds die Version 6.17 des Linux-Kernels vorgestellt. Zu den auffälligsten Änderungen gehören: verbesserte Leistung von Btrfs, die Systemaufrufe file_getattr() und file_setattr(), die Vereinheitlichung von Ein- und Mehrprozessorkonfigurationen im Task-Scheduler, das Modul DAMON_STAT mit Speichzugriffsstatistiken, Unterstützung für Live-Patches auf ARM64-Systemen, das Senden von Core-Dumps über den Socket AF_UNIX, die Drosselung von SCHED_EXT durch cgroups, vereinfachte Konfiguration zum Schutz vor CPU-Schwachstellen, die Kompilierung in Clang mit der Initialisierung von Variablen auf dem Stack, Schutz vor Manipulationen an /proc, die Erweiterung des RV (Runtime Verification) Subsystems und die Einschränkung von AF_UNIX Sockets über AppArmor sowie die TCP DualPI2 Lastkontrollalgorithmus.
In der neuen Version wurden 14.334 Korrekturen von 2.118 Entwicklern vorgenommen, die Patchgröße beträgt 46 MB (die Änderungen betrafen 12.841 Dateien, 646.654 Codezeilen wurden hinzugefügt und 398.782 Zeilen entfernt). In der vorherigen Version gab es 15.924 Korrekturen von 2.145 Entwicklern, die Patchgröße betrug 50 MB. Etwa 43 % aller in 6.17 dargestellten Änderungen betreffen Gerätetreiber, etwa 12 % beziehen sich auf die Aktualisierung architekturspezifischen Codes, 14 % sind mit dem Netzwerk-Stack verbunden, 4 % mit Dateisystemen und 3 % mit internen Subsystemen des Kernels.
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 Seitenfolien (large folios) hinzugefügt, die die Overhead-Kosten senken und die Leistung mehrerer Operationen verbessern. Die Caching-Anfragen an die Bitmaps der freien Speicherplatzverteilung wurden umgesetzt, was die Leistung bei der Erstellung leerer Dateien um 20 % steigerte. Die Vorab-Lesevorgänge in Systemen, die Datenspeicherung nutzen, wurden verbessert. Eine dichtere Anordnung der Schlüssel in der XArray-Struktur sorgt für eine kompaktere Speicherung der Knoten im Extent-Baum und reduziert die Anzahl der Blattknoten um 50-70 %. Zusätzliche Einstellungen zur Nutzung von Kompression in defragmentierten Extents wurden bereitgestellt.
- Im Dateisystem ext4 wurde Unterstützung für gepuffertes Ein-/Ausgabe mit dem Flag RWF_DONTCACHE eingeführt, bei dem Daten sofort nach Abschluss der Operation aus dem Seitencache entfernt werden.
- Im Dateisystem EROFS 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, mit dem ein bestimmter Bereich in einer Datei mit Nullen gefüllt werden kann, indem ein von einigen SSD-Laufwerken unterstützter WRITE_ZERO-Befehl verwendet wird, der das Nullsetzen ohne Ein-/Ausgabe-Operationen durchführt. Diese Option ist derzeit nur im ext4-Dateisystem verfügbar.
- Die Systemaufrufe file_getattr() und file_setattr() wurden hinzugefügt, um die Attribute des Inodes einer angegebenen Datei zu manipulieren.
- Der Treiber 'pktcdvd' für die Arbeit mit optischen Medien im Paketmodus wurde entfernt, da er bereits 2016 als veraltet markiert wurde.
- Das Bcachefs-Dateisystem im Linux-Kernel wurde in einen Modus für externe Wartung versetzt, was bedeutet, dass Änderungen an Bcachefs nicht mehr in den Hauptkern aufgenommen werden, während dieses Dateisystem im Code-Basis des Kernels verbleibt. Die Entwicklung von Bcachefs wird außerhalb der Codebasis des Kernels fortgesetzt, bis Kent Overstreet nachweisen kann, dass eine ordnungsgemäße Interaktion mit anderen Kernel-Entwicklern möglich ist und die etablierten Entwicklungsregeln befolgt werden können.
- Speicher und Systemdienste
- Die Unterstützung für eineprozessige Konfigurationen wurde aus dem Task-Planer entfernt. Auf Systemen mit einem Prozessor sollten jetzt Kerne genutzt werden, die für Mehrprozessorsysteme (SMP) gebaut sind. Der Code für einprozessige und mehrprozessige Systeme wurde vereinheitlicht und von überflüssigen Bindungen an das Kernparameter CONFIG_SMP befreit.
- Das Kernel-Modul DAMON_STAT (Data Access Monitoring Results Stat) wurde hinzugefügt, um den Zugriff auf den Arbeitsspeicher unter Verwendung des DAMON (Data Access MONitor)-Subsystems zu verfolgen. Das Modul bietet Statistiken über Inaktivität (memory_idle_ms_percentiles) und die geschätzte Speicherdurchsatzrate (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 zu stoppen.
- In der minimalistischen C-Bibliothek nolibc, die mit den Quelltexten des Linux-Kernels geliefert wird und eine Schnittstelle zu den grundlegenden Systemaufrufen bereitstellt, wurde die Unterstützung für die Architekturen SuperH, x32, MIPS n32 und MIPS n34 implementiert.
- Die Möglichkeit, core-Dump-Inhalte über den AF_UNIX-Socket zu senden, wurde erweitert. Dies ermöglicht es, sicherere core-Dump-Handler im Benutzerspeicher zu erstellen, die nicht von privilegierten Prozessaufrufen des Kernels abhängig sind. Die neue Version enthält ein Protokoll für die Erstellung Server, das in der Lage ist, die Verarbeitung von core-Dumps auf der Ebene einzelner Aufgaben zu steuern. Zum Beispiel können für einige Prozesse core-Dumps ignoriert und für andere über den Socket übertragen werden. Ein Prototyp-Server zur Verwaltung von core-Dumps wurde separat vorbereitet.
- Die Kernel-Befehlszeilenoption "crashkernel=size,cma" wurde hinzugefügt, um über CMA (Contiguous Memory Allocator) Platz im Speicher für die Speicherung von Kernel-Crash-Dumps zu reservieren.
- Die Funktionen des pidfd-Mechanismus wurden erweitert, sodass Identifikatoren, die mit bestimmten Prozessen verbunden sind und sich von pid unterscheiden, nicht erneut zugewiesen werden können. Die Möglichkeit, erweiterte Attribute aus dem Benutzerspeicherraum an pidfd zu binden, wurde hinzugefügt. Es ist nun erlaubt, Dateideskriptoren für pidfd über die Funktion open_by_handle_at() ohne Bindung an das Dateisystem zu öffnen. Interne Informationen, die vom Kernel zusammen mit pidfd erstellt wurden, sind jetzt an den Prozess und nicht an pidfd gebunden und werden zwischen dem erneuten Öffnen desselben Prozesses gespeichert.
- In das BPF-Subsystem wurde die Funktion bpf_cgroup_read_xattr() zur Lesung erweiterter Dateiattribute eingefügt. Es wurde die Verwendung typischer String-Operationen in BPF-Programmen ermöglicht, wie bpf_strcmp, bpf_strnchr, bpf_strchrnul, bpf_strlen und bpf_strspn, die im Nur-Lese-Modus arbeiten. Außerdem wurde die Nutzung der Standardausgaben stdout und stderr für die Interaktion mit Komponenten im Benutzermodus ermöglicht. Für Systeme auf Basis der LoongArch-Architektur wurde in BPF die Möglichkeit der dynamischen Code-Modifikation, des „BPF trampoline“-Mechanismus (der die Kosten für den Aufruf zwischen Kernel und BPF-Programmen reduziert) und der Ausführung von Programmen, die struct_ops zur Erstellung von Kernel-Funktionshandlern über BPF verwenden, implementiert.
- Im Zeitmesssystem wurde die Unterstützung für Hilfsuhren (auxiliary) implementiert, die nicht mit den gewöhnlichen Systemuhren verbunden sind und in ihrem eigenen Rhythmus laufen (zuvor liefen alle Uhren mit identischem Rhythmus und unterschieden sich nur durch ihre Verschiebung).
- Die anfängliche Unterstützung für Proxy-Ausführung wurde hinzugefügt, um Probleme mit Prioritätenumkehr zu mildern. Die Proxy-Ausführung ermöglicht es einem Task, der auf die Freigabe einer Sperre wartet, seinen Ausführungskontext an den Task, der die Sperre hält, zu übertragen, 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 Kernelmodulen betreffen, wurde fortgesetzt (die Unterstützung für Rust ist standardmäßig nicht aktiviert und führt nicht dazu, dass Rust zu den obligatorischen Build-Abhängigkeiten des Kernels zählt). Abstraktionen zur Verwaltung von Spannungs- und Stromreglern, Firmware-Eigenschaften sowie Ein-/Ausgabe-Ressourcen und -Speicher wurden 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 der CRC-Prüfziffern wurde überarbeitet und es wurden neue Aufrufe zur Generierung der SHA-1- und SHA-2-Hashes 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 Speicherseiten (transparent huge page) implementiert.
- Die Möglichkeit zur Anpassung der Aggressivität bei der Freigabe von Speicherseiten (proactive-reclaim) bei unzureichendem Speicher in Bezug auf einzelne NUMA-Knoten wurde hinzugefügt, was es ermöglicht, NUMA-Knoten zuzuweisen, 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 es ermöglicht, BPF zur Erstellung von CPU-Scheduler zu verwenden, wurde die Möglichkeit zur Steuerung der Bandbreite über cgroups hinzugefügt. Zum Beispiel kann der Parameter cpu.max verwendet werden, um die CPU-Belastung zu begrenzen.
- Das automatische Mounten 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 im CPU durch die Auswahl blockierbarer Angriffsvektoren statt spezifische Schwachstellen in den Einstellungen anzugeben. Die Blockierungsmethoden werden je nach Art der Isolationsverletzung gewählt: zwischen Benutzer und Kernel (user-kernel), zwischen Benutzern (user-user), zwischen Gästesystem und Host-Umgebung (guest-host), zwischen verschiedenen Gästesystemen (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 Inhaber von Cloud-Umgebungen die Modi guest-host und guest-guest aktivieren, wonach die Schutzmaßnahmen gegen die Schwachstellen BHI, GD, L1TF, MDS, MMIO, Retbleed, RFDS, Spectre_v2, SRBDS, SRSO und TAA aktiviert werden.
- Die Unterstützung für den Compiler Clang wurde erweitert, indem der Modus zur Verfolgung der Stacktiefe aktiviert wurde, bei dem alle im Stack gespeicherten Variablen initialisiert werden. Diese Initialisierung erfolgt, um zu verhindern, dass Informationen aus dem Kernel durch nicht initialisierte Variablen, die Überreste zuvor im Stack gespeicherter Daten enthalten können,泄漏. Zuvor wurde eine ähnliche Möglichkeit über das GCC-Plugin STACKLEAK unterstützt.
- Es wurde ein Schutz gegen Angriffe auf das Dateisystem /proc durch das Mounten im ‚bind‘-Modus hinzugefügt. Die Inode-Nummer der Wurzel von /proc ist jetzt festgelegt (PROCFS_ROOT_INO) und kann von Prozessen im Benutzerspeicher überprüft werden.
- In das Subsystem RV (Runtime Verification), das zur Überprüfung der Korrektheit hochverfügbarer Systeme dient, wurde die Komponente rtapp (Real-time Application Monitor) hinzugefügt, um typische Probleme in Anwendungen, die im Echtzeitmodus laufen, zu verfolgen. Zudem wurden die Komponenten rp, sssw und opid zur Testung des Task-Schedulers implementiert. Es wurde die Möglichkeit realisiert, Überwachungsbausteine zu erstellen, die zur Bestimmung des Verhaltensmodells lineare temporale Logik anstelle eines deterministischen Automaten nutzen. Die Überprüfung erfolgt zur Laufzeit durch das Anfügen von Handlern an Tracepoints, die den tatsächlichen Ausführungsstrang mit einem vorher definierten Referenzmodell abgleichen, das das erwartete Verhalten des Systems bestimmt.
- Im System AppArmor wurde die Unterstützung für die Zugriffskontrolle auf AF_UNIX-Sockets hinzugefügt.
- Im Hypervisor KVM auf ARM-Systemen wurde die Unterstützung für den Interrupt-Controller GICv5 implementiert.
- Die Einstellung CONFIG_KVM_IOAPIC wurde hinzugefügt, um die Unterstützung der APIC-, PIC- und PIT-Emulation in KVM zu deaktivieren.
- Ein Schutz gegen die Schwachstelle VMSCAPE wurde hinzugefügt.
- Der ioctl-Befehl FS_IOC_GETLBMD_CAP wurde hinzugefügt, um aus dem Benutzerspeicher Informationen über die Anwendung von Integritätsschutzmitteln auf Dateien abzurufen.
- Das Interface /sys/fs/selinux/user wurde als veraltet erklärt. Bei einem Zugriff darauf wird nun eine Verzögerung von fünf Sekunden eingefügt und eine Warnung im Log ausgegeben.
- Netzwerksubsystem
- In die Implementierung der Technologie PSE (Power Sourcing Equipment), die für die Stromversorgung über Ethernet für Geräte wie IP-Kameras und drahtlose Zugangspunkte verwendet wird, wurde die Unterstützung für anpassbare Strategien zur Bewertung des Strombudgets ( insgesamt verfügbare Leistung) hinzugefügt. Solche Strategien ermöglichen es, zu bestimmen, welche Ports zuerst abgeschaltet werden sollen, um eine Überlastung zu verhindern.
- In die Implementierung des Protokolls MCTP (Management Component Transport Protocol) wurde die Unterstützung für die Paketweiterleitung zu externen Knoten über Zwischenknoten (gateway-routing) hinzugefügt. Zum Beispiel ermöglichen die folgenden Regeln die Weiterleitung von Paketen an einen Knoten mit der ID 10 (Endpoint ID 10) über das Gerät mctpi2c0, das direkt mit der Adresse 0x1d verbunden ist, die an den Knoten mit der ID 9 angehängt 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 Adressfamilie VSOCK gibt es die Option SIOCINQ. Die implementierten Optionen sind analog zur Option TCP_INQ für TCP und ermöglichen es durch eine Steuerungsnachricht, Informationen über die Anzahl der Bytes zu erhalten, die im Socket zum Lesen verfügbar sind.
- Für TCP wurde die strikte Einhaltung der angekündigten Fenstergröße der Empfangsseite aktiviert, die die Menge der Daten definiert, die gesendet werden dürfen, bevor eine ACK-Bestätigung von der anderen Seite empfangen wird. Zuvor hatte der Kernel weiterhin Daten verarbeitet, die über das angekündigte Empfangsfenster hinausgingen, wird dies jetzt jedoch einstellen.
- In MPTCP (Multipath TCP) wurde die Möglichkeit hinzugefügt, die TCP_MAXSEG-Socket-Option zu verwenden, um die maximale Größe der gesendeten Segmente zu begrenzen. MPTCP ist eine Erweiterung des TCP-Protokolls zur gleichzeitigen Übertragung von Paketen über mehrere Routen durch verschiedene Netzwerkschnittstellen, die an unterschiedliche IP-Adressen gebunden sind.
- Unterstützung für den TCP-Überlastungssteuerungsalgorithmus DualPI2 (RFC 9332) hinzugefügt, der die Verwendung von skalierbaren Überlastungssteuerungen für Verkehr mit hohen Qualitätsanforderungen (z. B. TCP-Prague und DCTCP) ermöglicht, ohne die Leistung des klassischen Verkehrs zu beeinträchtigen, für den solche Überlastungssteuerungen wie Reno und Cubic verwendet werden.
- Der sysctl „force_forwarding“ wurde hinzugefügt, über den die Umleitung von Verkehr auf ausgewählten Netzwerkinterfaces mit IPv6 aktiviert werden kann.
- Die Unterstützung für den Paketverlustdetektionsalgorithmus SACK (Selective Acknowledgment), der in RFC 6675 beschrieben ist, wurde entfernt. Dieser Algorithmus wurde 2018 als veraltet erklärt. Für die 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 der Intel Xe-Architektur, die in Intel Arc-Grafikkarten und integrierter Grafik ab der Tiger Lake-Prozessoren verwendet wird, wurde fortgesetzt. In der neuen Version wurde die Unterstützung für Chips auf Basis der Mikroarchitektur Panthor Lake standardmäßig aktiviert, und die Unterstützung der Mikroarchitektur WildCat Lake wurde hinzugefügt.
- Im AMDGPU-Treiber für GPU GFX9.x wurde der Cleaner Shader-Mechanismus implementiert, der den GPU-Speicher vor dessen erneuter Nutzung bereinigt, um Datenlecks zu vermeiden, die aus einem anderen Prozess zurückgeblieben sind. Die Unterstützung des Energiesparmodus wurde verbessert. Die Möglichkeit für die Übergabe in den Schlafmodus wurde in Umgebungen mit AMD SR-IOV hinzugefügt. Die Steuerung der Hintergrundbeleuchtung wurde verbessert.
- Im i915-Treiber wurde die Unterstützung des drm_panic-Mechanismus implementiert, der bei Abstürzen eine Art "Bluescreen" anzeigt. Die Unterstützung des Display-Controllers, der in Chips der Wildcat Lake-Familie verwendet wird, wurde hinzugefügt.
- Die Integration der Nova-Treibersoftwarekomponenten für NVIDIA-GPUs, die mit GSP-Firmware ausgestattet sind und seit der Serie NVIDIA GeForce RTX 2000 auf der Turing-Mikroarchitektur verwendet werden, wurde 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 Einrichtung des Framebuffers hinzugefügt und die Unterstützung für schnelles Booten im Falcon-Modus bereitgestellt.
- Im Adreno-Treiber wurde die Unterstützung für die Qualcomm Adreno x1-45 und x1-85 GPUs hinzugefügt.
- Im msm-Treiber wurde die Unterstützung für die Adreno SM8750 GPU und das Mapping des Videospeichers (VM_BIND) hinzugefügt.
- Der panfrost-Treiber unterstützt jetzt die Mali-GPUs, die in SoCs von Mediatek mt8370 verwendet werden.
- Der lima-Treiber unterstützt jetzt die GPUs, die in SoCs von Rockchip RK3528 verwendet werden.
- Ein mtd (Memory Technology Devices) Treiber wurde hinzugefügt, um auf den in Intel-GPUs integrierten NVM-Speicher zuzugreifen.
- Unterstützung für die ASoC-Audiosysteme 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 wurde hinzugefügt. Der HD-Audio-Code wurde umstrukturiert.
- Unterstützung für ARM-Plattformen, SoCs und Geräte: 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 in Samsung Galaxy S22), Renesas R-Car V4M-7, TI am62d2 und Sophgo sg2042, Laptops basierend auf Mediatek mt8186 und Qualcomm Snapdragon X1, Smartphones und Tablets basierend auf SoCs mt6572, tegra30 und msm8976.
Gleichzeitig hat die lateinamerikanische Freie Software Stiftung eine vollständig freie Version des Kernels 6.17 - Linux-libre 6.17-gnu - veröffentlicht, die von Firmware-Elementen und Treibern gereinigt wurde, die nicht-freie Komponenten oder Codeabschnitte enthalten, deren Verwendung durch den Hersteller eingeschränkt ist. In der Version 6.17 wurde der Bereinigungscode für 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 (Device Tree) für ARM-Chips und Intel IPU7 wurden bereinigt. Das Laden von Blobs in 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
