web-dev-qa-db-fra.com

Quels sont les avantages / inconvénients d'Upstart et de systemd?

Il semble systemd est le nouveau système init sur le bloc, identique à pstart il y a quelques années. Quels sont les avantages/inconvénients de chacun? De plus, comment se compare-t-il aux autres systèmes init?

187
tshepang

Mise à jour 2016

La plupart des réponses datent de cinq ans, il est donc temps de faire quelques mises à jour.

Ubuntu utilisait upstart par défaut mais ils l'ont abandonné l'année dernière au profit de systemd - voir:

Pour cette raison, il y a un article de Nice Systemd pour les utilisateurs Upstart sur le wiki Ubuntu - comparaison très détaillée entre upstart et systemd et un guide de transition de upstart à systemd.

(Notez que selon le wiki Ubunt vous pouvez toujours exécuter upstart sur les versions actuelles d'Ubuntu par défaut en installant le upstart-sysv et en cours d'exécution Sudo update-initramfs -u mais compte tenu de la portée du projet systemd, je ne sais pas comment cela fonctionne dans la pratique, ni s'il est possible ou non de désinstaller systemd.)

La plupart des informations dans les sections Commandes et Scripts ci-dessous sont adaptées de certains des exemples utilisés dans cet article (sous licence pratique, tout comme les contributions des utilisateurs de Stack Exchange sous la Creative Commons Attribution-ShareAlike 3.0 License ) .

Voici une comparaison rapide des commandes courantes et des scripts simples, voir les sections ci-dessous pour une explication détaillée. Cette réponse compare l'ancien comportement des systèmes basés sur Upstart avec le nouveau comportement des systèmes basés sur Systemd, comme demandé dans la question, mais notez que les commandes marquées comme "Upstart" ne sont pas nécessairement spécifiques à Upstart - ce sont souvent des commandes qui sont communs à tous les systèmes Linux et Unix non système.

Commandes

Running su:

  • upstart: su
  • systemd: machinectl Shell

(voir la section "remplacement de la commande su" ci-dessous)

Écran en cours d'exécution:

  • upstart: screen
  • systemd: systemd-run --user --scope screen

(voir la section "Suppression inattendue des processus d'arrière-plan" ci-dessous)

Lancer tmux:

  • upstart: tmux
  • systemd: systemd-run --user --scope tmux

(voir la section "Suppression inattendue des processus d'arrière-plan" ci-dessous)

Démarrage du job foo:

  • parvenu: start foo
  • systemd: systemctl start foo

Arrêt du travail foo:

  • parvenu: stop foo
  • systemd: systemctl stop foo

Redémarrage du travail foo:

  • parvenu: restart foo
  • systemd: systemctl restart foo

Liste des emplois:

  • parvenu: initctl list
  • systemd: systemctl status

Vérification de la configuration du job foo:

  • parvenu: init-checkconf /etc/init/foo.conf
  • systemd: systemd-analyze verify /lib/systemd/system/foo.service

Liste des variables d'environnement du travail:

  • parvenu: initctl list-env
  • systemd: systemctl show-environment

Définition de la variable d'environnement du travail:

  • parvenu: initctl set-env foo=bar
  • systemd: systemctl set-environment foo=bar

Suppression de la variable d'environnement du travail:

  • parvenu: initctl unset-env foo
  • systemd: systemctl unset-environment foo

Journaux

Dans upstart, les journaux sont des fichiers texte normaux dans le répertoire/var/log/upstart, vous pouvez donc les traiter comme d'habitude:

cat /var/log/upstart/foo.log
tail -f /var/log/upstart/foo.log

Dans systemd, les journaux sont stockés dans un format binaire interne (pas sous forme de fichiers texte), vous devez donc utiliser la commande journalctl pour y accéder:

Sudo journalctl -u foo
Sudo journalctl -u foo -f

Scripts

Exemple de script de démarrage écrit en /etc/init/foo.conf:

description "Job that runs the foo daemon"
start on runlevel [2345]
stop on runlevel [016]
env statedir=/var/cache/foo
pre-start exec mkdir -p $statedir
exec /usr/bin/foo-daemon --arg1 "hello world" --statedir $statedir

Exemple script systemd écrit en /lib/systemd/system/foo.service:

[Unit]
Description=Job that runs the foo daemon
Documentation=man:foo(1)
[Service]
Type=forking
Environment=statedir=/var/cache/foo
ExecStartPre=/usr/bin/mkdir -p ${statedir}
ExecStart=/usr/bin/foo-daemon --arg1 "hello world" --statedir ${statedir}
[Install]
WantedBy=multi-user.target

remplacement de la commande su

Un remplacement de commande su a été fusionné dans systemd dans la requête Pull # 1022:

parce que, selon Lennart Poettering, "su est vraiment un concept cassé" .

Il explique que "vous pouvez utiliser su et Sudo comme avant, mais ne vous attendez pas à ce que cela fonctionne pleinement " .

La manière officielle d'obtenir un comportement semblable à su est maintenant:

machinectl Shell

Il a été plus loin expliqué par Lennart Poettering dans la discussion du numéro 825:

"Eh bien, il y a eu de longues discussions à ce sujet, mais le problème est que ce que su est censé faire est très peu clair. [...] Bref: su est vraiment un concept cassé. Il vous donnera une sorte de Shell , et c'est bien de l'utiliser pour cela, mais ce n'est pas une connexion complète, et ne doit pas être confondu avec un. " - Lennart Poettering

Voir également:

Suppression inattendue des processus d'arrière-plan

Des commandes comme:

ne fonctionne plus comme prévu . Par exemple, Nohup est une commande POSIX pour vous assurer que le processus continue de fonctionner après votre déconnexion de votre session. Cela ne fonctionne plus sur systemd. Des programmes comme screen et tmux doivent également être invoqués d'une manière spéciale ou autrement les processus que vous exécutez avec eux seront tués (sans obtenir ces processus tués est généralement la principale raison de lancer screen ou tmux en premier lieu).

Ce n'est pas une erreur, c'est une décision délibérée, donc il est peu probable qu'elle soit corrigée à l'avenir. Voici ce que Lennart Poettering a dit à propos de ce problème:

À mon avis, il était en fait assez étrange d'UNIX qu'il laisse par défaut le code utilisateur arbitraire rester sans restriction après la déconnexion. Il a été discuté depuis des siècles parmi de nombreuses personnes utilisant le système d'exploitation, que cela devrait être possible mais certainement pas la valeur par défaut, mais personne n'a osé jusqu'à présent basculer le commutateur pour le faire passer d'une option par défaut à une option. Ne pas nettoyer les sessions utilisateur après la déconnexion est non seulement laid et quelque peu hack mais aussi un problème de sécurité. systemd 230 a finalement basculé le commutateur et enfin par défaut nettoie tout correctement lorsque l'utilisateur se déconnecte.

Pour plus d'informations, voir:

Concept de démarrage de haut niveau

D'une certaine façon, systemd fonctionne à l'envers - dans les jobs upstart, ils commencent dès qu'ils le peuvent et dans les jobs systemd, ils commencent quand ils le doivent. À la fin de la journée, les mêmes travaux peuvent être lancés par les deux systèmes et dans à peu près le même ordre, mais vous pensez que cela regarde dans une direction opposée pour ainsi dire.

Voici comment Systemd for Upstart Users l'explique:

Le modèle Upstart pour le démarrage de processus (jobs) est "basé sur les événements gourmands", i. e. tous les travaux disponibles dont les événements de démarrage se produisent sont démarrés le plus tôt possible. Lors du démarrage, upstart synthétise certains événements initiaux comme le démarrage ou rcS en tant que "racine d'arbre", les premiers services démarrent sur ceux-ci et les services ultérieurs démarrent lorsque les premiers sont en cours d'exécution. Un nouveau travail doit simplement installer son fichier de configuration dans/etc/init/pour devenir actif.

Le modèle de systemd pour démarrer les processus (unités) est "basé sur les dépendances paresseuses", i. e. une unité ne démarre que si et quand une autre unité de démarrage en dépend. Au démarrage, systemd démarre une "unité racine" (default.target, peut être surchargée dans grub), qui se développe ensuite de manière transitoire et démarre ses dépendances. Une nouvelle unité doit s'ajouter en tant que dépendance d'une unité de la séquence de démarrage (généralement multi-user.target) pour devenir active.

Utilisation dans les distributions

Maintenant, quelques données récentes selon Wikipedia:

Distributions utilisant upstart par défaut:

Distributions utilisant systemd par défaut:

(Voir Wikipedia pour des informations à jour)

Distributions n'utilisant ni Upstart ni systemd:

Controverse

Dans le passé n fork de Debian a été proposé pour éviter systemd . Le Devuan GNU + Linux a été créé - un fork de Debian sans systemd (merci à fpmurphy1 pour l'avoir signalé dans les commentaires).

Pour plus d'informations sur cette controverse, voir:

Comme beaucoup d'entre vous le savent peut-être déjà, le vote Init GR Debian promu par Ian Jackson n'a pas été utile pour protéger l'héritage de Debian et ses utilisateurs de l'avalanche du système.

Cette situation prévoit un verrouillage des dépendances système qui menace de facto la liberté de développement et a de graves conséquences pour Debian, son amont et son aval.

Le CTTE a réussi à échanger une dépendance et à gagner du temps sur une installation subtile de systemd sur sysvinit, mais même ce processus était épuisant et plein de drame. Il y a une semaine, Ian Jackson a démissionné. [...]

Je démissionne du comité technique avec effet immédiat.

Bien qu'il soit important que les vues des 30 à 40% du projet qui sont d'accord avec moi continuent d'être représentées au TC, je suis moi-même clairement trop controversé à ce stade pour le faire. Je devrais me retirer pour essayer de réduire la mesure dans laquelle les conversations sur la gouvernance du projet sont personnalisées. [...]

Devuan est né d'une controverse sur la décision d'utiliser comme système d'initialisation par défaut pour Debian. La position officielle de Debian sur systemd est pleine d'affirmations que d'autres ont démystifié . Les lecteurs intéressés peuvent continuer à discuter de ce sujet brûlant dans La controverse systemd . Cependant, nous vous encourageons à garder la tête froide et votre voix civile. Chez Devuan, nous sommes plus intéressés à les mal programmer qu’à regarder en arrière. [...]

Quelques sites et articles dédiés à la controverse systemd ont été créés:

Il y a beaucoup de discussions intéressantes sur Hacker News:

Des tendances similaires dans d'autres distributions peuvent également être observées:

Philosophie

upstart suit la philosophie Unix de DOTADIW - "Do One Thing and Do It Well." Il remplace le démon init traditionnel. Il ne fait rien d'autre que démarrer et arrêter des services. D'autres tâches sont déléguées à d'autres sous-systèmes spécialisés.

systemd fait bien plus que cela. En plus de démarrer et d'arrêter les services, il gère également les mots de passe, les connexions, les terminaux, la gestion de l'alimentation, les réinitialisations d'usine, le traitement des journaux, les points de montage du système de fichiers, la mise en réseau et bien plus encore - voir les NEWS fichier pour certaines fonctionnalités.

Plans d'expansion

Selon A Perspective for systemd What Achieved, and What Lies Ahead présentation par Lennart Poettering en 2014 sur GNOME.asia, voici les principaux objectifs de systemd, les domaines déjà couverts et ceux qui l'ont été encore en progrès:

objectifs du système:

Nos objectifs

  • Transformer Linux d'un sac de bits en un système d'exploitation polyvalent compétitif.
  • Création du système d'exploitation de nouvelle génération d'Internet Unification des différences inutiles entre les distributions
  • Ramener l'innovation au cœur du système d'exploitation

  • Desktop, Server, Container, Embedded, Mobile, Cloud, Cluster,. . . Ces zones sont plus proches que vous ne le pensez

  • Réduction de la complexité et de la fiabilité des administrateurs sans supervision
  • Tout introspectable
  • Découverte automatique, plug and play est la clé
  • Nous réparons les choses là où elles sont cassées, ne les collons jamais

Domaines déjà couverts:

Ce que nous couvrons déjà:

système d'initialisation, journalisation du journal, gestion des connexions, gestion des périphériques, gestion des fichiers temporaires et volatils, enregistrement au format binaire, sauvegarde/restauration du rétroéclairage, sauvegarde/restauration rfkill, diagramme de démarrage, lecture anticipée, configuration du stockage crypté, découverte de partition EFI/GPT, machine virtuelle/conteneur enregistrement, gestion minimale des conteneurs, gestion du nom d 'hôte, gestion des paramètres régionaux, gestion du temps, gestion aléatoire des semences, gestion des variables sysctl, gestion de la console, . .

Travail en cours:

Sur quoi nous travaillons:

  • la gestion du réseau
  • systemd-networkd
  • Cache DNS local, répondeur mDNS, répondeur LLMNR, vérification DNSSEC
  • IPC dans le noyau
  • kdbus, sd-bus
  • Synchronisation horaire avec NTP
  • systemd-timesyncd
  • Plus d'intégration avec les conteneurs
  • Sandboxing des services
  • Sandboxing des applications
  • Format d'image OS
  • Format d'image du conteneur
  • Format d'image de l'application
  • GPT avec découverte automatique
  • Systèmes sans état, systèmes instanciables, réinitialisation d'usine
  • / usr est le système d'exploitation
  • / etc est une configuration (facultative)
  • / var est (facultatif) l'état
  • Initialisation et mises à jour du nœud atomique
  • Intégration avec le cloud
  • Gestion des services sur les nœuds
  • Images de système d'exploitation vérifiables
  • Jusqu'au firmware
  • Chargement de démarrage

Portée de cette réponse

Comme fpmurphy1 l'a noté dans les commentaires, "Il convient de souligner que systemd a élargi son champ de travail au fil des ans bien au-delà du simple démarrage du système."

J'ai essayé d'inclure la plupart des informations pertinentes ici. Ici, je compare les fonctionnalités communes d'Upstart et de systemd lorsqu'elles sont utilisées comme systèmes init comme demandé dans la question et je ne mentionne que les fonctionnalités de systemd qui vont au-delà de la portée d'un système init car elles ne peuvent pas être comparées à Startup, mais leur présence est importante pour comprendre la différence entre ces deux projets. La documentation pertinente doit être vérifiée pour plus d'informations.

Plus d'informations

Plus d'informations peuvent être trouvées sur:

Suppléments

L'équipe LinOxide a créé une Systemd vs SysV Init Linux Cheatsheet .

92
rsp

Upstart et systemd sont des tentatives pour résoudre certains des problèmes liés aux limites du système d'initialisation SysV traditionnel. Par exemple, certains services doivent démarrer après d'autres services (par exemple, vous ne pouvez pas monter de systèmes de fichiers NFS tant que le réseau n'est pas en cours d'exécution), mais la seule façon de gérer SysV consiste à définir les liens dans le répertoire rc # .d de telle sorte que l'un est avant l'autre. De plus, vous devrez peut-être tout renuméroter plus tard lorsque des dépendances sont ajoutées ou modifiées. Upstart et Systemd ont des paramètres plus intelligents pour définir les exigences. En outre, il y a le problème avec le fait que tout est un script Shell d'une certaine sorte, et tout le monde n'écrit pas les meilleurs scripts d'initialisation. Cela a également un impact sur la vitesse de démarrage.

Je peux voir certains des avantages de systemd:

  • Chaque processus démarré obtient son propre groupe de contrôle ou un groupe de contrôle particulier.
  • Pré-création de sockets et de descripteurs de fichiers pour les services, semblable à la façon dont xinetd le fait pour ses services, permettant aux services dépendants de démarrer plus rapidement. Par exemple, systemd gardera ouvert le descripteur de fichier pour/dev/log pour syslog, et les services ultérieurs qui envoient vers/dev/log verront leurs messages en mémoire tampon jusqu'à ce que syslogd soit prêt à prendre le relais.
  • Moins de processus exécutés pour démarrer réellement un service. Cela signifie que vous n'écrivez pas de script Shell pour démarrer votre service. Cela peut être une amélioration de la vitesse et (IMO) quelque chose de plus facile à configurer en premier lieu.

Un inconvénient que je connais est que pour profiter de la préallocation socket/FH de systemd, de nombreux démons devront être corrigés pour que le FH leur soit transmis par systemd.

68
jsbillings

Saw systemd mentionné le Arch General ML aujourd'hui. Alors lisez-le. The H Online comme toujours est une excellente source pour la technologie Linux et c'est là que j'ai trouvé ma place pour commencer la recherche Systemd comme SysV Init et Alternative Upstart . Cependant, l'article H Online (dans ce cas) n'est pas une lecture très utile, la véritable utilisation derrière cela est qu'il donne des liens vers les lectures utiles.

La vraie réponse est dans le annonce de systemd . Ce qui donne des points cruciaux sur ce qui ne va pas avec SysV initd et ce que les nouveaux systèmes doivent faire

  • Pour commencer moins.
  • Et pour commencer plus en parallèle.

Son plan principal pour ce faire semble être de démarrer les services uniquement en fonction de leurs besoins et de démarrer un socket pour ce service, afin que le service qui en a besoin puisse se connecter au socket créé bien avant que le démon ne soit entièrement en ligne. Apparemment, un socket conservera une petite quantité de données tamponnées, ce qui signifie qu'aucune donnée ne sera perdue pendant le décalage, elle sera traitée dès que le démon sera en ligne.

Une autre partie du plan semble être de ne pas sérialiser les systèmes de fichiers, mais de les monter également à la demande, de cette façon vous n'attendez pas votre /home/, etc. (à ne pas confondre avec /etc) à monter, et/ou fsck lorsque vous pourriez démarrer des démons en tant que / et /var/ etc, sont déjà montés. Il a dit qu'il allait utiliser des autofs à cette fin.

Il a également pour objectif de créer .desktop style descripteurs d'init en remplacement des scripts. Cela évitera des tonnes de processus lents sh et encore plus de fourches de processus provenant de choses comme sed et grep qui sont souvent utilisées dans les scripts Shell.

Ils prévoient également de ne pas démarrer certains services jusqu'à ce qu'ils soient demandés, et peut-être même de les arrêter s'ils ne sont plus nécessaires, le module Bluetooth et le démon ne sont nécessaires que lorsque vous utilisez un appareil Bluetooth par exemple. Un autre exemple donné est le démon ssh. C'est le genre de chose dont inetd est capable. Personnellement, je ne suis pas sûr de l'aimer, car cela pourrait signifier une latence lorsque j'en ai besoin, et dans le cas de ssh, je pense que cela signifie une vulnérabilité de sécurité possible, si mon inetd était compromis, tout le système le serait. Cependant, j'ai été informé que l'utiliser pour violer ce système est irréalisable et que si je le souhaite, je peux désactiver cette fonctionnalité par service et par d'autres moyens.

Une autre caractéristique va apparemment être la possibilité de démarrer en fonction d'événements temporels, soit à un intervalle régulièrement planifié, soit à un certain moment. Ceci est similaire à ce que crond et atd font maintenant. Bien qu'on m'ait dit qu'il ne prendrait pas en charge l'utilisateur "cron". Personnellement, cela ressemble à la chose la plus inutile. Je pense que cela a été écrit/pensé par des gens qui ne travaillent pas dans des environnements multi-utilisateurs, il n'y a pas beaucoup d'intérêt à l'utilisateur cron si vous êtes le seul utilisateur du système, à part ne pas s'exécuter en tant que root. Je travaille quotidiennement sur des systèmes multi-utilisateurs et la règle est toujours d'exécuter des scripts utilisateur en tant qu'utilisateur. Mais peut-être que je n'ai pas la clairvoyance qu'ils ont, et cela ne permettra en aucun cas que je ne puisse pas exécuter crond ou atd, donc cela ne fait de mal à personne sauf au les développeurs, je suppose.

Le gros inconvénient de systemd est que certains démons devront être modifiés pour en profiter pleinement. Ils fonctionneront maintenant, mais ils fonctionneraient mieux s'ils étaient écrits spécifiquement pour son modèle de socket.

Il semble que la plupart du temps, le problème des gens de systemd avec l'arrivée est le système d'événements, et qu'ils croient qu'il n'a pas de sens ou n'est pas nécessaire. Peut-être que leurs mots le disent le mieux.

Ou pour le dire plus simplement: le fait que l'utilisateur vient de démarrer D-Bus n'est en aucun cas une indication que NetworkManager devrait également être démarré (mais c'est ce que Upstart ferait). C'est l'inverse: lorsque l'utilisateur demande NetworkManager, c'est certainement une indication que D-Bus doit également être démarré (ce qui est certainement ce que la plupart des utilisateurs attendraient, non?).
Un bon système d'initialisation ne devrait démarrer que ce qui est nécessaire, et cela à la demande. Soit paresseusement, soit parallélisé et à l'avance. Cependant, il ne devrait pas démarrer plus que nécessaire, en particulier tous les éléments installés qui pourraient utiliser ce service.

Comme je l'ai déjà dit, cela est discuté de manière beaucoup plus complète dans le annonce de systemd .

29
xenoterracide

Eh bien, la plupart d'entre vous ont oublié l'organisation des processus dans cgroups .

Donc, si systemd a démarré une chose, il la mettra dans son propre groupe de contrôle et il n'y a pas de moyen (sans privilège) permettant au processus d'échapper à ce groupe de contrôle. Voici les conséquences de cela:

  • Un administrateur d'un grand système avec de nombreux utilisateurs dispose de nouvelles méthodes efficaces pour identifier les utilisateurs/processus malveillants.
  • Les priorités pour la planification du CPU peuvent être mieux déterminées comme le fait le "Wonder autocgroup patch" .
11
enaut

Pour un aperçu très détaillé de systemd, en commençant par les premières ébauches de conception (et une critique détaillée des systèmes init existants, y compris upstart et comment systemd propose de les corriger), allez sur son page d'accueil . Au fil du temps, plusieurs articles sur le démarrage ont été publiés dans LWN . Sachez simplement que toute mention de systemd (ou pulseaudio) y déclenche des guerres de flammes sans fin.

IMVHO (et en tant qu'utilisateur Fedora), je suis très satisfait de cela. Quelque chose dans cette ligne était attendu depuis longtemps pour gérer la complexité des systèmes Linux actuels. Fedora a utilisé par le passé pendant un certain temps, mais il n'est jamais sorti du stade d'être un remplacement sophistiqué de sysvinit, exécutant pour la plupart des scripts d'initialisation inchangés. Sa promesse de simplifier la configuration de démarrage se fait au prix de à nouveau la configuration manuelle des interdépendances, et cela ne fonctionne tout simplement pas. systemd chiffre les dépendances par lui-même (ou permet simplement de démarrer des choses sans tenir compte des dépendances, elles se trient). Un autre gros avantage (certains disent que c'est un grave inconvénient) est qu'il exploite au maximum les fonctionnalités spécifiques à Linux (notamment les cgroups permettent d'isoler un démon et tous ses descendants, il est donc facile de surveiller, de limiter les ressources ou de les tuer en tant que un groupe; il y en a beaucoup d'autres).

8
vonbrand

Journalisation - Systemd est littéralement comme le dossier WinSXS en ce qui concerne la journalisation, il crée des copies de copies, sauf si vous supprimez ou réduisez manuellement la taille du fichier, il continuera à ronger votre lecteur. Je l'appelle les cookies du chargeur de démarrage.

3
Bert