Après deux mois de développement, Linus Torvalds a présenté la version 5.15 du noyau Linux. Parmi les changements les plus notables, on trouve : un nouveau pilote NTFS avec prise en charge de l'écriture, un module ksmbd implémentant un serveur SMB, un sous-système DAMON pour le monitoring de l'accès à la mémoire, des primitives de verrouillage pour le mode temps réel, le support de fs-verity dans Btrfs, un appel système process_mrelease pour les systèmes réagissant à un manque de mémoire, et un module d'attestation à distance dm-ima.
La nouvelle version comprend 13 499 corrections de 1 888 développeurs, la taille du patch est de 42 Mo (les modifications touchent 10 895 fichiers, 632 522 lignes de code ont été ajoutées et 299 966 lignes ont été supprimées). Environ 45 % des modifications présentées dans 5.15 concernent les pilotes de périphériques, environ 14 % des changements concernent la mise à jour de code spécifique à des architectures matérielles, 14 % sont liés à la pile réseau, 6 % aux systèmes de fichiers et 3 % aux sous-systèmes internes du noyau.
Les principales nouveautés :
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Une nouvelle implémentation du système de fichiers NTFS, développée par Paragon Software, a été intégrée au noyau. Le nouveau pilote peut fonctionner en mode écriture et prend en charge toutes les fonctionnalités de la version actuelle de NTFS 3.1, y compris les attributs étendus de fichiers, les listes de contrôle d'accès (ACL), le mode de compression des données, un fonctionnement efficace avec les espaces vides dans les fichiers (sparse) et la reproduction des modifications à partir du journal pour restaurer l'intégrité après des pannes.
- Dans le système de fichiers Btrfs, la prise en charge du mécanisme fs-verity a été implémentée, utilisée pour un contrôle transparent de l'intégrité et de l'authenticité des fichiers individuels par rapport aux hachages ou clés cryptographiques associés, stockés dans la zone des métadonnées. Auparavant, fs-verity n'était disponible que pour les systèmes de fichiers Ext4 et F2fs.
Dans Btrfs, le support du mapping des identifiants d'utilisateur pour les systèmes de fichiers montés a également été ajouté (auparavant, cela n'était pris en charge que pour FAT, ext4 et XFS). Cette fonctionnalité permet de faire correspondre les fichiers d'un utilisateur sur une partition montée d'un autre utilisateur dans le système actuel.
Parmi les autres modifications dans Btrfs : accélération de l'ajout de clés à l'index du répertoire pour améliorer les performances de création de fichiers ; possibilité de fonctionnement du raid0 avec un seul appareil, et du raid10 avec deux (par exemple, lors de la reconfiguration d'un ensemble) ; option « rescue=ibadroots » pour ignorer un arbre d'extents incorrect ; accélération de l'opération « send » ; réduction des conflits de verrouillage pendant les opérations de renom ; possibilité d'utiliser des secteurs 4K sur des systèmes avec une taille de page mémoire de 64K.
- Dans XFS, la possibilité d'utiliser des FS après 2038 a été stabilisée. Un mécanisme de désactivation différée des inode et le support de l'installation et de la suppression différées des attributs de fichiers ont été réalisés. Afin d'éviter des problèmes, la possibilité de désactiver les quotas de disque pour les partitions déjà montées a été supprimée (les quotas peuvent être désactivés de manière forcée, mais le calcul associé se poursuivra, donc pour une désactivation complète, un remontage est nécessaire).
- Dans EXT4, des efforts ont été réalisés pour augmenter les performances d'écriture des tampons delalloc et du traitement des fichiers orphelins (orphan) qui continuent d'exister parce qu'ils restent ouverts, mais n'ont plus de lien avec un répertoire. Le traitement des opérations de discard a été séparé du flux jbd2 kthread pour éviter des blocages lors des opérations avec les métadonnées.
- Dans F2FS, une option « discard_unit=block|segment|section » a été ajoutée pour lier les opérations de discard (marquage des blocs libérés qui peuvent déjà ne plus être physiquement stockés) à un alignement par rapport au bloc, secteur, segment ou section. Un support pour le suivi des changements de délais lors de l'entrée/sortie a été ajouté.
- Dans le système de fichiers EROFS (Extendable Read-Only File System), le support pour l'entrée/sortie directe pour les fichiers enregistrés sans compression, ainsi que le support de fiemap, a été ajouté.
- Dans OverlayFS, le traitement correct des options de montage « immutable », « append-only », « sync » et « noatime » a été mis en œuvre.
- Dans NFS, le traitement des situations où le serveur NFS a cessé de répondre aux requêtes a été amélioré. La possibilité de montage à partir d'un espace déjà utilisé a été ajoutée, mais accessible via une autre adresse réseau. de serveurs, mais accessible via une autre adresse réseau.
- Les préparations pour la réécriture du sous-système FSCACHE ont commencé.
- Le support des partitions EFI avec un placement non standard des tables GPT a été ajouté.
- Dans le mécanisme fanotify, un nouveau drapeau FAN_REPORT_PIDFD a été implémenté, ce qui permet d'indiquer pidfd parmi les métadonnées renvoyées. Le pidfd aide à gérer les situations de réutilisation des PID pour une identification plus précise des processus accédant aux fichiers suivis (le pidfd est lié à un processus spécifique et ne change pas, tandis que le PID peut être relié à un autre processus après la fin du processus actuel associé à ce PID).
- L'appel système move_mount() a été étendu pour permettre l'ajout de points de montage dans des groupes partagés existants, ce qui résout les problèmes de sauvegarde et de restauration de l'état des processus dans l'outil CRIU en présence de plusieurs espaces de montage partagés dans des conteneurs isolés.
- Une protection contre les états de concurrence cachés a été ajoutée, pouvant potentiellement conduire à une corruption des fichiers lors de la lecture à partir du cache durant le traitement des trous dans le fichier.
- La prise en charge des verrous obligatoires (mandatory) sur les fichiers, mis en œuvre par des appels système de verrouillage menant à des modifications du fichier, a été interrompue. En raison des états de concurrence potentiels, ces verrouillages étaient considérés comme peu fiables et avaient été déclarés obsolètes il y a plusieurs années.
- Le sous-système LightNVM, qui permettait d'accéder directement au SSD en contournant la couche d'émulation, a été supprimé. LightNVM a perdu son utilité après l'émergence des normes NVMe, qui prévoient la possibilité de zonage (ZNS, Zoned Namespace).
- Mémoire et services système
- Le sous-système DAMON (Data Access MONitor) a été mis en œuvre, permettant de suivre l'activité liée à l'accès aux données en mémoire vive, en lien avec le processus sélectionné s'exécutant dans l'espace utilisateur. Ce sous-système permet d'analyser quelles zones de mémoire le processus a sollicité tout au long de son exécution, et quelles zones de mémoire sont restées inexplorées. Parmi les caractéristiques de DAMON, on note une faible charge sur le CPU, une consommation mémoire modeste, une grande précision et des frais généraux prévisibles et constants, indépendants de la taille. Le sous-système peut être utilisé à la fois par le noyau pour optimiser la gestion de la mémoire et par des utilitaires dans l'espace utilisateur pour comprendre ce que fait le processus et optimiser l'utilisation de la mémoire, par exemple, en libérant de la mémoire superflue pour le système.
- Un appel système process_mrelease a été mis en œuvre, permettant d'accélérer le processus de libération de mémoire des processus qui terminent leur exécution. En conditions normales, la libération des ressources et la fin d'un processus ne se font pas instantanément et peuvent être retardées pour diverses raisons, ce qui gêne le fonctionnement des systèmes de réponse rapide à la pénurie de mémoire dans l'espace utilisateur, tels que oomd (fourni par systemd) et lmkd (utilisé sur Android). Grâce à l'appel process_mrelease, ces systèmes peuvent initier de manière plus prévisible le retour de la mémoire des processus forcés à se terminer.
- Des variantes de primitives pour l'organisation de verrous mutex, ww_mutex, rw_semaphore, spinlock et rwlock, basées sur le sous-système RT-Mutex, ont été transférées de la branche du noyau PREEMPT_RT, qui développe le soutien de l'exécution en temps réel. Des modifications ont été apportées à l'allocation SLUB slab pour améliorer le fonctionnement en mode PREEMPT_RT et réduire son impact sur les interruptions.
- La cgroup a été dotée d'un soutien pour l'attribut de planificateur de tâches SCHED_IDLE, permettant d'attribuer ce caractère à tous les processus d'un groupe, faisant partie d'un cgroup spécifique. Cela signifie que ces processus ne seront lancés que lorsque le système n'a pas d'autres tâches en attente d'exécution. Contrairement à l'installation de l'attribut SCHED_IDLE à chaque processus individuellement, lorsque SCHED_IDLE est lié à un cgroup, le poids relatif des tâches à l'intérieur du groupe est pris en compte lors du choix d'une tâche à exécuter.
- Le mécanisme de comptage de la consommation de mémoire dans la cgroup a été élargi pour permettre le suivi de structures de données supplémentaires du noyau, y compris celles créées pour le polling, le traitement des signaux et les espaces de noms.
- Un soutien a été ajouté pour la planification asymétrique de l'affectation des tâches aux cœurs de processeur sur des architectures où certains CPU peuvent exécuter des tâches 32 bits, tandis que d'autres ne fonctionnent qu'en mode 64 bits (par exemple, ARM). Ce nouveau mode permet, lors de la planification de l'exécution de tâches 32 bits, de ne tenir compte que des CPU qui prennent en charge les tâches 32 bits.
- L'interface d'entrée/sortie asynchrone io_uring prend désormais en charge l'ouverture des fichiers directement dans la table d'index fixed-file, sans utiliser de descripteur de fichier, ce qui permet d'accélérer considérablement certains types d'opérations, mais va à l'encontre du processus traditionnel Unix d'utilisation des descripteurs de fichiers pour ouvrir des fichiers.
Dans io_uring pour la sous-système BIO (Block I/O Layer), un nouveau mécanisme de recyclage ('BIO recycling') a été implémenté, permettant de réduire les frais généraux dans la gestion de la mémoire interne et d'augmenter d'environ 10 % le nombre d'opérations d'entrée/sortie traitées par seconde. io_uring inclut également la prise en charge des appels système mkdirat(), symlinkat() et linkat().
- Pour les programmes BPF, il est désormais possible de demander et de traiter des événements de temporisateur. Un itérateur pour les sockets UNIX a été ajouté, ainsi que la possibilité de récupérer et de définir les options de sockets pour setsockopt. Le BTF dumper prend en charge les types de données typés.
- Sur les systèmes NUMA avec différents types de mémoire différant par leur performance, en cas d'épuisement de l'espace libre, il y a transfert des pages de mémoire évincées depuis la mémoire dynamique (DRAM) vers la mémoire permanente plus lente (Persistent Memory) au lieu de supprimer ces pages. Des tests ont montré que cette tactique améliore généralement les performances sur de tels systèmes. Pour NUMA, il est également possible d'allouer des pages de mémoire pour un processus à partir d'un ensemble sélectionné de nœuds NUMA.
- Pour l'architecture ARC, la prise en charge de tables de pages de mémoire à trois et quatre niveaux a été mise en œuvre, ce qui permettra à l'avenir de prendre en charge des processeurs ARC 64 bits.
- Pour l'architecture s390, il est désormais possible d'appliquer le mécanisme KFENCE pour détecter les erreurs lors de l'utilisation de la mémoire, et la prise en charge du détecteur d'états de course KCSAN a été ajoutée.
- La prise en charge de l'indexation de la liste des messages affichés via printk() a été ajoutée, permettant d'extraire tous ces messages en une seule fois et de suivre les modifications dans l'espace utilisateur.
- Dans mmap(), la prise en charge de l'option VM_DENYWRITE a été interrompue, et le code du noyau a été débarrassé de l'utilisation du mode MAP_DENYWRITE, ce qui a réduit le nombre de situations entraînant un blocage de l'écriture dans un fichier avec l'erreur ETXTBSY.
- Un nouveau type de vérifications, « Event probes », a été ajouté au sous-système de traçage, permettant de les attacher aux événements de traçage existants tout en déterminant son propre format de sortie.
- Lors de la compilation du noyau en utilisant le compilateur Clang, l'assembleur intégré du projet LLVM est désormais utilisé par défaut.
- Dans le cadre du projet visant à éliminer du code du noyau produisant des avertissements du compilateur, une expérimentation a été menée avec l'activation par défaut du mode « -Werror », où les avertissements du compilateur sont traités comme des erreurs. Pendant la préparation de la version 5.15, Linus a commencé à accepter uniquement les modifications ne produisant pas d'avertissements lors de la compilation du noyau et a activé la compilation avec « -Werror », mais a ensuite admis que cette décision était prématurée et a reporté l'activation par défaut de « -Werror ». La gestion de l'activation du drapeau « -Werror » lors de la compilation se fait via le paramètre WERROR, qui est par défaut réglé sur la valeur COMPILE_TEST, c'est-à-dire qu'il n'est activé que pour les compilations de test.
- Virtualisation et sécurité
- Un nouveau gestionnaire dm-ima a été ajouté au Device Mapper (DM) avec la mise en œuvre d'un mécanisme d'attestation à distance basé sur le sous-système IMA (Integrity Measurement Architecture), permettant à un service externe de vérifier l'état des sous-systèmes du noyau afin de s'assurer de leur authenticité. En pratique, dm-ima permet de créer, à l'aide du Device Mapper, des stockages liés à des systèmes cloud externes, dans lesquels la validité de la configuration DM target démarrée est vérifiée à l'aide de l'IMA.
- Une nouvelle option PR_SPEC_L1D_FLUSH a été réalisée dans prctl(), permettant au noyau de vider le contenu du cache de premier niveau (L1D) à chaque changement de contexte lorsqu'elle est activée. Ce mode offre une protection supplémentaire contre les attaques par canaux latéraux pour les processus les plus importants, afin de déterminer les données résiduelles dans le cache en raison des vulnérabilités causées par l'exécution spéculative d'instructions dans le CPU. Le coût de l'activation de PR_SPEC_L1D_FLUSH (non activé par défaut) est une diminution significative des performances.
- La possibilité de compiler le noyau avec l'ajout du drapeau GCC « -fzero-call-used-regs=used-gpr » a été mise en œuvre, garantissant la réinitialisation de tous les registres avant le retour à partir d'une fonction. Cette option permet de se prémunir contre les fuites d'informations des fonctions et de réduire de 20 % le nombre de blocs susceptibles de servir à construire des gadgets ROP (Return-Oriented Programming) dans les exploits.
- La possibilité de compiler des noyaux pour l'architecture ARM64 sous forme de clients pour l'hyperviseur Hyper-V a été mise en œuvre.
- Un nouveau framework pour le développement de pilotes « VDUSE » a été proposé, permettant de réaliser des dispositifs de blocs virtuels dans l'espace utilisateur et d'appliquer Virtio comme moyen d'accès depuis les systèmes invités.
- Un pilote Virtio pour le bus I2C a été ajouté, permettant d'émuler des contrôleurs I2C en mode paravirtualisé en utilisant des backends séparés.
- Un pilote Virtio gpio-virtio a été ajouté, permettant aux systèmes invités d'accéder aux lignes GPIO fournies par le système hôte.
- La possibilité de restreindre l'accès aux pages mémoire pour les pilotes de périphériques prenant en charge le DMA sur des systèmes sans I/O MMU (unité de gestion de mémoire) a été ajoutée.
- Dans l'hyperviseur KVM, la possibilité d'afficher des statistiques sous forme d'histogrammes linéaires et logarithmiques a été mise en œuvre.
- Sous-système réseau
- Le module ksmbd a été ajouté au noyau avec une implémentation de serveur de fichiers utilisant le protocole SMB3. Ce module complète l'implémentation cliente SMB précédemment disponible dans le noyau et, contrairement au serveur SMB fonctionnant dans l'espace utilisateur, il est plus efficace en termes de performances, de consommation de mémoire et d'intégration avec les capacités avancées du noyau. Ksmbd se présente comme une extension à haute performance et prête à être utilisée sur des dispositifs embarqués, pouvant être intégrée avec des outils et des bibliothèques Samba si nécessaire. Parmi les fonctionnalités de ksmbd, on note une meilleure prise en charge de la technologie de mise en cache de fichiers distribuée (baux SMB) sur les systèmes locaux, permettant de réduire considérablement le trafic. À l'avenir, il est prévu d'ajouter la prise en charge de RDMA (« smbdirect ») et des extensions de protocole liées à l'amélioration de la fiabilité du cryptage et de la vérification par signatures numériques.
- Le client CIFS a cessé de prendre en charge NTLM et des algorithmes d'authentification moins sécurisés basés sur l'algorithme DES utilisés dans le protocole SMB1.
- Dans la mise en œuvre des ponts réseau pour VLAN, la prise en charge du multicast a été ajoutée.
- Dans le pilote bonding, utilisé pour l'agrégation des interfaces réseau, la prise en charge du sous-système XDP (eXpress Data Path) a été ajoutée, permettant de manipuler les paquets réseau avant leur traitement par la pile réseau du noyau Linux.
- Dans la pile sans fil mac80211, la prise en charge du 6GHz STA (Special Temporary Authorization) a été mise en œuvre en modes LPI, SP et VLP, ainsi que la possibilité de définir des TWT (Target Wake Time) distincts en mode point d'accès.
- La prise en charge du protocole MCTP (Management Component Transport Protocol), utilisé pour l'interaction entre les contrôleurs de gestion et les dispositifs associés (processeurs hôtes, périphériques, etc.), a été ajoutée.
- L'intégration dans le noyau MPTCP (MultiPath TCP), une extension du protocole TCP pour établir une connexion TCP avec la livraison de paquets simultanément sur plusieurs chemins via différentes interfaces réseau liées à différentes adresses IP, se poursuit. La nouvelle version ajoute la prise en charge des adresses en mode fullmesh.
- Dans netfilter, des gestionnaires de flux réseau encapsulés dans le protocole SRv6 (Segment Routing IPv6) ont été ajoutés.
- La prise en charge de sockmap pour les sockets Unix en flux a été ajoutée.
- Matériel
- Dans le pilote amdgpu, la prise en charge de l'APU Cyan Skillfish (équipé de GPU Navi 1x) a été mise en œuvre. Pour l'APU Yellow Carp, la prise en charge des codecs vidéo a été réalisée. La prise en charge du GPU Aldebaran a été améliorée. De nouveaux identifiants de cartes basées sur le GPU Navi 24 « Beige Goby » et RDNA2 ont été ajoutés. Une amélioration de la mise en œuvre des écrans virtuels (VKMS) a été proposée. La prise en charge du suivi de la température des puces AMD Zen 3 a été réalisée.
- Dans le pilote amdkfd (pour les GPU discrets tels que Polaris), un gestionnaire de mémoire virtuelle partagée (SVM, shared virtual memory) basé sur le sous-système HMM (Heterogeneous memory management) a été mis en œuvre. Cela permet d'utiliser des dispositifs avec leurs propres unités de gestion de la mémoire (MMU, memory management unit), qui peuvent accéder à la mémoire principale. En outre, grâce à HMM, un espace d'adressage partagé entre le GPU et le CPU peut être organisé, où le GPU peut accéder à la mémoire principale du processus.
- Dans le pilote i915 pour les cartes graphiques Intel, l'utilisation du gestionnaire de gestion de la mémoire vidéo TTM a été élargie et la possibilité de gérer la consommation d'énergie basée sur le GuC (Graphics micro Controller) a été incluse. La préparation a commencé pour la mise en œuvre de la prise en charge de la carte graphique Intel ARC Alchemist et du GPU Intel Xe-HP.
- Le pilote nouveau a été mis à jour pour gérer l'éclairage des panneaux eDP via DPCD (DisplayPort Configuration Data).
- Le pilote msm a ajouté le support pour les GPU Adreno 7c Gen 3 et Adreno 680.
- Un pilote IOMMU a été développé pour la puce Apple M1.
- Un pilote audio a été ajouté pour les systèmes basés sur APU AMD Van Gogh.
- La branche staging a ajouté le pilote Realtek R8188EU, qui remplace l'ancienne version du pilote (rtl8188eu) pour les chipsets sans fil Realtek RTL8188EU 802.11 b/g/n.
- Le pilote ocp_pt a été intégré pour la carte PCIe développée par Meta (Facebook), qui met en œuvre de petites horloges atomiques et un récepteur GNSS pouvant être utilisés pour organiser le fonctionnement de systèmes distincts. serveurs de synchronisation de temps exact.
- Ajout du support pour les smartphones Sony Xperia 10II (Snapdragon 665), Xiaomi Redmi 2 (Snapdragon MSM8916), Samsung Galaxy S3 (Snapdragon MSM8226), Samsung Gavini/Codina/Kyle.
- Ajout du support pour les SoC ARM et les cartes NVIDIA Jetson TX2 NX Developer Kit, Sancloud BBE Lite, PicoITX, DRC02, SolidRun SolidSense, SKOV i.MX6, Nitrogen8, Traverse Ten64, GW7902, Microchip SAMA7, Qualcomm Snapdragon SDM636/SM8150, Renesas R-Car H3e-2G/M3e-2G, Marvell CN913x, ASpeed AST2600 (cartes serveur Facebook Cloudripper, Elbert et Fuji), 4KOpen STiH418-b2264.
- Ajout du support pour les panneaux LCD Gopher 2b, EDT ETM0350G0DH6/ETMV570G2DHU, LOGIC Technologies LTTD800480070-L6WH-RT, Multi-Innotechnology MI1010AIT-1CP1, Innolux EJ030NA 3.0, ilitek ili9341, E Ink VB3300-KCA, Samsung ATNA33XC20, Samsung DB7430, WideChips WS2401.
- Ajout du pilote LiteETH qui prend en charge les contrôleurs Ethernet utilisés dans les SoC logiciels LiteX (pour FPGA).
- Le pilote usb-audio a ajouté l'option lowlatency pour gérer l'activation du mode de latence minimale. L'option quirk_flags a également été ajoutée pour transmettre les paramètres spécifiques à l'appareil.
Parallèlement, la Fondation pour le logiciel libre d'Amérique latine a élaboré une version entièrement libre du noyau 5.15 — Linux-libre 5.15-gnu, débarrassée des éléments de micrologiciels et des pilotes contenant des composants ou des morceaux de code non libres, dont l'utilisation est limitée par le fabricant. Dans cette nouvelle version, un message est enregistré dans les journaux à l'issue du nettoyage. Des problèmes rencontrés lors de la création de paquets avec mkspec ont été résolus, et le support des paquets snap a été amélioré. Certains avertissements affichés lors du traitement du fichier d'en-tête firmware.h ont été supprimés. Certains types d'avertissements («format-extra-args», commentaires, fonctions et variables non utilisées) peuvent maintenant être affichés lors de la compilation en mode «-Werror». Le nettoyage du pilote gehc-achc a été ajouté. Le code de nettoyage des blobs dans les pilotes et sous-systèmes adreno, btusb, btintel, brcmfmac, aarch64 qcom a été mis à jour. Le nettoyage des pilotes prism54 (supprimé) et rtl8188eu (remplacé par r8188eu) a été arrêté.
Source : opennet.ru
