Après deux mois de développement, Linus Torvalds a présenté la version du noyau Linux 7.0. Parmi les changements les plus notables figurent : les règles d'application des assistants IA, l'intégration de Rust dans les fonctionnalités principales du noyau, l'amélioration des performances de la mémoire swap, l'activation par défaut du mode PREEMPT_LAZY, la prise en charge des filtres pour les opérations io_uring, un nouveau système de fichiers Nullfs, l'infrastructure fserror, des outils de surveillance pour XFS, la prise en charge du remappage dans Btrfs, l'activation par défaut de la version NFS 4.1, l'intégration d'un algorithme cryptographique post-quantique ML-DSA, l'activation d'AccECN dans la sous-système réseau, et un support initial pour WiFi 8.
Le numéro 7.0 a été attribué, car la branche 6.x a accumulé suffisamment de versions pour justifier le changement du premier chiffre dans le numéro de version (la version 6.0 avait été formée juste après 5.19). Changer de numérotation est principalement une question esthétique et représente une démarche formelle qui élimine le désagrément causé par l'accumulation d'un grand nombre de versions dans la série.
La nouvelle version comprend 15624 correctifs de 2477 développeurs, la taille du patch étant de 56 Mo (les modifications ont concerné 18053 fichiers, avec 704060 nouvelles lignes de code, et 278132 lignes supprimées). Dans la précédente version, il y avait 15657 correctifs de 2237 développeurs, avec un patch de 52 Mo. Environ 51% des changements présentés dans 7.0 concernent les pilotes de périphériques, environ 11% des changements sont liés à la mise à jour du code spécifique aux architectures matérielles, 14% concernent la pile réseau, 5% aux systèmes de fichiers et 3% aux sous-systèmes internes du noyau.
Les principales nouveautés dans le noyau 7.0 (1, 2, 3) :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- L'infrastructure fserror a été mise en œuvre et une API a été ajoutée pour récupérer des informations sur les erreurs d'entrée/sortie et la corruption des métadonnées lors du traitement des fichiers. L'infrastructure proposée unifie dans les systèmes de fichiers la transmission des informations sur les erreurs vers l'espace utilisateur via le mécanisme fsnotify.
- Dans XFS, de nouvelles capacités ont été ajoutées pour surveiller l'état du système de fichiers depuis l'espace utilisateur. Une opération ioctl, XFS_IOC_HEALTH_MONITOR, a été proposée, retournant un descripteur de fichier à travers lequel il est possible d'obtenir des informations sur les pannes liées à la corruption des métadonnées ou aux erreurs d'entrée/sortie, ainsi que de suivre les changements d'état du FS, tels que le démontage et l'arrêt. De plus, un processus en arrière-plan géré par systemd, xfs_healer, a été proposé pour traiter les événements d'état du FS depuis l'espace utilisateur et, si nécessaire, lancer automatiquement des procédures de récupération.
- Le système de fichiers Btrfs a ajouté un support expérimental pour la structure « arbre de remappage » (remap tree), qui pourrait être utilisée à l'avenir comme une couche intermédiaire lors des opérations d'entrée-sortie. L'idée de cette fonctionnalité ajoutée est que, après le déplacement des données sur le stockage, au lieu de mettre à jour toutes les structures associées à ces données, les anciennes et les nouvelles adresses des données sont conservées dans la structure supplémentaire « arbre de remappage », puis lors de l'accès aux données, les adresses sont remplacées. Cette nouvelle approche est présentée comme plus fiable et flexible, tout en simplifiant l'expansion future des fonctionnalités de Btrfs.
- Btrfs prend en charge l'entrée/sortie directe dans des situations où la taille des blocs dépasse la taille de la page mémoire du système.
- Un nouveau système de fichiers « Nullfs » a été inclus, qui peut être utilisé comme un substitut pour le système de fichiers racine. Le système de fichiers Nullfs est toujours vide, ne contient pas de données et ne prend pas en charge les modifications. Son but est d'être utilisé comme système de fichiers initial pour simplifier le processus de démarrage du système : au-dessus de Nullfs, d'autres systèmes de fichiers sont montés, et l'appel système pivot_root() est utilisé pour passer au système de fichiers racine à la place de nettoyer le contenu de l'initramfs et d'utiliser le système de fichiers racine qui lui est associé.
- La mise à jour des informations sur le temps de modification des fichiers a été réalisée en mode non bloquant. Auparavant, l'appel à file_update_time_flags() avec le drapeau IOCB_NOWAIT renvoyait l'erreur « -EAGAIN », ce qui empêchait l'utilisation d'opérations d'écriture directe en mode non bloquant.
- Dans les systèmes de fichiers, le support des verrouillages d'avertissement (lease) a été ajouté en tant qu'option séparée. Par défaut, ce mécanisme n'est plus activé en raison de problèmes avec les systèmes de fichiers qui n'étaient pas initialement conçus pour son utilisation. Par exemple, il n'est pas supporté par les systèmes de fichiers 9p et cephfs.
- Dans le système de fichiers EROFS (Extendable Read-Only File System), destiné à être utilisé sur des partitions accessibles en mode lecture seule, l'algorithme LZMA est utilisé par défaut pour la compression. Les algorithmes DEFLATE et Zstandard sont disponibles en option et ne sont plus marqués comme expérimentaux. Le partage des entrées dans le cache de pages (page-cache) pour les fichiers identiques dans des systèmes de fichiers EROFS distincts a été réalisé.
- Le mode laptop_mode, qui économisait l'énergie en différant et en regroupant les opérations d'écriture sur le disque dur pour prolonger le temps de sommeil du disque et réduire le nombre de réveils, a été supprimé. Ce mode est devenu obsolète, car dans les appareils mobiles modernes, les disques durs ont été remplacés par des unités à état solide.
- Le système de fichiers F2FS a été mis à jour pour utiliser de grands volumes de pages mémoire (large folios).
- Le développement du pilote ntfs3, développé par Paragon Software, a été relancé. Le support des opérations de fichiers basé sur iomap a été ajouté, les options llseek SEEK_DATA/SEEK_HOLE ont été mises en œuvre, et le mode delalloc pour l'allocation différée de blocs a été ajouté. Entre-temps, sur la liste de diffusion des développeurs du noyau, il a été approuvé en février d'inclure dans une future version du noyau une nouvelle implémentation de NTFS - ntfsplus, conçue pour remplacer ntfs3.
- Par défaut, lors de la compilation, la version du protocole NFS 4.1 (CONFIG_NFS_V4_1) est activée. Le blocage à l'exportation via NFS de systèmes de fichiers pseudo-spécialisés, tels que pidfs et nsfs, a été assuré. NFSD intègre une fonctionnalité expérimentale utilisant POSIX ACL et a ajouté le support du changement dynamique du pool de threads (thread-pool) en fonction de la charge.
- Mémoire et services système
- Des règles officielles ont été adoptées pour l'utilisation des assistants AI et l'inclusion de contenu généré automatiquement dans le noyau. Lors de la transmission de code généré, il est stipulé de le marquer par l'indication de l'assistant AI utilisé via la balise « Assisted-by ». Il est interdit aux assistants AI d'ajouter la balise « Signed-off-by » - la personne qui transmet le patch est considérée comme son auteur, responsable des modifications passées et garant de leur qualité. Les développeurs sont tenus de procéder à une révision manuelle du code obtenu via l'AI et de vérifier la conformité des résultats aux exigences de licence.
- Le support de Rust a été transféré des fonctionnalités expérimentales aux fonctionnalités principales du noyau. Le support de Rust n'est pas activé par défaut et n'entraîne pas l'inclusion de Rust parmi les dépendances de compilation obligatoires pour le noyau.
- L'intégration dans le noyau du mécanisme « Swap Table » est terminée, permettant d'améliorer les performances de la mémoire virtuelle. L'accélération est obtenue grâce à la réduction de la concurrence pour l'accès au cache de mémoire, à une recherche plus efficace dans le cache et à une diminution de la fragmentation. Le backend basé sur Swap Table est utilisé pour le caching de la mémoire virtuelle au lieu du backend XArray, permettant dans le test redis-benchmark avec BGSAVE d'augmenter le nombre de requêtes traitées de 22%.
- Ajout du support de l'extension Thread Safety Analysis introduite dans Clang 22, permettant d'identifier les conditions de concurrence potentielles et les erreurs causées par un placement incorrect des verrous lors de la compilation. L'extension propose une série d'attributs, tels que GUARDED_BY(…), REQUIRES(…), RELEASE(…) et ACQUIRE(…), permettant de marquer les fonctions couvertes par des verrous et de délimiter les contextes d'application de ces verrous. Une vérification de la validité de l'utilisation des primitives de synchronisation, telles que les mutex, est effectuée au moment de la compilation, basée sur une évaluation de l'activité ou de l'inactivité du contexte associé.
- Un drapeau OPEN_TREE_NAMESPACE a été ajouté à l'appel système open_tree pour simplifier la configuration de conteneurs isolés et accélérer le démarrage des conteneurs sur des systèmes avec de nombreux points de montage. Comme avec OPEN_TREE_CLONE, le nouveau drapeau ne copie que l'arbre de points de montage spécifié (mount tree), mais renvoie un descripteur de fichier dans un nouvel espace de noms de points de montage où l'arbre copié est monté au-dessus de la copie du système de fichiers racine réel. Le drapeau OPEN_TREE_NAMESPACE est demandé pour éviter d'exécuter séparément les opérations unshare(CLONE_NEWNS) et pivot_root() lors de la création de conteneurs.
- Un mécanisme d'extension des quantum de temps a été ajouté à l'appel système rseq, permettant d'obtenir un temps processeur supplémentaire pour l'exécution non interrompue d'une section critique. L'idée est d'éviter que le planificateur de tâches n'interrompe une section critique avec un verrou en place, ce qui conduit à la transmission du contrôle à d'autres threads utilisant la ressource, laissant le verrou en place. L'extension du quantum de temps est effectuée sans coûts supplémentaires, mais sans les garanties strictes fournies par un contrôle de priorité complet.
- Pour les architectures arm64, loongarch, powerpc, riscv, s390 et x86, le mode de préemption des tâches (preemption) dans le planificateur par défaut a été changé de PREEMPT_NONE à 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 laissés uniquement pour les architectures qui ne prennent pas en charge PREEMPT_FULL et PREEMPT_LAZY). Le mode PREEMPT_LAZY applique le modèle de préemption totale (PREEMPT_FULL) pour les tâches en temps réel (RR/FIFO/DEADLINE), mais retarde la préemption des tâches normales (SCHED_NORMAL) jusqu'à la limite du tick. Le retard introduit réduit le nombre de cas de préemption des détenteurs de verrous, ce qui permet d'approcher la performance des configurations utilisant le modèle de préemption volontaire (voluntary preemption), c'est-à-dire que PREEMPT_LAZY permet de conserver les capacités de préemption totale en ce qui concerne les tâches en temps réel, mais minimise la baisse de performance pour les tâches normales.
L'activation de PREEMPT_LAZY a entraîné une régression sérieuse, réduisant de moitié la performance de PostgreSQL sur les systèmes ARM64. Pour remédier à la baisse de performance, il a été proposé aux développeurs de PostgreSQL d'activer l'option PR_RSEQ_SLICE_EXTENSION pour réduire la probabilité de préemption du détenteur de verrou.
- Le transfert des modifications de la branche Rust-for-Linux, concernant l'utilisation du langage Rust comme deuxième langage pour le développement de pilotes et de modules du noyau, se poursuit. Grâce à la bibliothèque intégrée « syn », qui facilite l'écriture de macros complexes, la taille du code Rust dans le noyau a pu être réduite en simplifiant les définitions des macros procédurales existantes. Les capacités des bibliothèques kernel, macros et pin-init ont été étendues.
- Un nouvel option a été ajoutée au système d'entrée/sortie asynchrone io_uring pour utiliser des files d'attente de soumission non circulaires (non-circular submission queue), mieux mises en cache dans les situations où l'exécution d'une requête se termine avant le retour de l'appel système.
- Dans la sous-système eBPF, un mécanisme BTF (BPF Type Format), fournissant des informations pour la vérification des types dans le pseudocode BPF, a utilisé la recherche binaire pour rechercher des informations de débogage, ce qui a amélioré l'efficacité du chargement des programmes BPF. Le support des arguments implicites lors de l'appel de kfunc (fonctions du noyau disponibles pour utilisation dans les programmes BPF), définis avec le drapeau KF_IMPLICIT_ARGS, a été ajouté dans eBPF.
- Le code de prise en charge de l'initrd, basé sur linuxrc, a été supprimé, étant déclaré obsolète depuis longtemps. Les implémentations restantes de l'initrd prévoient d'être supprimées en 2027. Il est recommandé d'utiliser l'initramfs à la place (la différence réside dans le fait que l'initrd place l'environnement de démarrage initial dans une image disque, tandis que l'initramfs le place dans le système de fichiers).
- Dans l'appareil de bloc zram, utilisé pour le stockage compressé de la partition d'échange en mémoire, la logique de traitement des pages de mémoire compressées a été modifiée lors d'un déplacement optionnel des données vers un stockage permanent en cas de saturation de la mémoire vive disponible. Auparavant, les pages de mémoire étaient décompressées avant d'être écrites sur le support physique, tandis qu'elles sont maintenant enregistrées telles quelles sous forme compressée, ce qui réduit la charge sur le CPU et économise de l'énergie en mode autonome.
- L'outil timerlat, conçu pour mesurer les délais d'exécution du planificateur de tâches, a ajouté l'option « --bpf-action » pour lancer des programmes BPF en cas de dépassement du seuil défini.
- Le système de traçage ftrace a introduit le paramètre « bitmask-list » pour afficher les masques de bits de manière lisible (sous forme de liste de bits, et non en nombre hexadécimal). Des fonctionnalités liées à l'audit des filtres et des déclencheurs ont été ajoutées à tracefs. La commande « perf sched stats » a été ajoutée pour collecter et afficher des statistiques sur le fonctionnement du planificateur de tâches.
- Des options de compilation LOGO_LINUX_MONO_FILE, LOGO_LINUX_VGA16_FILE et LOGO_LINUX_CLUT224_FILE ont été ajoutées pour définir le fichier contenant l'image du logo qui sera affichée au démarrage du noyau à la place du logo par défaut avec le pingouin Tux.
- Virtualisation et sécurité
- Le système d'E/S asynchrone io_uring a mis en œuvre la possibilité d'attacher des programmes BPF avec des filtres, contrôlant ce que peuvent faire des opérations spécifiques de SQE (Submission Queue Entry) (similaires aux appels système dans io_uring). Cette fonctionnalité ajoutée est l'analogue des filtres d'appels système. Les filtres peuvent être attachés à des tâches spécifiques et sont hérités lors de la création d'autres processus après un appel fork(). En présence de filtres actifs, les filtres ajoutés peuvent uniquement ajouter des restrictions supplémentaires, mais ne peuvent pas désactiver ceux déjà existants. Cette fonctionnalité mise en œuvre permettra de bloquer les méthodes d'évitement de la filtration des appels système dans les environnements sandbox basées sur l'exécution d'opérations analogues fournies dans io_uring au lieu des appels système.
- SELinux a ajouté la possibilité de gérer l'accès aux jetons BPF, permettant ainsi aux processus non privilégiés d'exécuter certaines opérations privilégiées avec BPF, comme le chargement de programmes BPF dans le noyau et la création de structures map.
- Le support de l'algorithme de signature numérique ML-DSA (CRYSTALS-Dilithium), basé sur la théorie des réseaux et résistant aux attaques sur des ordinateurs quantiques, a été ajouté. Il est désormais possible d'utiliser ML-DSA pour authentifier les modules du noyau.
- La possibilité d'utiliser des schémas de signature numérique avec l'algorithme SHA-1 pour la certification des modules du noyau a été supprimée (le support pour le chargement de modules signés demeure).
- Dans l'enregistrement d'audit NETFILTER_PKT, les champs 'sport' et 'dport' ont été ajoutés pour inspecter les numéros des ports réseau, et non seulement. adresses IP.
- Pour les systèmes avec l'architecture RISC-V, le support des extensions Zicfiss et Zicfilp a été implémenté, offrant des capacités matérielles pour appliquer la protection CFI (Control Flow Integrity), empêchant les violations de l'ordre normal d'exécution des instructions (flux de contrôle) dues à des exploits modifiant les pointeurs de fonction stockés en mémoire.
- Dans l'hyperviseur KVM Il est désormais possible de transmettre aux systèmes invités des informations sur la prise en charge par le processeur de l'extension ERAPS (Enhanced Return Address Predictor Security), permettant d'éviter certaines opérations de réinitialisation de l'état du CPU lors du retour de contrôle de l'invité au système hôte. De plus, le support pour l'attachement de matériel aux systèmes invités pour le suivi de la performance (PMU, Performance Monitoring Unit) a été ajouté, ce qui permet d'améliorer la précision du profilage par rapport à l'utilisation de PMU émulés.
- Dans le pilote pour l'hyperviseur Hyper-V, le support de l'interface debugfs pour consulter les statistiques sur le fonctionnement de l'hyperviseur a été ajouté.
- Sous-système réseau
- L'extension AccECN (Accurate Explicit Congestion Notification) est activée par défaut, réalisant une variante améliorée de l'extension ECN, permettant aux hôtes de marquer les paquets IP en cas de surcharge au lieu de les rejeter. Cela permet d'identifier l'apparition d'un début de congestion dans les canaux de communication sans perte de paquets. L'extension ECN d'origine a une limitation, autorisant l'envoi d'un seul signal de surcharge par cycle de transmission TCP (RTT, Round-Trip Time, envoi de la requête et réception de la réponse). AccECN supprime cette limitation et permet au récepteur d'envoyer plusieurs étiquettes de surcharge à l'expéditeur dans l'en-tête du paquet TCP. Les algorithmes de gestion de la surcharge peuvent utiliser ces informations pour réagir plus précisément aux surcharges sans recourir à une réduction brusque de l'intensité d'envoi de paquets en cas de légère surcharge.
- Le développement de l'algorithme de gestion des files d'attente réseau Cake a été enrichi d'une capacité de traitement de plusieurs files pour répartir la charge sur plusieurs cœurs de CPU. L'algorithme CAKE est utilisé pour réduire l'impact négatif de la mise en mémoire tampon intermédiaire des paquets sur le matériel réseau de frontière, visant à atteindre la plus grande capacité possible et un niveau minimal de latence même sur les canaux de communication lents.
- La prise en charge des espaces de noms réseau (network namespace) a été ajoutée aux sockets VSOCK, utilisés pour interagir avec des machines virtuelles.
- Une implémentation initiale de la future norme WiFi 8 (802.11bn, WiFi Ultra Haute Fiabilité) a été ajoutée.
- Des optimisations ont été ajoutées, permettant d'augmenter de 12 % la performance du traitement des paquets UDP entrants lors des tests de stress dans un réseau de 100 gigabits.
- Matériel
- Le pilote AMDGPU a été doté de la prise en charge de 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.
- Dans le pilote Nouveau, la gestion de la fréquence a été améliorée sur les systèmes Tegra 186+.
- Le pilote i915 a ajouté un support initial pour le bloc IP d'affichage Xe3p_LPD, utilisé dans les processeurs Intel Nova Lake-P.
- Le développement du pilote drm (Direct Rendering Manager) Xe pour les GPU basés sur l'architecture Intel Xe, qui est utilisé dans les cartes graphiques Intel de la série Arc et dans la graphique intégrée à partir des processeurs Tiger Lake, a été poursuivi. Un mode Multi Queue a été ajouté. Des composants nécessaires au diagnostic des blocages du GPU dans Mesa ont été ajoutés. Le mécanisme MERT pour la gestion de l'accès à la mémoire GPU a été supporté.
- L'intégration des composants du pilote Nova pour les GPU NVIDIA équipés de firmwares GSP, utilisés depuis la série NVIDIA GeForce RTX 2000 basée sur l'architecture Turing, a été poursuivie. Le pilote est écrit en Rust. Dans la nouvelle version, des préparations ont été faites pour implémenter le support des GPU basés sur l'architecture Turing et divers changements internes ont été introduits.
- Le support des contrôleurs et des périphériques avec une interface SPI (Serial Peripheral Interface) multicanal, permettant de transmettre des données en plusieurs flux parallèles, a été ajouté.
- Un pilote pour les connecteurs combinés Type-C, utilisés sur les appareils basés sur des puces Apple Silicon et combinant les interfaces USB3, DP-AltMode et Thunderbolt/USB4, a été ajouté.
- Le support des sous-systèmes audio des puces Tegra238, Minisforum V3 SE, iBasso DC04U, Intel Nova Lake, Nova Lake S et Focusrite Forte a été ajouté.
- Le support des plateformes ARM, des SoC et des appareils suivants a été ajouté : 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.
Simultanément, la Fondation latino-américaine du logiciel libre a élaboré une version entièrement libre du noyau 7.0 — Linux-libre 7.0-gnu, purgée des éléments de firmwares et de pilotes contenant des composants ou sections de code non libres, dont l'utilisation est restreinte par le fabricant. La version 7.0 a effectué la purge des blobs du pilote iwlwifi. Le code de purge dans les pilotes amdgpu, adreno, TI PRUeth, air_en8811h, ath12k, TI VPE, rtw8852b, rt1320, rt5575 SPI, tas2783, Intel catpt a été mis à jour. Les noms des blobs dans les fichiers dts (devicetree) pour les puces ARM ont été nettoyés.
Source : opennet.ru
