Après deux mois de développement, Linus Torvalds a présenté la sortie du noyau Linux 6.9. Parmi les changements les plus notables : le module dm-vdo pour la déduplication et la compression des dispositifs de stockage, un mode d'accès direct aux fichiers dans FUSE, la prise en charge de la création de pidfd pour des threads individuels, un mécanisme de jetons BPF, le support de Rust sur les systèmes ARM64, la rétrogradation du système de fichiers Ext2, la suppression de l'ancien pilote NTFS, et le soutien au mécanisme Intel FRED.
La nouvelle version inclut 15680 corrections de 2106 développeurs, la taille du patch est de 54 Mo (les changements concernent 11825 fichiers, 687954 lignes de code ajoutées, 225344 lignes supprimées). Dans la précédente version, il y avait 15641 corrections de 2018 développeurs, la taille du patch était de 44 Mo. Environ 42 % de toutes les modifications dans le 6.9 sont liées aux pilotes matériels, environ 17 % concernent la mise à jour de code spécifique aux architectures matérielles, 13 % concernent la pile réseau, 7 % les systèmes de fichiers et 4 % les sous-systèmes internes du noyau.
Les principales nouveautés du noyau 6.9 :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Un nouveau gestionnaire dm-vdo (virtual data optimizer) a été ajouté dans le Device Mapper (DM), permettant de créer un dispositif de bloc virtuel basé sur les dispositifs de stockage existants, offrant des fonctionnalités telles que la déduplication des données répétées, la compression des données, l'exclusion des blocs vides et l'augmentation de la taille du dispositif de bloc selon les besoins (thin provisioning). Ces fonctionnalités sont mises en œuvre au niveau du dispositif de stockage et ne dépendent pas du système de fichiers utilisé (par exemple, avec dm-vdo, il est possible de réaliser automatiquement la consolidation des données en double et de stocker l'information sous forme compressée pour n'importe quel système de fichiers). Le dm-vdo est pris en charge pour les stockages physiques jusqu'à 256 To et permet la création de volumes logiques jusqu'à 4 Po. Pour la gestion des partitions vdo, il est recommandé d'utiliser lvm. La technologie VDO a été développée par Permabit et a été rendue open source après son acquisition par Red Hat en 2017.
- Dans le sous-système FUSE, utilisé pour l'implémentation des systèmes de fichiers dans l'espace utilisateur, une première implémentation du mode « passthrough » a été ajoutée, permettant d'accéder directement aux données des fichiers au niveau du noyau, en contournant le processus fonctionnant dans l'espace utilisateur, ce qui peut considérablement améliorer les performances dans certaines situations. Par exemple, les implémentations de FUSE de systèmes de fichiers, fonctionnant en mode lecture seule et restreignant l'accès aux fichiers, peuvent renvoyer le contenu des fichiers depuis le système de fichiers d'origine sans les transmettre au processus FUSE.
- Le pilote avec une implémentation du système de fichiers Ext2 a été rétrogradé en tant que déprécié. La raison citée est que le pilote ne prend en charge que des compteurs de temps 32 bits dans les inode, qui dépasseront le 19 janvier 2038. Au lieu du pilote ext2, il est recommandé d'utiliser le pilote ext4, qui prend en charge le fonctionnement avec le système de fichiers Ext2 et est entièrement compatible avec celui-ci, mais qui peut également utiliser dans les partitions ext2 des horodateurs non affectés par le problème de 2038, si le système de fichiers a été créé avec des inode de plus de 255 octets (dans le pilote ext2, des compteurs de temps 32 bits étaient utilisés indépendamment de la taille de l'inode).
- L'ancien pilote du système de fichiers NTFS a été supprimé, et depuis la version 5.15, un nouveau pilote NTFS3 a été introduit. La présence de deux pilotes avec une implémentation de NTFS dans le noyau a été jugée inappropriée, considérant que l'ancien pilote n'a pas été mis à jour depuis de nombreuses années, qu'il est en piteux état et ne peut fonctionner qu'en mode lecture.
- Les systèmes de fichiers zonefs et hugetlbfs ont ajouté la prise en charge du mappage des identifiants d'utilisateurs des systèmes de fichiers montés, utilisé pour associer des fichiers d'un utilisateur spécifique sur une partition étrangère montée à un autre utilisateur dans le système actuel.
- Pour NFSv4, les administrateurs ont désormais la possibilité de nettoyer les états d'ouverture et de verrouillage des fichiers.
- Pour le système de fichiers Ext4, seules des corrections de bugs et une mise à jour des tests kunit ont été signalées.
- Dans Btrfs, la conversion des fonctionnalités vers l'utilisation de folios de pages mémoire a été poursuivie.
- Dans le système de fichiers XFS, le développement de la possibilité d'utiliser l'utilitaire fsck pour détecter et corriger les problèmes en mode en ligne, sans démonter le système de fichiers, a été poursuivi.
- Dans l'appel système pwritev2(), le drapeau RWF_NOAPPEND a été ajouté, permettant de spécifier un décalage pour l'écriture, même si le fichier était ouvert en mode ajout uniquement à la fin du fichier.
- De nouvelles commandes ioctl ont été ajoutées : FS_IOC_GETUUID — renvoie l'identifiant UUID du système de fichiers spécifié, et FS_IOC_GETFSSYSFSPATH — détermine l'emplacement dans /sys/fs du système de fichiers monté.
- Les systèmes de fichiers efs, qnx4 et coda ont été convertis pour utiliser la nouvelle API de montage des partitions.
- La mise en œuvre des opérations sur les fichiers effectuées en mode sans prise en compte de la casse a été améliorée. La performance a été augmentée grâce à une comparaison initiale sensible à la casse, avec un retour à la recherche sans prise en compte de la casse. Des problèmes lors du montage d'overlayfs au-dessus de répertoires réglés en mode sans prise en compte de la casse ont été résolus.
- Mémoire et services système
- Le support du mécanisme Intel FRED (Flexible Return and Event Delivery) a été mis en place, conçu pour améliorer l'efficacité et la fiabilité de la livraison d'informations sur les événements de bas niveau, par rapport au mécanisme actuel IDT (Interrupt Descriptor Table). L'augmentation des performances et la réduction des latences sont assurées par le retour des événements par l'instruction processeur IRET, plutôt que par le biais de la table IDT. La fiabilité est augmentée grâce à un traitement distinct de l'arrivée des événements dans le contexte du noyau et dans le contexte de l'utilisateur, protégeant contre l'exécution imbriquée de NMI et sauvegardant dans le cadre de pile élargi tous les registres CPU associés à l'exception.
- La possibilité d'optimiser l'accès aux données des cœurs CPU individuels a été ajoutée grâce à l'utilisation dans le code du noyau d'espaces d'adresses nommés (Named Address Spaces), mis en œuvre dans GCC sous forme d'extension GNU C.
- Un nouveau drapeau PIDFD_THREAD a été ajouté à la fonction pidfd_open(), permettant de créer un pidfd pour des threads individuels, et pas seulement d'utiliser le pidfd dans le contexte du leader de groupe de threads. Une réalisation d'un pseudo-système de fichiers pour accéder au pidfd via le système de fichiers virtuel a également été proposée. Contrairement à l'identification des processus par pid, l'identifiant pidfd est lié à un processus spécifique et ne change pas, tandis que le PID, après la fin du processus actuel, peut être attribué à un autre processus.
- Un mécanisme de jetons BPF a été ajouté au sous-système BPF, permettant de déléguer sélectivement aux programmes des droits d'accès aux opérations BPF privilégiées ; par exemple, il est possible d'accorder à une application non privilégiée l'accès à certains sous-systèmes BPF sans fournir tous les droits CAP_BPF.
- Le sous-système BPF a ajouté un nouveau type de mémoire partagée bpf_arena, définissant une zone accessible pour le partage entre les programmes BPF et les processus en espace utilisateur. L'instruction may_goto a été ajoutée, permettant d'organiser le fonctionnement de boucles qui peuvent être interrompues par le vérificateur. La génération de cookies TCP SYN arbitraires à partir de programmes BPF et la création de gestionnaires BPF pour lutter contre les attaques par SYN flooding ont été ajoutées.
- Le transfert des modifications de la branche Rust-for-Linux se poursuit, concernant l'utilisation du langage Rust comme deuxième langage pour le développement de pilotes et de modules du noyau (le support de Rust n'est pas activé par défaut et n'implique pas son inclusion parmi les dépendances de compilation obligatoires pour le noyau). Le support de Rust pour les processeurs ARM 64 bits a été ajouté. La transition vers la version 1.76 de Rust a été réalisée. Le macro ‘container_of!’ a été ajouté. Au lieu de la fonctionnalité instable ‘ptr_metadata’, la méthode stable ‘byte_sub’ a été utilisée. Le module ‘time’ avec la fonction de conversion du temps ‘msecs_to_jiffies()’ a été ajouté.
- La possibilité de tronquer des fichiers (ftruncate_file) a été ajoutée au sous-système io_uring.
- Un nouveau type de files d'attente WQ_BH (workqueue Bottom Halves) a été ajouté pour l'exécution asynchrone de code dans le contexte des interruptions logicielles, visant à remplacer les anciennes tasklet.
- Le sous-système de gestion des minuteries a été considérablement retravaillé, avec une logique améliorée pour le choix du cœur CPU actif pour l'exécution d'une minuterie déclenchée, afin de ne pas sortir de l'état de veille des cœurs inactifs.
- La possibilité de mettre à jour le modèle de consommation d'énergie du noyau (EM, Energy Model) pendant le fonctionnement a été mise en œuvre, ce qui peut être utilisé, par exemple, pour prendre en compte l'impact de la température de fonctionnement sur l'efficacité énergétique du CPU. La performance de la fonction em_cpu_energy() a été considérablement améliorée, s'exécutant maintenant 1.43 fois plus rapidement dans des tests sur un système stationnaire, et 1.69 fois plus rapidement dans un test sur la carte RockPi 4B.
- Le support du démarrage des systèmes basés sur l'architecture ARM64 en mode LPA2 avec un espace d'adressage virtuel de 52 bits a été ajouté.
- Pour les systèmes ARM64, le support des écritures continues PTE (Page Table Entry) a été réalisé, ce qui permet d'augmenter les performances en améliorant l'efficacité de l'utilisation de la TLB (Translation Lookaside Buffer).
- Des correctifs ont été appliqués pour améliorer la performance du sous-système de gestion de la mémoire en réduisant l'occurrence des blocages concurrents dans vmalloc().
- Un mécanisme de patching à chaud (live patching) a été implémenté pour l'architecture LoongArch, permettant d'appliquer des corrections au noyau sans redémarrage.
- Pour les systèmes RISC-V, la prise en charge de l'appel système membarrier() a été mise en place, permettant d'établir des barrières mémoire pour les threads actifs dans le système.
- Les exigences concernant la version de LLVM/Clang nécessaire pour compiler le noyau ont été élevées. Désormais, une version minimale de LLVM 13.0.1 est requise (auparavant, une compilation avec LLVM 11+ était prise en charge).
- Le mécanisme des « User trace events », permettant de créer des événements de traçage à partir de processus utilisateurs pour suivre l'activité dans l'espace utilisateur, a été enrichi d'un support pour l'export de données d'événements dans différents formats (USER_EVENT_REG_MULTI_FORMAT).
- Le mécanisme de traçage des appels de fonctions a été amélioré pour suivre l'état des arguments d'entrée de la fonction lors de la traçabilité des sorties. Les valeurs du retour peuvent maintenant être associées aux arguments utilisés lors de l'appel de la fonction.
- L'outil perf a ajouté le support du mode d'agrégation des résultats « cluster » (« perf stat -a —per-cluster ») pour regrouper les statistiques des ressources partagées. La possibilité d'utiliser la bibliothèque libcapstone pour désassembler les instructions processeur a été ajoutée (« perf script -F disasm »). Des optimisations de la mémoire ont été réalisées lors de l'exécution des commandes perf report et perf annotate.
- Virtualisation et sécurité
- Une protection contre la vulnérabilité RFDS (Register File Data Sampling) a été ajoutée dans les processeurs Intel Atom, permettant d'extraire des informations résiduelles des fichiers de registre (RF, Register File) du processeur, utilisés pour le stockage commun du contenu des registres dans toutes les tâches sur le même cœur CPU. Pour bloquer la vulnérabilité, une mise à jour du microcode et l'utilisation de l'instruction VERW pour effacer le contenu des tampons microarchitecturaux lors du retour de l'espace noyau à l'espace utilisateur sont nécessaires. Pour activer la protection lors du chargement du noyau, il est possible de spécifier le drapeau « reg_file_data_sampling=on ». Les informations sur la vulnérabilité et la disponibilité du microcode requis pour la protection peuvent être évaluées dans le fichier « /sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling ».
- Un support de base pour la protection des systèmes invités a été ajouté grâce à l'extension AMD SEV-SNP (Secure Nested Paging), qui permet un fonctionnement sécurisé avec des tables de pages mémoire imbriquées et protège contre les attaques « undeSErVed » et « SEVerity » sur les processeurs AMD EPYC, permettant de contourner le mécanisme de protection AMD SEV (Secure Encrypted Virtualization). KVM Les modifications nécessaires pour utiliser SNP sont prévues dans la version 6.10.
- Les modules implémentant les technologies IMA (Integrity Measurement Architecture) et EVM (Extended Verification Module) ont été adaptés pour utiliser le framework LSM (Linux Security Modules), ce qui a permis de simplifier considérablement le code sans perte de fonctionnalité, de fusionner des fonctionnalités dupliquées et de tirer parti des capacités standards offertes par LSM. Le module IMA est destiné à vérifier l'intégrité des composants du système d'exploitation par des signatures numériques et des hachages. Le module EVM protège les attributs étendus des fichiers (xattrs) contre les attaques visant à compromettre leur intégrité (EVM empêchera une attaque hors ligne, où un attaquant pourrait modifier des métadonnées, par exemple en démarrant à partir de son propre support).
- Les appels système lsm_list_modules(), lsm_get_self_attr() et lsm_set_self_attr() ont été remaniés pour une meilleure compatibilité avec les environnements 32 bits. Ces appels sont destinés à l'affichage de la liste des modules LSM (Linux Security Modules) chargés et à la récupération/définition des attributs du module LSM. Ce changement rompt la compatibilité ascendante, mais Linus Torvalds a jugé que la modification était acceptable, car les nouveaux appels système avaient été ajoutés dans la dernière version du noyau et ne sont pas encore utilisés dans les applications.
- Une tentative a été faite pour relancer l'utilisation de l'UBSAN (Undefined Behavior Sanitizer). Le problème réside dans le fait que les compilateurs traitent différemment les dépassements d'entiers des types signés et non signés. Les dépassements signés et les dépassements de pointeurs relèvent de l'undefined behavior, tandis que les dépassements non signés sont tronqués par modulo 2n, ne conservant que les bits les moins significatifs du résultat (« wrap-around ») et ne relèvent pas de l'undefined behavior. Pour éviter les situations d'undefined behavior, le noyau est compilé avec l'option « -fno-strict-overflow », qui force l'utilisation de « wrap-around » pour tous les dépassements d'entiers. GCC et Clang ne peuvent pas diagnostiquer correctement certains problèmes lorsqu'on utilise le paramètre « -fno-strict-overflow », et l'activation de l'UBSAN vise à collaborer avec les développeurs de compilateurs pour éliminer les faux positifs et identifier les dépassements d'entiers là où il n'y a pas de vérifications explicites.
Pour vérifier les éventuels dépassements dans le noyau, des constructions du type « var + offset < var » (par exemple, « if (pgoff + (size > PAGE_SHIFT) < pgoff) {..} ») sont employées, qui dépendent d'une compilation avec le flag « -fno-strict-overflow » et ne couvrent pas tout le code où un dépassement pourrait théoriquement survenir. Le problème est qu'avec l'UBSAN, de telles vérifications entraînaient un grand nombre de faux avertissements, et en raison de cela, l'UBSAN a dû être désactivé en 2021. Dans la mise en œuvre mise à jour, il est proposé d'utiliser des annotations spéciales __signed_wrap et __unsigned_wrap, ainsi que des macros prêtes à l'emploi avec les vérifications add_would_overflow(a, b) et add_wrap(a, b), permettant de distinguer l'utilisation prévue des dépassements d'entiers par les développeurs de celle des dépassements aléatoires susceptibles de conduire à des vulnérabilités. La proposition d'une refonte plus extensive du noyau avec l'introduction de définitions de types supplémentaires a été rejetée par Linus Torvalds.
- Sous-système réseau
- Dans le sous-système réseau, des efforts ont été déployés pour réduire l'occurrence des blocages concurrents (« lock contention », tentative d'obtenir un verrou détenu par un autre thread). L'utilisation des verrous RTNL a été réduite.
- Ajout de la possibilité d'activer le support du busy polling dans le cadre d'appels spécifiques à epoll. La taille du pool et les paramètres budgétaires peuvent être configurés séparément des paramètres système par défaut.
- Structure net_hotdata mise en œuvre pour améliorer l'efficacité du cache des variables de configuration réseau les plus fréquemment utilisées.
- Ajout du support dans MPTCP pour l'option TCP_NOTSENT_LOWAT, permettant de limiter la taille du tampon d'envoi pour les sockets. Le service MCTP a également été mis à jour avec des identifiants de réseau, permettant l'utilisation de plusieurs réseaux MCTP non chevauchants sur un même hôte.
- Ajout du support pour le redirection des messages ICMP contenant des informations d'erreur dans IPSec (RFC 4301).
- Accélération du processus de scan des routes arrivées à expiration.
- Optimisation de la performance de XDP grâce à une restriction plus stricte sur l'allocation de grandes blocs de mémoire.
- Ajout de la possibilité d'attacher des métadonnées aux messages netconsole.
- Dans Netfilter, il est désormais possible de définir des tables à partir de l'espace utilisateur, qui sont liées au processus de gestion en arrière-plan et ne sont pas supprimées automatiquement après l'achèvement de l'application utilisateur.
- Dans nftables, l'ajout d'éléments à des ensembles avec des plages combinées a été accéléré.
- Matériel
- Dans le pilote i915, le développement pour le support des puces Intel LunarLake (Xe 2) se poursuit. Nouveaux identifiants PCI ajoutés pour les appareils basés sur les puces Intel Arrow Lake et Alder Lake N. Le support du tunneling DisplayPort et de l'allocation de bande passante a été ajouté. Le mode fastboot est activé pour toutes les plateformes. Le support de l'affichage de débogage lié aux appareils spécifiques a été ajouté.
- Dans le pilote AMDGPU, des préparations ont été effectuées pour le support des GPU AMD RDNA3.5 et RDNA4. Support ajouté pour ATHUB 4.1, LSDMA 7.0, JPEG DPG, IH 7.0, HDP 7.0, VCN 5.0, SMU 13.0.6, NBIO 7.11, SDMA 6.1, MMHUB 3.3, DCN 3.5.1, NBIF 6.3.1, VPE 6.1.1 et du cadre RAS ACA. Un paramètre freesync_video a été ajouté au module du noyau pour activer le support expérimental de l'optimisation du changement de modes vidéo utilisant la technologie de synchronisation adaptative FreeSync.
- Dans le pilote Nouveau, le code de gestion de l'écran a été converti pour utiliser la fonction kmemdup().
- Le travail sur le pilote drm (Direct Rendering Manager) pour GPU basé sur l'architecture Intel Xe, utilisé dans les cartes graphiques Intel de la famille Arc et dans les graphiques intégrés des processeurs Tiger Lake, a été poursuivi.
- Un pilote DRM a été ajouté pour les puces Mediatek MT8188 VDOSYS1.
- Les configurations du noyau liées aux sous-systèmes vidéo ont été déplacées vers la section CONFIG_VIDEO.
- Ajout de la prise en charge des SoC ARM64 : Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
- Ajout du support des plates-formes et appareils ARM : téléphones Android basés sur la puce Tegra30, modèles Chromebook basés sur Mediatek MT8186, NAS, tablettes et consoles de jeux basées sur Rockchips RK35xx, cartes White Hawk basées sur SoC Renesas, cartes basées sur Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
- Le code du sous-système audio ALSA a été refactorisé. Prise en charge des systèmes audio Microchip SAM9x7, NXP i.MX95 et Qualcomm WCD939x ajoutée. Le pilote SoundWire a intégré la prise en charge ASoC avec les coprocesseurs audio AMD ACP 6.3, et pour les systèmes Intel, un mode DSPless a été implémenté. Prise en charge de codecs audio supplémentaires Cirrus HD ajoutée. La gestion des périphériques audio a été améliorée dans le pilote virtio.
- Prise en charge des contrôleurs Ethernet Marvell Octeon PCI Endpoint NIC VF et Intel E825-C 100G ajoutée.
Simultanément, la Fondation latino-américaine pour le logiciel libre a constitué une version entièrement libre du noyau 6.9 — Linux-libre 6.9-gnu, nettoyée des éléments de firmware et de pilotes contenant des composants ou des portions de code non libres, dont l'usage est limité par le fabricant. La version 6.9 a mis à jour le code de nettoyage des blobs dans les pilotes amdgpu, ath12k, adreno, btusb et r8169. Nettoyage du nouveau pilote ptp_fc3 réalisé. Nettoyage des noms des blobs dans les fichiers dts (devicetree) pour l'architecture Aarch64. Résolution des problèmes de nettoyage du pilote i915 qui causaient des blocages lors de l'initialisation. Modifications apportées au traitement des blobs fournis sous forme de dumps hexadécimaux.
Source : opennet.ru
