Après deux mois de développement, Linus Torvalds a présenté la version du noyau Linux 6.6. Parmi les changements les plus notables : un nouvel ordonnanceur de tâches EEVDF ; un mécanisme de pile ombre pour se protéger contre les exploits ; prise en charge de fs-verity dans OverlayFS ; mise en œuvre de quotas et xattr dans tmpfs ; préparation d'un fsck en ligne dans XFS ; suivi renforcé de l'export des symboles « GPL-only » ; prise en charge des sockets réseau dans io_uring ; randomisation de la mémoire dans kmalloc(); ReiserFS déclarée obsolète ; ajout de primitives pour le driver Vulkan NVK dans Nouveau.
La nouvelle version a accepté 15 291 corrections de 2 058 développeurs, la taille du patch étant de 39 Mo (les changements ont concerné 14 844 fichiers, 553 359 lignes de code ajoutées, 284 012 lignes supprimées). La version précédente comptait 14 674 corrections provenant de 2 016 développeurs, avec une taille de patch de 78 Mo. Environ 44 % de tous les changements présentés dans 6.6 concernent les drivers de périphériques, environ 17 % des changements sont relatifs à la mise à jour de code spécifique aux architectures matérielles, 11 % concernent la pile réseau, 4 % les systèmes de fichiers et 3 % les sous-systèmes internes du noyau.
Les principales nouveautés dans le noyau 6.6 :
- Mémoire et services système
- Un nouvel ordonnanceur de tâches EEVDF (Earliest Eligible Virtual Deadline First) a été mis en œuvre, remplaçant l'ordonnanceur CFS (Completely Fair Scheduler) qui était livré depuis le noyau 2.6.23. Le nouvel ordonnanceur, lors du choix du prochain processus à exécuter, prend en compte les processus qui n'ont pas reçu suffisamment de ressources processeur ou qui ont bénéficié d'un temps processeur excessif. Dans le premier cas, la transmission du contrôle au processus est forcée, tandis que dans le second, elle est retardée. L'ancien ordonnanceur CFS utilisait des heuristiques et des réglages fins pour identifier les processus nécessitant une attention particulière, tandis que le nouvel ordonnanceur les suit de manière plus explicite sans nécessiter de réglages fins. On s'attend à ce que l'EEVDF réduise les délais d'exécution des tâches qui posaient des problèmes de planification avec le CFS.
- Des modifications ont été apportées au traitement des symboles internes de la catégorie « GPL-only », visant à compliquer l'utilisation de modules propriétaires GPL-layer pour contourner les restrictions d'accès aux sous-systèmes du noyau, qui ne permettent d'accéder qu'au code sous licence GPL. Dans la fonction symbol_get(), la recherche de symboles marqués comme GPL-only est interdite pour les modules propriétaires, et vice versa, les modules GPL ne pourront pas trouver de symboles exportés par des modules propriétaires.
- Des paramètres supplémentaires pour les files d'attente de travail (unbound workqueue) ont été ajoutés pour améliorer l'efficacité de la réutilisation du cache processeur sur des systèmes plus importants, disposant de plusieurs caches de troisième niveau (L3). L'outil tools/workqueue/wq_dump.py a également été intégré au noyau pour vérifier la configuration actuelle des files d'attente de travail.
- Un support initial pour des opérations et des commandes spécifiques aux sockets réseau a été ajouté au sous-système io_uring. Le sysctl io_uring_disabled a été ajouté pour désactiver io_uring au niveau du système entier. De plus, l'entrée/sortie directe (Direct I/O) dans io_uring a été considérablement accélérée en mode asynchrone. L'augmentation de la bande passante et la réduction des temps de latence lors de l'exécution des opérations d'entrée/sortie après les modifications atteignent 37%.
- Un compilateur JIT pour BPF a été implémenté pour l'architecture PA-RISC.
- La configuration /sys/devices/system/cpu/smt/control a été mise à jour pour inclure un support de paramètres numériques définissant le nombre de threads disponibles pour chaque cœur CPU (auparavant, seuls les valeurs « on » et « off » étaient prises en charge pour activer ou désactiver le support de l'hyperthreading symétrique). Cette nouvelle fonctionnalité peut être appliquée sur certains processeurs PowerPC prenant en charge le mode de branchement à chaud de l'hyperthreading symétrique (« hotplug SMT »), pour activer sélectivement SMT sur certains cœurs pendant le fonctionnement.
- La migration des modifications de la branche Rust-for-Linux, concernant l'utilisation du langage Rust comme second langage pour le développement de pilotes et de modules de noyau, a été poursuivie (le support de Rust n'est pas activé par défaut et ne rend pas Rust obligatoire dans les dépendances de construction du noyau). La transition vers les versions de Rust 1.71.1 et bindgen 0.65.1 a été effectuée. Le trait ‘Zeroable’ a été réalisé. Les macros procédurales ‘paste!’ et ‘#[derive(Zeroable)]’ ont été ajoutées. La compatibilité avec ‘#[pin_data]’ a été assurée. Les fonctions d'initialisation ‘{,pin_}init_array_from_fn()’ et la méthode ‘{,pin_}chain’ ont été ajoutées. Les capacités du module ‘types’ ont été étendues. Dans le cadre des tests unitaires, kunit a été amélioré pour permettre l'exécution de tests depuis la documentation Rust.
- Une sous-système « eventfs » a été ajoutée, permettant de réduire considérablement la consommation de mémoire dans le système de traçage, en éliminant le stockage de structures inutiles utilisées pour représenter les points de traçage dans le système de fichiers. Auparavant, de telles structures étaient créées pour tous les points de traçage, indépendamment de leur utilisation. Avec eventfs, de telles structures peuvent être créées dynamiquement, uniquement lorsqu'elles sont nécessaires.
- Les capacités de l'outil perf ont été élargies.
- Des informations pour le diagnostic de l'efficacité du mécanisme de fusion des pages mémoire identiques (KSM, Kernel Samepage Merging) ont été ajoutées au fichier /proc/pid/smaps.
- L'API Frontswap, permettant d'installer une partition d'échange dans une mémoire non adressable directement et ne fournissant pas d'informations opérationnelles sur la disponibilité d'espace libre, a été supprimée. Cette API n'était utilisée que dans zswap, il a donc été décidé d'utiliser directement cette fonctionnalité dans zswap, éliminant les couches inutiles.
- Pour l'architecture RISC-V, le support d'accès aux compteurs de performance depuis l'espace utilisateur et la possibilité de placer un dump du noyau après un crash au-delà de 4 Go ont été ajoutés.
- Le support initial des instructions ARM SME (Scalable Matrix Extension) a été ajouté.
- La possibilité d'utiliser les outils de débogage KDB, KGDB, kcov, KFENCE et KASAN sur des systèmes avec l'architecture LoongArch a été mise en œuvre.
- Le support des fichiers pour les tests de noyau dans le système d'intégration continue GitLab, utilisé pour le développement de pilotes graphiques, a été ajouté.
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Le système de fichiers OverlayFS a ajouté la prise en charge de la sauvegarde des hachages fs-verity dans l'attribut étendu (xattr) overlay.verity, qui peut être utilisé pour vérifier l'intégrité et l'authenticité des fichiers dans les couches inférieures d'OverlayFS à l'aide de hachages cryptographiques et de clés. Par conséquent, OverlayFS comprend désormais toutes les modifications nécessaires au projet Composefs pour fonctionner comme une extension au-dessus de FS OverlayFS et EROFS.
- Le système de fichiers XFS a été préparé pour mettre en œuvre la possibilité d'appliquer l'utilitaire fsck pour vérifier et corriger les problèmes détectés en mode en ligne, sans démonter le système de fichiers. De plus, XFS a mis en œuvre la possibilité d'utiliser de grands folios dans le cache de pages et a ajouté certaines optimisations connexes, permettant d'améliorer considérablement les performances pour certains types de charge.
- Le système de fichiers tmpfs a ajouté la prise en charge des attributs étendus personnalisés (user xattrs), de l'E/S directe et des quotas liés à l'utilisateur et au groupe. Les décalages sur les répertoires ont été stabilisés, résolvant ainsi les problèmes d'exportation de tmpfs via NFS.
- Dans l'API de gestion du montage, un drapeau FSCONFIG_CMD_CREATE_EXCL a été ajouté pour augmenter la sécurité, empêchant le partage du superbloc à plusieurs points de montage (interdisant l'attachement d'une partition à plusieurs points de montage). Dans l'outil mount, une option «—exclusive» a été proposée pour activer ce drapeau.
- Dans le sous-système VFS, la prise en charge des modifications opérationnelles des paramètres d'accès et de modification (atime, mtime) a été ajoutée. Auparavant, les données temporelles étaient reflétées avec un certain retard, ce qui empêchait le suivi de l'actualité des données dans le cache dans des systèmes tels que NFS (en raison du retard dans la détection des modifications dans le fichier, le système pouvait erronément penser que les données dans le cache étaient actuelles). Cette nouvelle fonctionnalité est disponible pour Btrfs, Ext4, tmpfs et XFS.
- Dans Btrfs, le mécanisme de vérification d'intégrité intégré, activé au moment de la construction via le paramètre BTRFS_FS_CHECK_INTEGRITY, a été déclaré obsolète. Ce mécanisme n'est plus maintenu, n'est plus testé et crée une charge supplémentaire sur le CPU et la mémoire. De plus, la performance du nouveau code de vérification FS (scrub) a été optimisée dans Btrfs.
- Dans le système de fichiers Ext4, des vérifications périodiques de la mise à jour du superbloc ont été ajoutées, et les opérations d'allocation de mémoire lors de l'écriture à la fin du fichier ont été accélérées.
- La sous-système FUSE a ajouté le support de l'attribut btime (« temps de création »), qui détermine le moment de la création d'un inode.
- Modification des droits d'accès pour les liens symboliques interdites.
- Un nouvel appel système fchmodat2() a été ajouté, qui diffère de l'appel fchmodat() par un argument supplémentaire pour indiquer des drapeaux. Actuellement, seuls les drapeaux AT_SYMLINK_NOFOLLOW et AT_EMPTY_PATH sont pris en charge, permettant d’implémenter sans détours dans la fonction libc fchmodat() l'interdiction de la désérialisation des liens symboliques et la possibilité d'utiliser un descripteur de fichier en spécifiant un chemin vide.
- Dans le système de fichiers EROFS (Extendable Read-Only File System), conçu pour une utilisation sur des partitions accessibles en mode lecture seule, le support de l'algorithme de compression Deflate a été ajouté. Pour accélérer la recherche d'attributs étendus, une structure probabiliste de bloom filter a été mise en place.
- Une configuration CONFIG_BUFFER_HEAD a été ajoutée, permettant de compiler le noyau sans utiliser la structure buffer_head. Lors de la compilation sans buffer_head, il est possible d'utiliser des dispositifs de blocs et certains systèmes de fichiers, comme xfs, btrfs, cramfs, erofs et squashfs.
- Dans le pilote de dispositifs de blocs ublk, qui permet de transférer la logique spécifique du processus vers l'espace utilisateur, un support des dispositifs de stockage zonés a été ajouté (une séparation en zones de groupes de blocs ou de secteurs, où seule l'ajout séquentiel de données est autorisé avec la mise à jour de l'ensemble du groupe de blocs).
- La mise en œuvre du système de fichiers ReiserFS a été reclassée de celle des systèmes pris en charge à celle des systèmes obsolètes. La prise en charge de ReiserFS devrait cesser en 2025. La raison pour laquelle ReiserFS a été classée comme obsolète mentionne la stagnation dans la maintenance de ce système de fichiers, le problème non résolu de l'an 2038, l'absence de possibilités d'assurer la tolérance aux pannes et le souhait de réduire les efforts nécessaires pour maintenir des modifications communes aux systèmes de fichiers liées à la prise en charge de la nouvelle API pour le montage, iomap et folios.
- Un mécanisme de délégation des opérations d'écriture pour NFSv4 a été mis en œuvre sur le serveur NFS, augmentant l'efficacité de la mise en cache des écritures de fichiers pour réduire le trafic. Le support de l'opération READ_PLUS, définie dans NFS 4.2, a été inclus.
- Le système de fichiers Ceph prend en charge fscrypt.
- Virtualisation et sécurité
- Une implémentation du mécanisme Shadow Stack a été ajoutée, permettant de bloquer l'exécution de nombreux exploits, en utilisant les capacités matérielles des processeurs Intel pour protéger contre l'écrasement de l'adresse de retour d'une fonction en cas de débordement de tampon dans la pile. L'essence de la protection est que, après le transfert du contrôle à la fonction, l'adresse de retour est sauvegardée par le processeur non seulement dans la pile habituelle, mais aussi dans une « pile ombre » distincte, qui ne peut pas être modifiée directement. Avant de sortir de la fonction, l'adresse de retour est extraite de la pile ombre et comparée à l'adresse de retour de la pile principale. Une non-coïncidence des adresses entraîne la génération d'une exception, bloquant les situations où un exploit a réussi à écraser l'adresse dans la pile principale. La pile ombre matérielle n'est supportée que dans les versions 64 bits, tandis que dans les versions 32 bits, une émulation logicielle est utilisée.
- Ajout de la prise en charge de la compilation avec Clang avec le mode de protection CFI (Control Flow Integrity) activé, bloquant les violations de l'ordre d'exécution normal (control flow) résultant de l'utilisation d'exploits modifiant les pointeurs de fonction stockés en mémoire.
- Pour l'architecture RISC-V, la randomisation de l'emplacement du noyau en mémoire lors du démarrage a été activée.
- L'appel système seccomp() a été ajouté avec le drapeau SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP, permettant de traiter les événements des processus surveillés en mode synchrone pour un fonctionnement plus efficace du planificateur de tâches.
- La fonction kmalloc() a assuré la randomisation des caches slab, rendant l'exploitation des vulnérabilités dans le noyau plus difficile.
- Les options liées à l'activation du système de contrôle d'accès obligatoire SELinux n'incluent plus de mention de l'Agence nationale de sécurité des États-Unis. Comme le projet se développe sous l'égide de la communauté depuis 20 ans et est maintenu indépendamment, il a été décidé de passer à l'utilisation du nom « SELinux » au lieu de « NSA SELinux » dans les commentaires et la documentation de Kconfig (par exemple, l'explication de l'option de construction SECURITY_SELINUX a été modifiée de « NSA SELinux Support » à « SELinux Support »).
- Dans l'appel système userfaultfd(), l'opération UFFDIO_POISON a été ajoutée, permettant de marquer des pages mémoire comme « contaminées » (poisoned), ce qui peut être utilisé pour transférer des pages mémoire corrompues lors de la migration. machines virtuelles d'un système à un autre.
- Un nouvel interface symbolique a été ajouté au sous-système VFIO ( /dev/vfio/devices/vfioX ) pour le contrôle des appareils VFIO, permettant à l'utilisateur d'ouvrir directement le fichier d'un appareil sans recourir à l'interface de groupe obsolète /dev/vfio/$groupID.
- Dans le serveur Le support des anciens types de chiffrement Kerberos utilisant les algorithmes DES et 3DES a été supprimé pour NFS.
- Le support des systèmes invités protégés par la technologie AMD SEV-SNP (Secure Nested Paging) et Intel TDX (Trusted Domain Extensions) a été ajouté lors du démarrage dans un environnement d'hyperviseur Hyper-V.
- Lors de la compilation du noyau en mode « W=1 », les avertissements « -Wformat-overflow », « -Wformat-truncation », « -Wstringop-overflow » et « -Wrestrict » sont activés par défaut dans le compilateur. Pour toutes les compilations, l'avertissement « -Wenum-conversion » est activé.
- Sous-système réseau
- La mise en œuvre de la famille d'adresses AF_XDP (eXpress Data Path) a été étendue pour permettre le traitement de paquets stockés dans plusieurs tampons (par exemple, un tampon peut contenir l'en-tête du paquet et un autre les données, ou une chaîne de plusieurs tampons peut contenir de grands jumbo-frames Ethernet). Les programmes utilisant des sockets AF_XDP peuvent maintenant recevoir et envoyer des paquets à partir de plusieurs tampons.
- Le sous-système BPF a ajouté le support de la défagmentation des paquets IPv4 et IPv6, ainsi que la possibilité de filtrer les paquets fragmentés.
- Un nouveau gestionnaire update_socket_protocol a été ajouté au BPF, permettant aux programmes BPF de modifier le protocole demandé pour les nouveaux sockets. Par exemple, un programme BPF peut remplacer de manière transparente le protocole TCP par MPTCP (multipath TCP) pour optimiser le trafic de l'application. Le BPF prend également en charge la gestion du routage des paquets à travers différents flux dans MPTCP.
- L'étiquette de développement expérimental a été retirée du module ksmbd, qui propose une implémentation de serveur de fichiers au niveau du noyau basée sur le protocole SMB3. Le support de l'union des opérations de lecture (requêtes « read compound ») a été ajouté.
- Matériel
- Des modifications nécessaires ont été apportées au sous-système DRM (Direct Rendering Manager) pour un fonctionnement efficace du pilote ouvert NVK avec l'implémentation de l'API graphique Vulkan pour les cartes graphiques NVIDIA. À l'origine, le pilote DRM Nouveau était prévu pour l'implémentation d'OpenGL, il manque donc des primitives nécessaires au bon fonctionnement des pilotes Vulkan, telles que le support d'objets synchronisés et la gestion de l'espace d'adresses virtuelles.
- Le pilote AMDGPU prend en charge SDMA 6.1.0, HDP 6.1, SMUIO 14.0, PSP 14.0, IH 6.1 et GFX 9.4.3. Le code de chargement du firmware PSP (Platform Security Processor) a été retravaillé. Le support de la technologie de synchronisation adaptative FreeSync a été élargi (ajout du support de Freesync Panel Replay V2).
- Le pilote i915 continue de prendre en charge les puces Intel Meteor Lake. L'assistance pour la technologie de protection de contenu par HDCP (High-bandwidth Digital Content Protection) a été améliorée. Le code pour l'interaction avec l'affichage a été retravaillé.
- Les options de désactivation du chargement du microcode lors de la compilation — MICROCODE_INTEL et MICROCODE_AMD — ont été retirées de Kconfig. Le noyau est maintenant toujours compilé avec le code de chargement du microcode pour les systèmes x86, mais le chargement effectif du microcode peut être désactivé en spécifiant le paramètre du noyau ‘dis_ucode_ldr’.
- La sous-système audio a été dotée de la possibilité de gérer des périphériques audio connectés via la sous-système IIO (Industrial I/O).
- Ajout du support des interfaces audio Intel LunarLake, Intel ArrowLake et AMD ACP5x, des codecs Cirrus Logic CS42L43, Realtek RT1017 et TI TAS2781, ainsi que des amplificateurs Cirrus Logic CS35L56 et winic aw88261. Ajout du support ASoC AMD Van Gogh.
- Ajout d'un pilote USB MIDI 2.0 Gadget, émulant une interface USB MIDI 2.0, lié au périphérique ALSA UMP rawmidi.
- Ajout du support des contrôleurs Ethernet Broadcom ASP 2.0 et Marvell 88Q2XXX.
- Ajout du support des panneaux Visionox R66451, TDO TL050HDV35, KD070FHFID015, Inanbo T28CP45TN89 et EDT ET028013DMA, des contrôleurs d'affichage Loongson et des contrôleurs d'écran tactile Azoteq IQS7222D/IQS7210A/7211A.
- Ajout du support du SoC ARM Qualcomm SM4450 (Snapdragon 4 Gen 2), TI AM62P5, Intel Agilex5, Qualcomm ipq5018, AN400 (Amlogic T7).
- Ajout du support des plates-formes ARM Samsung Galaxy Tab 3 8.0, FriendlyElec NanoPC T6, Amlogic A311D2, Khadas Vim4, Xiaomi SM7125, Facebook Yosemite 4, Orange Pi Zero 3, Radxa ROCK 4SE.
Simultanément, la Fondation du logiciel libre d'Amérique latine a créé une version entièrement libre du noyau 6.6 — Linux-libre 6.6-gnu, purgée des éléments de firmware et de pilotes contenant des composants non libres ou des portions de code dont l'utilisation est limitée par le fabricant. Dans la version 6.6, le code de nettoyage des blobs dans divers pilotes et sous-systèmes a été mis à jour, par exemple, dans les pilotes TI gigabit RU ethernet, MediaTek 792x wifi, Cirrus Logic cs42l43 mfd, cs35l56 HD-audio et aw88261 SoC. Les noms des blobs dans les fichiers dts pour l'architecture Aarch64 ont été nettoyés. Des blobs ont été supprimés dans les nouveaux pilotes ivpu, dans les pilotes Bluetooth, dans le pilote de l'écran tactile et dans l'encodeur/décodeur Qualcomm Venus V4L2.
Source : opennet.ru
