URL: https://linuxfr.org/news/systemd-versions-212-a-215 Title: systemd versions 212 à 215 Authors: ariasuni esdeem, Davy Defaud, BAud, Nils Ratusznik, palm123, ZeroHeure, Benoît Sibaud, Cyril Brulebois, Pierre Roc, Misc, Nÿco, sanao et PolePosition Date: 2014年04月10日T00:37:18+02:00 License: CC By-SA Tags: systemd, lennart_poettering et uuid Score: 60 _systemd_ est un système de démarrage alternatif au démon _init_ d’UNIX System V spécifiquement conçu pour le noyau Linux, avec une meilleure gestion des dépendances entre services et le chargement en parallèle des services au démarrage. Il est publié sous licence GNU LGPL version 2.11. Voici une version traduite, réarrangée et non exhaustive des notes de version de _systemd_ des versions 212 à 215. En bref, on ajoute un peu de sucre autour ! Vous pouvez même sauter ce qui ne vous intéresse pas.  _N. D. M. : cette dépêche est un énorme travail d’[_eggman_](http://linuxfr.org/users/eggman) et de [_sinma_](http://linuxfr.org/users/sinma) qui méritent tous les deux des gros remerciements._ ---- [systemd version 212](http://lists.freedesktop.org/archives/systemd-devel/2014-March/018232.html) [systemd version 213](http://lists.freedesktop.org/archives/systemd-devel/2014-May/019537.html) [systemd version 214](http://lists.freedesktop.org/archives/systemd-devel/2014-June/019925.html) [systemd version 215](http://lists.freedesktop.org/archives/systemd-devel/2014-July/020903.html) ---- # Version 212 ## Divers _systemd_ gère désormais un état global du système qui prend la valeur _starting_ (en cours de démarrage), _running_ (en fonctionnement), _degraded_ (dégradé, c’est‐à‐dire au moins un service en échec), _maintenance_ (mode de restauration ou d’urgence) ou _stopping_ (en train de s’arrêter), que l’on peut consulter avec `systemctl status` (sans donner de paramètre). Il est notamment utile lorsqu’on manipule beaucoup de systèmes ou de conteneurs à la fois. Et puis, enfin, un changement visible par l’utilisateur lambda ! Afin d’éviter que celui‐ci se retrouve avec un écran noir au démarrage, _systemd_ évite le réglage le plus sombre et reste au‐dessus des 5 % les plus sombres lors de la restauration de la luminosité. Côté fonctionnement interne, _logind_ détruit maintenant automatiquement les objets d’IPC (*InterProcess Communication*, communication interprocessus) appartenant à un utilisateur quand il se déconnecte complètement, pour libérer des ressources. Cela inclut sémaphores, files de messages et mémoires SysV, ainsi que les files de messages et mémoires partagées POSIX. Les objets SysV et POSIX n’ont traditionnellement pas de cycle de vie, cette fonctionnalité corrige cela. ## Outils en ligne de commande Une nouvelle commande `list-machines` a été ajoutée à `systemctl`. Elle liste tous les systèmes d’exploitation dans un conteneur ainsi que leurs états (voir le point ci‐dessus), si _systemd_ est utilisé dans ces conteneurs. `systemctl` a également été enrichi d’une option `-r` pour énumérer récursivement les unités de tous les conteneurs locaux, quand il est utilisé avec la commande `list-units` (c’est l’action par défaut quand aucun paramètre n’est donné). On notera aussi que `machinectl` bénéficie d’une nouvelle commande `poweroff` pour éteindre proprement un conteneur local. ## Journal _journald_ peut transférer les messages de journal sur les pseudo‐terminaux de tous les utilisateurs connectés (équivalent de la commande `wall`). C’est désormais la configuration par défaut pour tous les messages d’urgence. Le nouvel outil `systemd-journal-remote` permet de diffuser à la volée les flux des journaux _journald_ sur le réseau. ## Unités Les unités minuteur (_timer units_) ont gagné deux nouvelles options : * `WakeSystem=` : si activée, les unités minuteur configurées de cette façon provoqueront la sortie de veille prolongée (si le système le prend en charge, ce qui est majoritairement le cas de nos jours) ; * `Persistent=` : si activée, sauvegarde sur le disque la dernière fois que l’unité a été activée. Cette information permet au redémarrage suivant d’activer les évènements qui auraient dû avoir lieu pendant que le système était éteint (comportement analogue à anacron). La commande `list-timers` de `systemctl` a été mise à jour pour afficher cette nouvelle information. ## Réseau Les adresses physiques des interfaces (adresses MAC) créées avec l’option `--network-interface=` de la commande `nspawn` sont générées à partir du nom de la machine, ce qui les rend stables entre plusieurs invocations du conteneur. _systemd-networkd_ alloue désormais des adresses prédictibles en cas d’auto‐configuration avec IPv4LL (IPv4 link-local, une technique qui permet d’assigner une adresse IP automatiquement dans le réseau spécial 169.254.0.0/16, quand il n’y a pas de serveur DHCP). ## Découverte automatique des partitions GPT Le mécanisme de découverte automatique des partitions GPT prend désormais en compte deux indicateurs (*flags*) sur une partition GPT : l’un provoque son montage en lecture seule et l’autre indique que la partition doit être ignorée pendant la phase de découverte automatique. Deux nouveaux types d’identifiant universel unique (UUID) pour GPT ont été ajoutés à la découverte automatique de partitions, pour les architectures ARM 32 et 64 bits. Ça n’est pas particulièrement utile pour découvrir le répertoire racine pendant un démarrage _bare‐metal_ (on n’y voit pas souvent d’UEFI), mais c’est quand même très utile pour autoriser le démarrage de disques dans _nspawn_ avec l’option `-i`. ## Sécurité Le répertoire `/sys/fs/cgroup/` est maintenant monté en lecture seule après que tous les arbres de contrôleurs y sont montés. Notez que les répertoires montés dans une sous‐arborescence ne sont pas en lecture seule. Cette mesure de sécurité est particulièrement utile car la _glibc_ effectue une recherche pour prendre tous les pseudo‐systèmes de fichiers _tmpfs_ qu’elle peut trouver pour implémenter [`shm_open()`](http://linux.die.net/man/3/shm_open) si `/dev/shm` n’est pas disponible (ce qui peut très bien être le cas dans un espace de noms donné). Les options `PrivateDevices=`, `PrivateNetwork=` et `PrivateTmp=` sont maintenant utilisées sur tous les services tournant pendant une longue période (quand c’est approprié). En outre, l’option `PrivateDevices=` est plus sécurisée (elle ne nécessite plus la capacité `CAP_MKNOD` et l’ensemble des capacités liées, et implique `DevicePolicy=closed`). Désormais, la gestion de _kdbus_ prend en charge la politique de téléchargement dans le noyau. `sd-bus` peut désormais créer des connexions de surveillance (_monitoring_) qui peuvent espionner toutes les communications de bus pour déboguer. ### udev dans un espace de noms de montage séparé _systemd-udevd_ va maintenant fonctionner dans un espace de noms de montage séparé. Pour bien comprendre, quelques explications s’imposent. _udev_ est un programme qui permet à l’ordinateur d’effectuer automatiquement certaines actions en fonction d’évènements liés au matériel (par exemple, monter automatiquement une clef USB lorsqu’elle est branchée à l’ordinateur). Les actions à effectuer sont déterminées grâce à des règles _udev_ (des fichiers `.rules` habituellement fournis par la distribution, bien qu’il soit possible de les créer soi‐même). Or, ces règles permettent d’activer un programme ou un script arbitraire, via une ligne du type `RUN+="mon_executable"`. Pour monter une clef USB, on fera appel au programme `mount`, par exemple. Les espaces de noms de montage permettent de montrer une organisation du système différente (points de montage différents, ou passage de certains montages en lecture seule) pour certains processus. C’est notamment utile pour sécuriser les conteneurs. Depuis quelques versions, [il est recommandé](http://blog.fraggod.net/2012/06/16/proper-ish-way-to-start-long-running-systemd-service-on-udev-event-device-hotplug.html) de passer par l’activation d’un service _systemd_ au lieu de l’utilisation de `mount` ; ça sera désormais obligatoire pour monter un périphérique. On utilisera donc : `ENV{SYSTEMD_WANTS}="systemd_unit.service"`. ## Amélioration du code La prise en charge native de _tcpwrap_ dans _systemd_ a été supprimée. C’était du vieux code plus vraiment maintenu et qui avait de sérieux défauts. De meilleures alternatives existent, telles que les pare‐feux. Pour les configurations qui nécessitent l’utilisation de _tcpwrap_, veuillez envisager d’invoquer votre service activé par _socket_ via _tcpd_, comme avec le traditionnel _inetd_. # Version 213 ## Outils en ligne de commande Concernant `systemctl`, les commandes `systemctl list-timers` et `systemctl list-sockets` disposent maintenant de l’option `--recursive` qui permet de lister les unités du type donné dans tous les conteneurs locaux, à l’instar de `systemctl list-units`. Désormais, le générateur de graphe du démarrage (pour rappel : `systemd-analyze plot`) peut inclure les informations [_cgroups_](http://fr.wikipedia.org/wiki/Cgroups "control groups"). Le (petit) démon `systemd-hostnamed` a été mis à jour pour exposer le nom du noyau, sa variante et sa version sur le bus. C’est utile lorsque l’on exécute des commandes telles que `hostnamectl` avec l’option `-H`. `systemd-analyze` se sert de cette option pour afficher correctement les détails du système, lorsque l’exécution est distante. Enfin, `machined` dispose d’une nouvelle interface de programmation (API) pour interroger les adresses IP des conteneurs enregistrés. `machinectl status` a été mis à jour pour afficher ces adresses dans sa sortie. ## Unités Cette fois, les unités de type service ont gagné beaucoup d’options pour permettre un contrôle beaucoup plus fin du comportement et des limitations de celles‐ci : - `RebootArgument=` peut être utilisé pour définir un argument de redémarrage pour le noyau, à utiliser si l’on déclenche un redémarrage avec `StartLimitAction=` ; - `FailureAction=` peut être utilisé pour définir une opération à déclencher quand un service échoue : ce paramètre fonctionne de façon similaire à `StartLimitAction=`, mais, contrairement à celui‐ci, il vérifie ce qui est effectué immédiatement, plutôt qu’après plusieurs essais de redémarrage du service ; * si `CPUQuota=` est activé, le service ne pourra jamais obtenir plus de temps processeur que le pourcentage indiqué, même si la machine est inoccupée ; - `StartupCPUShares=` et `StartupBlockIOWeight=` fonctionnent de façon similaire à `CPUShares=` et `BlockIOWeight=`, mais s’appliquent uniquement au démarrage du système ; ces deux options sont utiles pour assigner des priorités différentes à certains services pendant le démarrage et pendant l’exécution normale. Dorénavant, l’analyseur de fichiers de configuration (.ini) ignorera les sections qui commencent par `X-`. Elles peuvent être utilisées pour maintenir des sections spécifiques à certaines applications dans les fichiers unités. ## Réseau Cette nouvelle version accueille un nouveau démon : `systemd-timesyncd`. C’est un client [SNTP](https://fr.wikipedia.org/wiki/Simple_network_time_protocol#SNTP). Contrairement à un client NTP, il s’occupe simplement d’interroger un serveur distant et de mettre à jour l’heure de la machine (il est uniquement client, et non serveur). `systemd-timesyncd` tourne avec des privilèges minimaux et n’agit que lorsqu’une connexion Internet est disponible. Il peut corriger l’heure tôt dans le processus de démarrage, ce qui est utile pour les systèmes comme le Raspberry _Pi_ et d’autres appareils embarqués qui n’ont pas d’horloge temps réel. `systemd-networkd` gère maintenant les [tunnels IPIP](http://lartc.org/howto/lartc.tunnel.ip-ip.html) et SIT, et se dote d’un nouveau compagnon, le démon minimal `systemd-resolved`. Il agit pour le moment comme simple compagnon à `systemd-networkd` et gère le `resolv.conf` en se basant sur la configuration DNS par interface, potentiellement obtenue via DHCP. À long terme, nous espérons l’étendre à la gestion d’un cache DNS gérant DNSSEC et mDNS. Petite subtilité, `systemd-networkd-wait-online` est dorénavant activé par défaut. Il retarde `network-online.target` jusqu’à ce qu’une interface réseau ait été configurée. Cet outil est conçu pour fonctionner avant tout avec `networkd`, mais fera son possible pour donner du sens à une configuration réseau effectuée par d’autres moyens. Autre subtilité, `hostnamed` a été modifié pour préférer le nom d’hôte configuré statiquement dans `/etc/hostname` à celui éventuellement fourni par DHCP. Cela correspond mieux au fonctionnement global de `/etc`, où la configuration de l’administrateur prévaut sur n’importe quelle autre. ## Autre La nouvelle option du noyau `fsck.repair=` contrôle comment `fsck` doit se comporter avec un système de fichiers incohérent au démarrage. # Version 214 Voilà la version 214 ! Truffée de nouvelles fonctionnalités et d’améliorations dans tous les domaines, en particulier en sécurité (service de bac à sable _— sandboxing —_ de systèmes de fichiers, diminution des privilèges de nos démons), en réseau (trois nouveaux types d’interfaces sont dorénavant pris en charge par `networkd`) et dans les unités _socket_ (quatre nouveaux réglages). Le changement que je trouve le plus excitant : un premier pas dans la direction d’un système sans état. Dorénavant, `/var` est reconstruit s’il est vide au démarrage. Ma nouvelle commande favorite faisant appel à ça est la suivante : `systemd-nspawn -D /srv/mycontainer --read-only --tmpfs=/var -b`. Elle engendre un conteneur `nspawn` avec une arborescence montée en lecture seule et un dossier `/var` volatile et vide, monté par dessus et vidé lorsque l’on arrête le conteneur. Avec ces éléments en place, on peut facilement lancer des centaines d’instances de conteneurs _ad hoc_ jetables depuis la même arborescence, en étant sûr qu’elles se terminent sans interférer les unes avec les autres. Prochaine étape (planifiée pour la prochaine version) : ajouter l’infrastructure pour gérer également le démarrage avec `/etc` vide (c’est‐à‐dire, avec une racine en `tmpfs` et seulement un `/usr` monté depuis l’arborescence d’une distribution en lecture seule). ## Outils en ligne de commande ## Unités Les unités _sockets_ ont gagné beaucoup d’options : * `SocketUser=` et `SocketGroup=` : indiquent le propriétaire et le groupe à utiliser pour les _sockets_ AF_UNIX et les files d’attente [FIFO](http://fr.wikipedia.org/wiki/First_in,_first_out "First In, First Out") sur le système de fichiers ; * `RemoveOnStop=` : si activé, tous les FIFO et les _sockets_ sur le système de fichiers seront retirés quand l’unité correspondante est arrêtée ; * `Symlinks=` : prend une liste de liens symboliques à créer (sur le système de fichiers) des _sockets_ système ou des FIFO créés par les _sockets_ UNIX correspondants. Cette option est utile pour gérer les liens symboliques vers des fichiers _sockets_ ayant le même cycle de vie que le _socket_ lui‐même. Concernant les unités de services, on gagne deux nouvelles options : `ProtectedHome=` et `ProtectedSystem=`. Elles rendent les données utilisateur (comme `/home`) inaccessibles ou en lecture seule, et le système (comme `/usr`) en lecture seule pour des services particuliers. Cela nous permet d’avoir un système de bac à sable très léger. Ces options ont été activées pour tous les services tournant pendant une longue période, quand c’est approprié. De plus, l’effet de plusieurs paramètres pour les services a changé : - L’option `on-abnormal` a été ajoutée à `Restart=`. Si elle est définie, elle aura pour effet de déclencher des redémarrages automatiques pour toute raison « anormale » de fin d’un processus, ce qui inclut signaux d’erreur, vidanges mémoires, expirations de délai et expirations de délai de chien de garde (_watchdog_), mais exclut les codes de sortie propres ou non, ainsi que les signaux propres. `Restart=on-abnormal` est une alternative à `Restart=on-failure` pour les services qui doivent pouvoir s’arrêter et ne pas redémarrer lors de certaines erreurs en le signalant par un code de sortie d’erreur adéquat. `Restart=on-failure` ou `Restart=on-abnormal` est maintenant le réglage par défaut recommandé pour tous les services tournant pendant une longue période. - Si le réglage de l’option `InaccessibleDirectories=` pointe vers un point de montage (ou si le répertoire pointé contient lui‐même un point de montage), _systemd_ essaiera de démonter totalement l’arborescence pour rendre les systèmes de fichiers vraiment indisponibles pour le service concerné. - Le réglage `ReadOnlyDirectories=` et le paramètre `--read-only` de _systemd-nspawn_ sont dorénavant aussi appliqués de façon récursive à tous les sous‐points de montage. Enfin, deux autres changements concernant les unités : - le _socket_ `/dev/log` et la FIFO `/dev/initctl` ont été déplacés vers `/run` et ont été remplacés par des liens symboliques. Cette modification permet de se connecter à elles même si `PrivateDevices=yes` est utilisé pour un service — ce qui rend `/dev/log` inatteignable mais laisse `/run` accessible. Cette option a l’avantage de s’assurer que `/dev` contient uniquement des périphériques, des répertoires, des liens symboliques et rien d’autre ; - une nouvelle unité cible (*target*) a été ajoutée : `network-pre.target`. Elle est utile pour les services qui doivent être exécutés avant que le réseau ne soit configuré, par exemple les scripts de pare‐feu. ## Réseau `systemd-networkd`, `systemd-resolved` et `systemd-bus-proxyd` tournent maintenant sous leurs propres utilisateurs homonymes. Ils ne conservent que quelques capacités, mais ne peuvent cependant plus écrire dans des fichiers appartenant au super utilisateur _root_. `systemd-networkd` gère maintenant la mise en place de périphériques Ethernet virtuels `veth` pour la connectivité des conteneurs, ainsi que les tunnels GRE et VTI. Le fichier `resolv.conf` généré par `systemd-resolved` a été déplacé dans `/run/systemd/resolve/`. Si avez un lien symbolique depuis `/etc/resolv.conf`, il faudra peut‐être le corriger. ## Amélioration du code La dépendance à _libattr_ a été éliminée. Les appels pour les attributs étendus ont depuis longtemps été déplacés dans la _glibc_, rendant _libattr_ inutile. La prise en charge des scripts _init_ SysV et LSB a été supprimée du démon _systemd_ lui‐même. À la place, un générateur crée des unités _systemd_ natives lorsque nécessaire. Cela a permis de supprimer une portion non négligeable de code de compatibilité de « PID 1 », suivant ainsi les distributions, qui aujourd’hui ne livrent qu’un tout petit nombre de scripts _init_ LSB ou SysV. ## Virtualisation Deux changements concernant la virtualisation : * la détection de la virtualisation fonctionne maintenant sans privilèges. `systemd-detect-virt` ne nécessite donc plus la capacité `CAP_SYS_PTRACE` et nos démons peuvent ainsi fonctionner avec moins de privilèges ; * les domaines privilégiés Xen (_dom0_) ne sont plus considérés comme de la virtualisation par la logique de détection de virtualisation. Après tout, ils ont en général un accès total au matériel et sont d’ordinaire utilisés pour gérer des domaines non privilégiés (_domU_). ## Autres À titre de fonctionnalité expérimentale, `udev` essaie désormais de verrouiller un périphérique disque lorsqu’il exécute des évènements pour ce disque ou l’une de ses partitions. Des applications telles que les programmes de partitionnement de disque peuvent verrouiller le disque et réclamer temporairement la propriété du périphérique de cette façon et `udev` ignorera complètement tous les évènements pour ce disque ou cette partition. Si le disque a été ouvert en écriture, la fermeture déclenchera une analyse de la table de partition. Ce comportement est dorénavant activé par défaut ; s’il s’avère qu’il cause d’importants problèmes, nous pourrions l’activer uniquement pour quelques périphériques particuliers ou le désactiver complètement. Ce comportement ne prend pas en compte les périphériques virtuels (*device-mapper*). Des unités `mount` temporaires peuvent maintenant être créées par les interfaces de programmation (API) du bus. Un bout de code `tmpfiles` pour recréer la structure la plus élémentaire de `/var` est maintenant disponible. Il est suffisant pour créer le lien symbolique `/var/run` → `/run` et créer une série de répertoires structurels. Ça permet au système de démarrer avec un `/var` vide ou volatile. Évidemment, si grâce à ce changement le système d’exploitation de base est dorénavant capable de faire face à un `/var` volatile, tous les services utilisateurs n’y sont pas encore prêts. Cependant, nous espérons que tôt ou tard, de nombreux démons de services seront modifiés en amont, de façon à créer automatiquement au démarrage les répertoires nécessaires dans `/var`, s’ils devaient manquer. Il s’agit d’un premier pas vers un système sans état qui nécessite uniquement une image de la distribution sur `/usr` pour démarrer. `systemd-nspawn` dispose désormais d’une nouvelle option `--tmpfs=` pour monter une instance `tmpfs` vide sur un répertoire particulier. C’est particulièrement utile pour la reconstruction automatique de `/var` (voir ci‐dessus), en passant `--tmpfs=/var`. Le groupe _floppy_ [N. D. T. : disquette] qui possédait les périphériques `/dev/fd*` n’est plus utilisé. Le groupe _disk_ est utilisé à la place. Les distributions devraient probablement déconseiller l’utilisation de ce groupe. # Version 215 Beaucoup de travail pour rendre fonctionnels la remise aux paramètres d’usine, les systèmes sans état et les mises à jour hors‐ligne. Beaucoup de travail autour de `networkd` (serveur DHCP 4 !), enfin `coredumpctl` est maintenant _vraiment_ utile. ## Outils en ligne de commande Cette fois‐ci, deux nouvelles commandes : * `systemctl is-system-running` : permet de vérifier l’état général du système, par exemple s’il a fini de démarrer et est pleinement opérationnel ; * la nouvelle page `man file-hierarchy(7)` contient une version raccourcie et modernisée de l’organisation du système de fichiers attendue par _systemd_, semblable à la spécification FHS ou la page de man `hier(5)`. Le nouvel outil `systemd-path(1)` a été ajouté pour afficher plusieurs de ces chemins concernant la machine locale et l’utilisateur local. Par exemple, `systemd-path` retourne chez moi : ``` temporary: /tmp temporary-large: /var/tmp system-binaries: /usr/bin system-include: /usr/include system-library-private: /usr/lib system-library-arch: /usr/lib system-shared: /usr/share system-configuration-factory: /usr/share/factory/etc system-state-factory: /usr/share/factory/var system-configuration: /etc system-runtime: /run system-runtime-logs: /run/log system-state-private: /var/lib system-state-logs: /var/log system-state-cache: /var/cache system-state-spool: /var/spool user-binaries: /home/sinma/.local/bin user-library-private: /home/sinma/.local/lib user-library-arch: /home/sinma/.local/lib/x86_64-linux-gnu user-shared: /home/sinma/.local/share user-configuration: /home/sinma/.config user-runtime: /run/user/1000 user-state-cache: /home/sinma/.cache user: /home/sinma user-documents: /home/sinma/documents/ user-music: /home/sinma/musique/ user-pictures: /home/sinma/images/ user-videos: /home/sinma/vidéos/ user-download: /home/sinma/téléchargements/ user-public: /home/sinma/ user-templates: /home/sinma/modèles user-desktop: /home/sinma/ search-binaries: /usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/sinma/.cabal/bin search-library-private: /home/sinma/.local/lib:/usr/local/lib:/usr/lib search-library-arch: /home/sinma/.local/lib/x86_64-linux-gnu:/usr/lib search-shared: /home/sinma/.local/share:/usr/share:/usr/share:/usr/local/share search-configuration-factory: /usr/local/share/factory/etc:/usr/share/factory/etc search-state-factory: /usr/local/share/factory/var:/usr/share/factory/var search-configuration: /home/sinma/.config:/etc ``` Et deux mises à jour : * `machined` a été mis à jour pour exporter la version du système d’exploitation d’un conteneur (lue depuis `/etc/os-release/` et `/usr/lib/os-release`) ; cette information est disponible via `machinectl status` ; - l’option `-H` de `systemctl` (permettant de se connecter à une machine distante exécutant _systemd_) a été étendue pour pouvoir se connecter à un conteneur spécifique de l’hôte. Par exemple, `systemctl -H root at foobar:waldi` permet de se connecter en tant que super utilisateur _root_ de la machine _foobar_ directement au conteneur_waldi_. Notez que, pour l’instant, il faut s’authentifier en tant que super utilisateur _root_ pour que ça marche, puisqu’entrer dans un conteneur est une opération privilégiée. ## systemd-coredump [`systemd-coredump`](http://www.freedesktop.org/software/systemd/man/systemd-coredump.html) est l’outil qui gère les vidanges mémoires (*core dumps*), c’est‐à‐dire le contenu de la mémoire du programme avant son plantage. Le comportement de `systemd-coredump` a pas mal changé : il génère dorénavant automatiquement une trace d’appel enregistrée dans le journal pour toutes les vidanges système (grâce à la bibliothèque _libdw_ des _elfutils_). De plus, il enregistre maintenant les vidanges système directement sur le disque (sous `/var/lib/systemd/coredump`, si possible dans un format compressé), au lieu de les enregistrer dans le journal. Un nouveau fichier de configuration `/etc/systemd/coredump.conf` a été ajouté pour configurer les autres paramètres de `systemd-coredump`. On utilise la commande `coredumpctl` pour consulter les informations collectées par `systemd-coredump`. Elle a été enrichie de deux nouvelles options : `info`, pour afficher les détails de la vidange système choisie, et `-1`, pour afficher uniquement les informations de la plus récente vidange au lieu de l’ensemble des entrées. En outre, vu que l’outil est utile de façon générale, le préfixe `systemd-` lui a été retiré. Les distributions qui veulent maintenir la compatibilité avec l’ancien nom devraient ajouter un lien symbolique de l’ancien nom vers le nouveau. Pour finir, l’option `SplitMode=` de _journald_ est maintenant `uid` par défaut. Cela signifie que les utilisateurs non privilégiés peuvent accéder à leurs propres _coredumps_ avec `coredumpctl`, sans restrictions. ## Unités Trois nouveaux paramètres pour les unités services : 1. `RestartForceExitStatus=` : si configuré avec une série de signaux de sortie ou de valeurs de retour de processus, le service sera relancé si le processus du démon principal se termine avec l’un d’entre eux (quelle que soit l’option `Restart=`) ; 2. dans la section `[Install]`, `DefaultInstance=` : pour définir l’instance par défaut à démarrer, si une unité modèle est activée sans instance spécifiée (normalement on a `service@instance` — par exemple, `dhcpcd@[interface]` ou `openvpn@[nom_configuration_VPN]` —, mais on peut avoir `service` sans `@instance`) ; 3. `ConditionNeedsUpdate=` : démarre seulement les unités lorsque `/etc` ou `/var` sont plus « anciens » que les ressources de la distribution installée dans `/usr`. Elle est utile pour reconstruire ou mettre à jour `/etc` au redémarrage après une mise à jour hors‐ligne du répertoire `/usr` ou une remise aux paramètres d’usine. Les services qui veulent démarrer une seule fois après une mise à jour ou une remise à zéro devraient utiliser cette condition et se lancer eux‐même avant le nouveau `systemd-update-done.service`, qui marquera les deux répertoires comme totalement à jour. Un certain nombre de fichiers de services utilisant cette modification ont été ajoutés pour reconstruire la base de données matérielle de _udev_, le catalogue de messages de _journald_ et le cache du chargeur de bibliothèques dynamiques (_ldconfig_). L’outil `systemd-sysusers` décrit plus haut fait déjà usage de cette nouveauté. Avec ces éléments en place, il est possible de démarrer proprement un système d’exploitation minimal avec un répertoire `/etc` vide. Pour plus d’informations sur le sujet, voir [ce récent journal de Lennart](http://0pointer.de/blog/projects/stateless.html). Il y a aussi une nouvelle option pour les unités `.mount`, `SloppyOptions=`. Si elle est activée, cette dernière utilise l’option `-s` de `mount(8)` (traitement permissif des options de montage inconnues). De plus, la nouvelle cible `cryptsetup-pre.target` peut être utilisée par les services qui doivent s’exécuter et se terminer avant que le premier conteneur chiffré LUKS ne soit configuré. ## Réseau Trois changements concernant `systemd-network` : 1. prise en charge d’un serveur DHCPv4 minimal (en plus de l’actuel client DHCPv4), des clients DHCPv6 et des sollicitations client de routeur IPv6. Le client DHCPv4 gère désormais les routes statiques données par le serveur. Notez que la section `[DHCPv4]` des anciennes versions de `systemd-networkd` a été renommée en `[DHCP]` et qu’elle est également utilisée par le client DHCPv6. Les fichiers `.network` utilisant les paramètres de cette section devraient être mis à jour, bien que la compatibilité soit maintenue. En option, le nom d’hôte du client peut maintenant être envoyé au serveur DHCP ; 2. gestion des réseaux virtuels [VXLAN](http://en.wikipedia.org/wiki/Virtual_Extensible_LAN "Virtual eXtensible Local Area Network"), ainsi que [TUN/TAP](http://en.wikipedia.org/wiki/TUN/TAP) et les périphériques factices ; 3. allocation automatique de plages d’adresses pour les interfaces en utilisant groupe de d’adresses (_pool_) pour tout le système. C’est utile pour la gestion dynamique de nombreuses interfaces depuis un fichier de configuration pour un seul réseau, en particulier pour assigner des adresses IP correctes aux liens `veth` de nombreuses instances de `nspawn`. Enfin, les noms d’interfaces réseau prédictibles de _udev_ font désormais usage de l’attribut `dev_port` de _sysfs_, introduit dans Linux 3.15, à la place de `dev_id` : cela permet de distinguer les ports des mêmes fonctions PCI. `dev_id` devrait être utilisé uniquement pour les ports utilisant la même adresse matérielle, d’où la nécessité de `dev_port`. ## Remise du système aux paramètres d’usine Le nouvel outil `systemd-sysusers` est capable de créer les utilisateurs et groupes du système dans `/etc/passwd` et `/etc/group` en se basant sur les définitions des utilisateurs et groupes déclarés statiquement dans `/usr/lib/sysusers.d/`. C’est utile pour réinitialiser un système aux paramètres d’usine et pour les systèmes volatiles qui démarrent avec un répertoire `/etc` vide, et qui nécessitent les utilisateurs et groupes du système tôt dans le processus de démarrage. _systemd_ fournit deux fichiers dans `sysusers.d/` par défaut pour les utilisateurs et groupes indispensables à _systemd_ et au cœur du système d’exploitation. Un nouveau bout de code `tmpfiles` a été ajouté pour reconstruire les fichiers essentiels dans `/etc` au démarrage, s’ils sont manquants. Une directive pour s’assurer du nettoyage automatique de `/var/cache/man/` a été supprimée de la configuration par défaut. Cette instruction devrait dorénavant être fournie par l’implémentation de _man_. Les modifications nécessaires ont été apportées à l’implémentation de _man‐db_. Notez que vous devez mettre à jour votre implémentation de _man_ vers une version qui fournit cette instruction, sans quoi le nettoyage automatique de `/var/cache/man` n’aura pas lieu. Le fichier `/etc/os-release` doit maintenant être déplacé vers `/usr/lib/os-release` (un lien symbolique de l’ancien chemin au nouveau est automatiquement créé). `/usr/lib` est plus approprié pour accueillir ce fichier car il décrit le système fourni dans `/usr`, et pas la configuration stockée dans `/etc`. `tmpfiles` gère désormais une nouvelle directive `L+` qui crée un lien symbolique, mais, contrairement à `L`, elle efface d’abord le fichier pré‐existant, le cas échéant, ou si le lien symbolique ne pointait pas au bon endroit. De façon similaire, des directives `b+`, `c+` et `p+` ont été ajoutées, pour créer des périphériques blocs, caractères, ainsi que des files d’attente FIFO dans le système de fichiers, supprimant éventuellement n’importe quel fichier de type différent. Pour les directives `L`, `L+`, `C` et `C+` des `tmpfiles`, le dernier champ `argument`, utilisé jusque‐là pour spécifier la source du lien symbolique ou de la copie, est maintenant optionnel. S’il est omis, le même fichier est copié depuis `/usr/share/factory/` et suffixé du chemin de destination. C’est utile pour peupler le répertoire `/etc` de fichiers essentiels, en les copiant depuis les réglages de la distribution fournis dans `/usr/share/factory/etc`. Une nouvelle commande `systemctl preset-all` permet de remettre les paramètres de toutes les unités de service à leurs valeurs par défaut. Une nouvelle option `--preset-mode=` a de même été ajoutée pour contrôler si seules les opérations activées ou désactivées doivent être exécutées. Lorsque le système démarre avec un répertoire `/etc` vide, l’équivalent de `systemctl preset-all` est exécuté tôt au démarrage pour s’assurer que tous les services par défaut sont activés après une réinitialisation aux paramètres d’usine. ## Sécurité `systemd-nspawn` filtrera dorénavant par défaut une série d’appels système pour les conteneurs, parmi lesquels, ceux requis pour charger les modules noyau, les accès directs aux ports d’entrée‐sortie x86, le contrôle du fichier d’échange (_swap_) et `kexec`. Mais surtout, `open_by_handle_at()` est dorénavant interdit aux conteneurs, fermant ainsi une faille similaire à celle de [Docker](http://fr.wikipedia.org/wiki/Docker_%28Syst%C3%A8me_de_conteneur_Linux%29) récemment débattue, à propos de l’accès aux fichiers sur les arborescences auxquelles les conteneurs ne devraient pas avoir accès. Notez que nous ne garantissons par la sécurité de `nspawn` (ceci est explicitement documenté dans le manuel). Il s’agit donc juste de la solution à l’un des problèmes les plus évidents. ## Autres Le groupe _input_ a été ajouté et tous les nœuds de périphériques d’entrée sont assignés à ce groupe. C’est utile pour les logiciels système qui veulent avoir accès aux périphériques d’entrée. Cela complète ce qui a déjà été fait pour les groupes _audio_ et _video_. Les nœuds de périphériques `/dev/loop-control` et `/dev/btrfs-control` appartiennent désormais au groupe _disk_ par défaut. De nouvelles options pour la ligne de commande du noyau ont été ajoutées : `systemd.wants=` (pour ajouter des unités additionnelles pendant le démarrage), `systemd.mask=` (pour masquer des unités particulières au démarrage) et `systemd.debug-shell` (pour activer le _shell_ de débogage sur `tty9`). Le nettoyage périodique automatique de `$XDG_RUNTIME_DIR` n’est plus fait, car c’est devenu inutile. En effet, le dossier a maintenant une limite de taille par utilisateur et est nettoyé à la déconnexion.