Version du noyau Linux 7.0

Après deux mois de développement, Linus Torvalds a publié le noyau Linux 7.0. Parmi les changements les plus notables : les règles d’utilisation des assistants IA, l’intégration de Rust au cœur du noyau, l’amélioration des performances du swap, l’activation par défaut du mode PREEMPT_LAZY, la prise en charge des filtres pour les opérations io_uring, le nouveau système de fichiers Nullfs, le framework fserror, les outils de surveillance XFS, la prise en charge du remappage dans Btrfs, l’activation par défaut de NFS 4.1, l’intégration de l’algorithme cryptographique post-quantique ML-DSA, l’activation d’AccECN dans le sous-système réseau et la prise en charge initiale du WiFi 8.

Le numéro 7.0 a été attribué car la branche 6.x comptait suffisamment de versions pour justifier un changement du premier chiffre du numéro de version (la version 6.0 ayant initialement été publiée après la version 5.19). Ce changement de numérotation est effectué pour des raisons esthétiques et constitue une mesure officielle visant à simplifier la lecture, compte tenu du nombre important de versions dans la série.

La nouvelle version intègre 15 624 correctifs apportés par 2 477 développeurs, pour une taille de patch de 56 Mo (les modifications affectent 18 053 fichiers, ajoutent 704 060 lignes de code et en suppriment 278 132). La version précédente comprenait 15 657 correctifs apportés par 2 237 développeurs, pour une taille de patch de 52 Mo. Environ 51 % des modifications de la version 7.0 concernent les pilotes de périphériques, environ 11 % les mises à jour de code spécifiques aux architectures matérielles, 14 % la pile réseau, 5 % les systèmes de fichiers et 3 % les sous-systèmes internes du noyau.

Principales nouveautés du noyau 7.0 (1, 2, 3) :

  • Sous-système de disque, E/S et systèmes de fichiers
    • L'infrastructure fserror a été mise en œuvre et une API a été ajoutée pour récupérer les informations relatives aux erreurs d'entrée/sortie et à la corruption des métadonnées lors de la manipulation de fichiers. Cette infrastructure unifie la transmission des informations d'erreur à l'espace utilisateur entre les systèmes de fichiers via le mécanisme fsnotify.
    • XFS a été amélioré grâce à de nouvelles fonctionnalités de surveillance de l'état du système de fichiers depuis l'espace utilisateur. L'opération ioctl XFS_IOC_HEALTH_MONITOR est désormais disponible ; elle renvoie un descripteur de fichier permettant d'obtenir des informations sur les défaillances liées à la corruption des métadonnées ou aux erreurs d'E/S, ainsi que de surveiller les changements d'état du système de fichiers, tels que le démontage et l'arrêt. De plus, un processus d'arrière-plan géré par systemd, xfs_healer, est introduit. Ce processus traite les événements relatifs à l'état du système de fichiers depuis l'espace utilisateur et lance automatiquement les procédures de récupération si nécessaire.
    • Le système de fichiers Btrfs intègre désormais, à titre expérimental, la prise en charge d'une structure d'« arbre de remappage », susceptible de servir de couche intermédiaire lors des opérations d'entrée/sortie. Cette nouvelle fonctionnalité consiste à stocker les anciennes et nouvelles adresses de données dans une structure d'« arbre de remappage » supplémentaire après le déplacement des données sur le disque, évitant ainsi la mise à jour de toutes les structures associées. Ces adresses sont ensuite remplacées lors de l'accès aux données. Cette approche est présentée comme plus fiable et flexible, et simplifiera également les futures extensions de fonctionnalités de Btrfs.
    • Btrfs prend en charge les E/S directes dans les situations où la taille des blocs dépasse la taille des pages mémoire du système.
    • Un nouveau système de fichiers, « Nullfs », est inclus. Il peut servir de stub pour le système de fichiers racine. Le système de fichiers Nullfs est toujours vide, ne contient aucune donnée et ne permet aucune modification. Son rôle est de servir de système de fichiers initial afin de simplifier le processus de démarrage du système. Les autres systèmes de fichiers sont ensuite montés par-dessus Nullfs, et l'appel système `pivot_root()` est utilisé pour changer de système de fichiers racine, plutôt que d'effacer le contenu de l'initramfs et d'utiliser le système de fichiers racine associé.
    • La mise à jour des informations de date et d'heure de modification des fichiers en mode non bloquant est désormais possible. Auparavant, l'appel à la fonction `file_update_time_flags()` avec l'indicateur `IOCB_NOWAIT` renvoyait l'erreur « -EAGAIN », empêchant ainsi les opérations d'écriture directe en mode non bloquant.
    • La prise en charge des baux de notification est désormais une option distincte dans les systèmes de fichiers. Ce mécanisme n'est plus activé par défaut en raison de problèmes avec certains systèmes de fichiers qui n'ont pas été conçus pour cela. Par exemple, 9p et cephfs ne le prennent pas en charge.
    • Le système de fichiers EROFS (Extendable Read-Only File System), conçu pour les partitions en lecture seule, utilise par défaut l'algorithme de compression LZMA. Les algorithmes DEFLATE et Zstandard, qui ne sont plus considérés comme expérimentaux, sont disponibles en option. Les entrées du cache de pages sont désormais partagées entre les fichiers identiques dans des systèmes de fichiers EROFS distincts.
    • Le mode laptop_mode, qui permettait d'économiser de l'énergie en différant et en regroupant les écritures sur le disque dur afin d'allonger la durée de veille et de réduire le nombre de réveils, a été supprimé. Ce mode est devenu obsolète, les disques durs ayant été remplacés par des disques SSD dans les appareils mobiles modernes.
    • Le système de fichiers F2FS a été migré pour utiliser de grands folios de pages mémoire.
    • Le développement du pilote NTFS3, développé par Paragon Software, a repris. La prise en charge des opérations sur les fichiers basées sur iomap a été ajoutée, les options SEEK_DATA/SEEK_HOLE de la commande llseek ont ​​été implémentées et le mode delalloc pour l'allocation différée de blocs a été intégré. Par ailleurs, en février, la liste de diffusion des développeurs du noyau a approuvé l'intégration d'une nouvelle implémentation NTFS, ntfsplus, destinée à remplacer NTFS3, dans une future version du noyau.
    • Par défaut, le protocole NFS version 4.1 (CONFIG_NFS_V4_1) est activé lors de la compilation. Les exportations NFS de systèmes de fichiers pseudo-spécialisés, tels que pidfs et nsfs, sont bloquées. NFSD implémente une fonctionnalité expérimentale permettant l'utilisation des ACL POSIX et prend en charge la modification dynamique du pool de threads en fonction de la charge.
  • Services mémoire et système
    • Les règles officielles relatives à l'utilisation des assistants IA et à l'intégration de contenu généré automatiquement dans le noyau ont été approuvées. Lors de la soumission de code généré, il est obligatoire d'apposer la mention « Assisted-by » indiquant l'assistant IA utilisé. L'ajout de la mention « Signed-off-by » est interdit aux assistants IA : la personne soumettant le correctif est considérée comme son auteur, responsable de la modification et garante de sa qualité. Les développeurs sont tenus de vérifier manuellement le code généré par l'IA et de s'assurer de sa conformité aux exigences de la licence.
    • La prise en charge de Rust est désormais intégrée au noyau. Elle n'est pas activée par défaut et ne requiert pas Rust comme dépendance de compilation du noyau.
    • Le mécanisme de table d'échange a été intégré au cœur du système, améliorant ainsi les performances d'échange. Cette amélioration est obtenue grâce à une réduction des conflits d'accès au cache d'échange, des accès plus efficaces au cache et une réduction de la fragmentation. Le système de gestion des échanges basé sur une table d'échange remplace le système XArray et a permis d'augmenter de 22 % le nombre de requêtes traitées lors du benchmark Redis avec BGSAVE.
    • La prise en charge de l'extension Thread Safety Analysis, introduite dans Clang 22, a été ajoutée. Cette extension permet la détection à la compilation des conditions de concurrence potentielles et des erreurs dues à une acquisition de verrou incorrecte. Elle offre une série d'attributs, tels que GUARDED_BY(…), REQUIRES(…), RELEASE(…) et ACQUIRE(…), qui permettent de marquer les fonctions couvertes par des verrous et de séparer les portées de verrouillage (définir le contexte). La vérification à la compilation de l'utilisation correcte des primitives de synchronisation, telles que les mutex, est effectuée en fonction de l'activité ou de l'inactivité du contexte associé.
    • L'option OPEN_TREE_NAMESPACE a été ajoutée à l'appel système open_tree afin de simplifier la configuration des conteneurs isolés et d'accélérer leur démarrage sur les systèmes comportant un grand nombre de points de montage. À l'instar de OPEN_TREE_CLONE, cette nouvelle option copie uniquement l'arbre de montage spécifié, mais au lieu d'un descripteur de fichier local, elle renvoie un descripteur de fichier dans l'espace de noms du nouveau point de montage, où l'arbre copié est monté sur une copie du système de fichiers racine réel. L'option OPEN_TREE_NAMESPACE permet d'éviter l'exécution séparée des opérations unshare(CLONE_NEWNS) et pivot_root() utilisées lors de la création du conteneur.
    • Un mécanisme d'extension de tranche de temps a été ajouté à l'appel système rseq, permettant d'allouer du temps CPU supplémentaire pour l'exécution ininterrompue d'une section critique. L'objectif est d'empêcher l'ordonnanceur de tâches d'interrompre une section critique lorsqu'un verrou est déjà actif, ce qui aurait pour conséquence de transférer le contrôle à d'autres threads utilisant la ressource tant que le verrou est maintenu. L'extension de tranche de temps est réalisée sans surcharge supplémentaire, mais sans les garanties strictes offertes par un contrôle de priorité total.
    • Pour les architectures arm64, loongarch, powerpc, riscv, s390 et x86, le mode de préemption par défaut du planificateur a été modifié : PREEMPT_NONE est devenu PREEMPT_LAZY. Le nombre de modes possibles a été réduit de quatre à deux : PREEMPT_FULL et PREEMPT_LAZY (les modes PREEMPT_NONE et PREEMPT_VOLUNTARY sont conservés uniquement pour les architectures ne prenant pas en charge PREEMPT_FULL et PREEMPT_LAZY). Le mode PREEMPT_LAZY utilise le modèle de préemption complet (PREEMPT_FULL) pour les tâches temps réel (RR/FIFO/DEADLINE), mais retarde la préemption des tâches normales (SCHED_NORMAL) jusqu’à la fin du cycle d’horloge. Le délai introduit réduit le nombre d'évictions des détenteurs de verrou, ce qui permet aux performances de se rapprocher de celles des configurations utilisant le modèle de préemption volontaire, c'est-à-dire que PREEMPT_LAZY permet de préserver l'intégralité des capacités de préemption pour les tâches en temps réel, tout en minimisant la pénalité de performance pour les tâches régulières.

      L'activation de PREEMPT_LAZY a entraîné une régression importante, divisant par deux les performances de PostgreSQL sur les systèmes ARM64. Pour remédier à cette dégradation des performances, il est conseillé aux développeurs PostgreSQL d'activer l'option PR_RSEQ_SLICE_EXTENSION afin de réduire le risque d'éviction du verrou.

    • Nous avons poursuivi la migration des modifications de la branche Rust-for-Linux relatives à l'utilisation de Rust comme second langage pour le développement de pilotes et de modules du noyau. Grâce à la bibliothèque « syn » précédemment intégrée, qui simplifie l'écriture de macros complexes, nous avons pu réduire la taille du code Rust dans le noyau en simplifiant les définitions des macros procédurales existantes. Les fonctionnalités du noyau, des macros et des bibliothèques d'initialisation des broches ont été étendues.
    • Le système d'E/S asynchrones io_uring dispose désormais d'une option permettant d'utiliser des files d'attente de soumission non circulaires, qui sont mises en cache plus efficacement dans les situations où une requête se termine avant qu'un appel système ne renvoie une réponse.
    • Dans le sous-système eBPF, le mécanisme BTF (BPF Type Format), qui fournit des informations de vérification de type dans le pseudocode BPF, utilise la recherche dichotomique pour trouver les informations de débogage, améliorant ainsi l'efficacité du chargement des programmes BPF. eBPF prend désormais en charge les arguments implicites lors de l'appel de fonctions noyau (kfunc) utilisables dans les programmes BPF, définis par l'indicateur KF_IMPLICIT_ARGS.
    • Le code gérant le disque RAM initial (initrd) basé sur linuxrc, obsolète depuis longtemps, a été supprimé. Les implémentations initrd restantes seront supprimées en 2027. Il est recommandé d'utiliser initramfs à la place d'initrd (initrd place l'environnement de démarrage initial dans une image disque, tandis qu'initramfs le place dans un système de fichiers).
    • Le périphérique de bloc zram, utilisé pour le stockage d'échange compressé en mémoire, modifie la logique de gestion des pages mémoire compressées lors du déplacement optionnel de données vers un stockage persistant lorsque la RAM disponible est pleine. Auparavant, les pages mémoire étaient décompressées avant d'être écrites sur le support de stockage physique ; désormais, elles sont stockées telles quelles sous forme compressée, ce qui réduit la charge du processeur et la consommation d'énergie lors du fonctionnement sur batterie.
    • L'utilitaire timerlat, conçu pour mesurer les délais lors de l'exécution du planificateur de tâches, a été mis à jour avec l'option "--bpf-action" pour lancer des programmes BPF lorsqu'un seuil spécifié est dépassé.
    • Le système de traçage ftrace a été mis à jour avec le paramètre « bitmask-list » permettant d'afficher les masques de bits dans un format lisible (sous forme de liste de bits, et non de valeurs hexadécimales). Tracefs prend désormais en charge les filtres et déclencheurs d'audit. La commande « perf sched stats » a été ajoutée pour collecter et afficher les statistiques du planificateur de tâches.
    • Ajout des options de compilation LOGO_LINUX_MONO_FILE, LOGO_LINUX_VGA16_FILE et LOGO_LINUX_CLUT224_FILE pour définir un fichier contenant une image de logo qui sera affichée au démarrage du noyau à la place du logo standard du pingouin Tux.
  • Virtualisation et sécurité
    • Le système d'E/S asynchrones io_uring prend désormais en charge l'association de filtres aux programmes BPF. Ces filtres contrôlent les capacités de certaines opérations SQE (Submission Queue Entry), similaires aux appels système dans io_uring. Cette fonctionnalité est analogue aux filtres d'appels système. Les filtres peuvent être associés à des tâches spécifiques et sont hérités lors de la création d'autres processus après l'appel à fork(). Si des filtres sont actifs, l'ajout de filtres supplémentaires ne peut qu'ajouter des restrictions, sans désactiver celles existantes. Cette fonctionnalité permettra aux méthodes bloquantes de contourner le filtrage des appels système dans les environnements sandbox qui utilisent des opérations similaires à celles fournies par io_uring, au lieu des appels système.
    • SELinux inclut désormais la possibilité de contrôler l'accès aux jetons BPF, qui permettent aux processus non privilégiés d'effectuer certaines opérations privilégiées avec BPF, telles que le chargement de programmes BPF dans le noyau et la création de structures de mappage.
    • La prise en charge de l'algorithme de génération de signature numérique ML-DSA (CRYSTALS-Dilithium), basé sur la théorie des réseaux et résistant aux attaques par force brute sur un ordinateur quantique, a été ajoutée. ML-DSA peut désormais être utilisé pour authentifier les modules du noyau.
    • La possibilité d'utiliser des schémas de génération de signatures numériques avec l'algorithme SHA-1 pour certifier les modules du noyau a été supprimée (la prise en charge du chargement des modules signés est conservée).
    • Ajout des champs « sport » et « dport » aux enregistrements d'audit NETFILTER_PKT pour examiner les numéros de port réseau au lieu de simplement Adresses IP.
    • Pour les systèmes dotés de l'architecture RISC-V, la prise en charge des extensions Zicfiss et Zicfilp a été implémentée. Ces extensions offrent des capacités matérielles permettant d'appliquer la protection CFI (Control Flow Integrity), qui bloque les violations de l'ordre normal d'exécution des instructions (flux de contrôle) résultant d'exploits modifiant les pointeurs de fonction stockés en mémoire.
    • Dans l'hyperviseur KVM La possibilité de transmettre aux systèmes invités des informations concernant la prise en charge par le processeur de l'extension ERAPS (Enhanced Return Address Predictor Security) a été implémentée. Ceci permet d'éviter certaines opérations de réinitialisation de l'état du processeur lorsque le système invité rend le contrôle à l'hôte. De plus, la prise en charge de l'attribution d'unités de surveillance des performances (PMU) aux systèmes invités a été ajoutée, améliorant ainsi la précision du profilage par rapport à l'utilisation de PMU émulées.
    • Le pilote de l'hyperviseur Hyper-V prend désormais en charge l'interface debugfs pour la consultation des statistiques de l'hyperviseur.
  • Sous-système réseau
    • L'extension AccECN (Notification explicite et précise de congestion) est activée par défaut. Elle implémente une version améliorée de l'extension ECN, permettant aux hôtes de marquer les paquets IP en cas de congestion au lieu de les supprimer. Ceci permet de détecter l'apparition de congestion sur les canaux de communication sans perte de paquets. L'extension ECN originale ne permettait qu'un seul signal de congestion par aller-retour TCP (RTT, temps d'aller-retour entre l'envoi d'une requête et la réception d'une réponse). AccECN lève cette limitation et permet au récepteur de transmettre plusieurs signaux de congestion à l'émetteur dans l'en-tête du paquet TCP. Les algorithmes de contrôle de congestion peuvent utiliser cette information pour réagir plus précisément à la congestion et éviter de réduire brutalement le débit de paquets en cas de congestion mineure.
    • L'implémentation de l'algorithme de gestion de files d'attente Cake a été améliorée afin de gérer plusieurs files d'attente et de répartir la charge sur plusieurs cœurs de processeur. L'algorithme Cake permet de réduire l'impact négatif de la mise en mémoire tampon des paquets intermédiaires sur les équipements réseau périphériques et vise à optimiser le débit et à minimiser la latence, même sur les liaisons de communication lentes.
    • La prise en charge des espaces de noms réseau a été ajoutée aux sockets VSOCK utilisés pour communiquer avec les machines virtuelles.
    • Ajout d'une implémentation initiale de la future norme WiFi 8 (802.11bn, WiFi à ultra haute fiabilité).
    • Des optimisations ont été ajoutées, augmentant de 12 % les performances du traitement des paquets UDP entrants lors de tests de charge sur un réseau de 100 Gbit/s.
  • Équipement
    • Le pilote AMDGPU implémente la prise en charge des blocs IP utilisés dans les nouveaux GPU AMD, tels que SMUIO 15.x, PSP 15.x, IH 6.1.1/7.1, MMHUB 3.4/4.2, GC 11.5.4/12.1, SDMA 6.1.4/7.1/7.11.4 et JPEG 5.3.
    • Le pilote Nouveau offre une gestion de fréquence améliorée sur les systèmes Tegra 186+.
    • Le pilote i915 inclut désormais une prise en charge initiale de l'IP d'affichage Xe3p_LPD utilisée dans les processeurs Intel Nova Lake-P.
    • Le développement du pilote Xe DRM (Direct Rendering Manager) pour les GPU basés sur l'architecture Intel Xe, utilisée dans les cartes graphiques et les circuits intégrés Intel Arc, à commencer par les processeurs Tiger Lake, s'est poursuivi. Le mode multi-files d'attente a été ajouté. Les composants nécessaires au diagnostic des blocages du GPU dans Mesa ont été intégrés. La prise en charge du mécanisme MERT pour la gestion des accès mémoire du GPU a également été ajoutée.
    • Nous avons poursuivi l'intégration des composants du pilote Nova pour les GPU NVIDIA équipés du firmware GSP utilisé depuis la série NVIDIA GeForce RTX 2000 basée sur la microarchitecture Turing. Le pilote est écrit en Rust. Cette nouvelle version prépare la prise en charge des GPU basés sur la microarchitecture Turing et inclut diverses modifications internes.
    • Ajout de la prise en charge des contrôleurs et des périphériques dotés d'une interface SPI (Serial Peripheral Interface) multicanaux, qui permet le transfert de données dans plusieurs flux parallèles.
    • Ajout d'un pilote pour les connecteurs Type-C combinés utilisés sur les appareils basés sur des puces Apple Silicon et combinant les interfaces USB3, DP-AltMode et Thunderbolt/USB4.
    • Ajout de la prise en charge des sous-systèmes audio des puces Tegra238, Minisforum V3 SE, iBasso DC04U, Intel Nova Lake, Nova Lake S et Focusrite Forte.
    • Ajout de la prise en charge des cartes, SoC et périphériques ARM : Arduino UnoQ, OrangePi 6 Plus, OrangePi CM5, Anbernic RG-DS, Realtek Kent, Qualcomm Kaanapali, Mediatek Ezurio, Facebook Anacapa, Microchip LAN9668, Khadas VIM1S, QNAP TS133, i.MX952, i.MX93, i.MX94, VHIP4 EvalBoard, TQ-Systems MBLS1028A, Agilex5, Radxa CM3J, Glymur.
    • Ajout de la prise en charge des smartphones et tablettes : Fairphone Gen 6 (SoC Qualcomm Milos/Snapdragon 7s Gen 3), Pixel 3/3 xl, Microsoft surface pro 11.

Parallèlement, la Free Software Foundation (FSF) en Amérique latine a créé une version du noyau Linux 7.0 entièrement libre – Linux-libre 7.0-gnu – débarrassée des éléments de microprogramme et de pilote contenant des composants non libres ou des sections de code à portée restreinte par le fabricant. La version 7.0 inclut un nettoyage des blobs pour le pilote iwlwifi. Le code de nettoyage des pilotes amdgpu, adreno, TI PRUeth, air_en8811h, ath12k, TI VPE, rtw8852b, rt1320, rt5575 SPI, tas2783 et Intel catpt a été mis à jour. Les noms des blobs dans les fichiers devicetree (dts) pour les puces ARM ont été nettoyés.

Source: opennet.ru

Ajouter un commentaire