@Jean_Eudes#DevoxxSystemD
Les développeurs aussi maîtrisent le
systemd
@Jean_Eudes#DevoxxSystemD
Les développeurs aussi maîtrisent le systemd
@Jean_Eudes
Xebia Developer
Devops fan
Objectifs
@Jean_Eudes#DevoxxSystemD
Calendrier
• Système d'init ?
• SystemD : Une solution à quelles problématiques ?
• Décortiquons...
@YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD
L'ère pré SystemD
@Jean_Eudes#DevoxxSystemD
Démarrage d'un linux
@Jean_Eudes#DevoxxSystemD
Responsabilité de l'init
• Initialisation des processus
• Gestion du cycle de vie des processus
...
@Jean_Eudes#DevoxxSystemD
System V
• Lecture du fichier inittab
• Chargement des différents niveaux
@Jean_Eudes#DevoxxSystemD
System V
. /lib/lsb/init-functions
NAME=cocktail
EXEC=$CATALINA_HOME/bin/startup.sh
PIDFILE=$CAT...
@Jean_Eudes#DevoxxSystemD
System V
• Comment démarrer un processus
/etc/init.d/service start
@Jean_Eudes#DevoxxSystemD
System V
• Comment arrêter un processus
/etc/init.d/service stop
@Jean_Eudes#DevoxxSystemD
System V
• Comment arrêter un processus
kill $PID
@Jean_Eudes#DevoxxSystemD
System V
●
Connaître le status d'un processus
ps aux | grep service
@Jean_Eudes#DevoxxSystemD
System V
●
Connaître le status d'un processus
/etc/init.d/service status
@Jean_Eudes#DevoxxSystemD
Les problématiques avec SystemV
• Les dépendances entre services
• Gestion des daemons
• Gestion...
@Jean_Eudes#DevoxxSystemD
Les alternatives à SystemV
• Upstart
• OpenRC
@YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD
La philosophie SystemD
@Jean_Eudes#DevoxxSystemD
Fiche signalétique
• Projet commence en 2010
• Écrit en C
• maintenu par Lennart Poettering
@Jean_Eudes#DevoxxSystemD
Adoption
• Fedora / Red Hat / Centos
• Archlinux
• Debian / Ubuntu (en cours)
@Jean_Eudes#DevoxxSystemD
Démarrage
@Jean_Eudes#DevoxxSystemD
Améliorer la vitesse de démarrage
• Paralléliser le démarrage des services
• Démarrer moins de s...
@Jean_Eudes#DevoxxSystemD
Gérer les dépendances entre services
@Jean_Eudes#DevoxxSystemD
Est ce vraiment la bonne solution ?
@Jean_Eudes#DevoxxSystemD
Est ce vraiment la bonne solution ?
@Jean_Eudes#DevoxxSystemD
Une autre alternative
• Supprimer la dépendance au service
• Dépendre uniquement de la socket
@Jean_Eudes#DevoxxSystemD
Comment suivre les processus : cgroup
• Regrouper des processus
• Contrôler l'usage des ressourc...
@Jean_Eudes#DevoxxSystemD
Gestion des logs
• Un nouvel outil : journald
• Récupérer facilement les logs des services
• Req...
@Jean_Eudes#DevoxxSystemD
All is Unit
• Un service : unit
• Monter un système de fichier : unit
• Créer une socket : unit
...
@YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD
La boîte à outil systemD
@Jean_Eudes#DevoxxSystemD
Gérer les services
$ systemctl
@Jean_Eudes#DevoxxSystemD
Connaître la liste des services actifs
$ systemctl list-units -t service
@Jean_Eudes#DevoxxSystemD
Connaître la liste de tous les services
$ systemctl list-units -t service --all
@Jean_Eudes#DevoxxSystemD
Gestion des unités
$ systemctl start <unit>
$ systemctl stop <unit>
$ systemctl restart <unit>
$...
@Jean_Eudes#DevoxxSystemD
activer une unité au démarrage
$ systemctl enable <unit>
$ systemctl disable <unit>
@Jean_Eudes#DevoxxSystemD
Mask une unité
$ systemctl mask <unit>
$ systemctl unmask <unit>
@Jean_Eudes#DevoxxSystemD
Lire les logs
$ journalctl
@Jean_Eudes#DevoxxSystemD
Lire les logs pour un service donné
$ journalctl -u sshd
@Jean_Eudes#DevoxxSystemD
Lire les logs pour un pid donné
$ journalctl _PID=1
@Jean_Eudes#DevoxxSystemD
Lire les logs de la dernière heure
$ journalctl --since="2015-04-10 13:30:00"
@Jean_Eudes#DevoxxSystemD
Lire les logs de l'avant dernière heure
journalctl --since="2015-04-10 12:30:00" -until="2015-04...
@Jean_Eudes#DevoxxSystemD
De très nombreux critères de recherches
• service
• date
• utilisateur, groupe
• ...
@Jean_Eudes#DevoxxSystemD
Des formats d'export
• texte
• json
@YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD
Les scripts systemD
@Jean_Eudes#DevoxxSystemD
Version SystemV
. /lib/lsb/init-functions
NAME=cocktail
EXEC=$CATALINA_HOME/bin/startup.sh
PIDFI...
@Jean_Eudes#DevoxxSystemD
Un exemple Simple
[Unit]
Description=Ma super application en node
[Service]
ExecStart=/opt/nodej...
@Jean_Eudes#DevoxxSystemD
Activation en service
[Unit]
Description=Ma super application en node
[Service]
ExecStart=/opt/n...
@Jean_Eudes#DevoxxSystemD
Redémarrage automatique
[Unit]
Description=Ma super application en node
[Service]
ExecStart=/opt...
@Jean_Eudes#DevoxxSystemD
Redémarrage automatique
• Les autres options :
• no (par défaut)
• always
• on-success
• on-abor...
@Jean_Eudes#DevoxxSystemD
Redémarrage automatique
• Définir un laps de temps : RestartSec
• 100 ms par défaut
@Jean_Eudes#DevoxxSystemD
Passons en mode production
[Unit]
Description=Ma super application en node
[Service]
ExecStart=/...
@Jean_Eudes#DevoxxSystemD
Les variables d'environnement
• Utiliser un fichier : EnvironmentFile
@Jean_Eudes#DevoxxSystemD
Récupérons les logs
[Unit]
Description=Ma super application en node
[Service]
ExecStart=/opt/nod...
@Jean_Eudes#DevoxxSystemD
Récupérons les logs
• Les autres options :
• null
• tty
• journal
• Syslog
• journal+console, sy...
@Jean_Eudes#DevoxxSystemD
Récupérons les logs
• On a la même option pour la sortie d'erreur : StandardError
@Jean_Eudes#DevoxxSystemD
Utilisation d'un user non root
[Unit]
Description=Ma super application en node
[Service]
ExecSta...
@Jean_Eudes#DevoxxSystemD
Utilisons chroot
[Unit]
Description=Ma super application en node
[Service]
ExecStart=/nodejs/bin...
@Jean_Eudes#DevoxxSystemD
Comment arrêter mon service
$ systemctl stop monAppli
@Jean_Eudes#DevoxxSystemD
Comment arrêter mon service
• Définir une commande ExecStop
• Sinon kill par défaut
• Tue l'ense...
@Jean_Eudes#DevoxxSystemD
Essayons avec un tomcat
[Unit]
Description=Ma super application en Java
[Service]
Type=forking
P...
@Jean_Eudes#DevoxxSystemD
Les autres valeurs de Type
• simple (valeur par défaut)
• forking
• oneshot
• dbus, notify, idle
@Jean_Eudes#DevoxxSystemD
Essayons avec un docker
[Unit]
Description=Ma super application sous docker
[Service]
ExecStart=...
@Jean_Eudes#DevoxxSystemD
Essayons avec un docker
[Unit]
Description=Ma super application sous docker
After=docker.socket
...
@Jean_Eudes#DevoxxSystemD
Gestion des dépendances
• Requires,Wants
• Before, After
$ systemctl list-dependencies busybox1
@Jean_Eudes#DevoxxSystemD
Des listeners ?
[Unit]
Description=Ma super application sous docker
After=docker.service
Require...
@Jean_Eudes#DevoxxSystemD
Des listeners ?
• ExecStartPre
• ExecStartPost
• ExecStopPost
@Jean_Eudes#DevoxxSystemD
Mais encore,
• Démarrer une socket (System.inheritedChannel())
• Monter un système de fichier
• ...
@Jean_Eudes#DevoxxSystemD
Pour aller plus loin
• man
• http://0pointer.de/blog/projects/systemd.html (lennart)
• http://ww...
@Jean_Eudes#DevoxxSystemD
Summary
@Jean_Eudes#DevoxxSystemD
Q & A
Prochain SlideShare
Chargement dans…5
×

Les développeurs aussi maitrisent le systèmD - Devoxx 2015

700 vues

Publié le

Le système d'initialisation de linux est historiquement géré par system V. En 2010, Lennart Poettering, de la société red hat, constate que celui-ci n'est plus adapté aux contraintes des environnements modernes, et décide, avec l'appui de red hat, d'en développer un nouveau : systemd.

Après un tour d'horizon de l'architecture de systemd, nous verrons, comment dev et ops peuvent l'utiliser afin de gérer le cycle de vie de leur application, ordonnancer des tâches, redémarrer automatiquement une application en cas de crash, gérér des dépendances entre processus...

speaker : Jean-Eudes Couignoux

Publié dans : Logiciels
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
700
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3
Actions
Partages
0
Téléchargements
4
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Les développeurs aussi maitrisent le systèmD - Devoxx 2015

  1. 1. @Jean_Eudes#DevoxxSystemD Les développeurs aussi maîtrisent le systemd
  2. 2. @Jean_Eudes#DevoxxSystemD Les développeurs aussi maîtrisent le systemd @Jean_Eudes Xebia Developer Devops fan
  3. 3. Objectifs
  4. 4. @Jean_Eudes#DevoxxSystemD Calendrier • Système d'init ? • SystemD : Une solution à quelles problématiques ? • Décortiquons un peu systemD • Les « scripts » SystemD
  5. 5. @YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD L'ère pré SystemD
  6. 6. @Jean_Eudes#DevoxxSystemD Démarrage d'un linux
  7. 7. @Jean_Eudes#DevoxxSystemD Responsabilité de l'init • Initialisation des processus • Gestion du cycle de vie des processus • Resté en vie
  8. 8. @Jean_Eudes#DevoxxSystemD System V • Lecture du fichier inittab • Chargement des différents niveaux
  9. 9. @Jean_Eudes#DevoxxSystemD System V . /lib/lsb/init-functions NAME=cocktail EXEC=$CATALINA_HOME/bin/startup.sh PIDFILE=$CATALINA_BASE/logs/cocktail.pid export CATALINA_PID=$PIDFILE do_start() { start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $EXEC -c tomcat } do_stop() { start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE rm -f $PIDFILE } do_status() { status_of_proc -p $PIDFILE $EXEC $NAME && exit 0 || exit $? }
  10. 10. @Jean_Eudes#DevoxxSystemD System V • Comment démarrer un processus /etc/init.d/service start
  11. 11. @Jean_Eudes#DevoxxSystemD System V • Comment arrêter un processus /etc/init.d/service stop
  12. 12. @Jean_Eudes#DevoxxSystemD System V • Comment arrêter un processus kill $PID
  13. 13. @Jean_Eudes#DevoxxSystemD System V ● Connaître le status d'un processus ps aux | grep service
  14. 14. @Jean_Eudes#DevoxxSystemD System V ● Connaître le status d'un processus /etc/init.d/service status
  15. 15. @Jean_Eudes#DevoxxSystemD Les problématiques avec SystemV • Les dépendances entre services • Gestion des daemons • Gestion des processus zombie • Duplication du code
  16. 16. @Jean_Eudes#DevoxxSystemD Les alternatives à SystemV • Upstart • OpenRC
  17. 17. @YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD La philosophie SystemD
  18. 18. @Jean_Eudes#DevoxxSystemD Fiche signalétique • Projet commence en 2010 • Écrit en C • maintenu par Lennart Poettering
  19. 19. @Jean_Eudes#DevoxxSystemD Adoption • Fedora / Red Hat / Centos • Archlinux • Debian / Ubuntu (en cours)
  20. 20. @Jean_Eudes#DevoxxSystemD Démarrage
  21. 21. @Jean_Eudes#DevoxxSystemD Améliorer la vitesse de démarrage • Paralléliser le démarrage des services • Démarrer moins de services
  22. 22. @Jean_Eudes#DevoxxSystemD Gérer les dépendances entre services
  23. 23. @Jean_Eudes#DevoxxSystemD Est ce vraiment la bonne solution ?
  24. 24. @Jean_Eudes#DevoxxSystemD Est ce vraiment la bonne solution ?
  25. 25. @Jean_Eudes#DevoxxSystemD Une autre alternative • Supprimer la dépendance au service • Dépendre uniquement de la socket
  26. 26. @Jean_Eudes#DevoxxSystemD Comment suivre les processus : cgroup • Regrouper des processus • Contrôler l'usage des ressources matériels • Comptabiliser les ressources utilisées
  27. 27. @Jean_Eudes#DevoxxSystemD Gestion des logs • Un nouvel outil : journald • Récupérer facilement les logs des services • Requêter plus facilement les logs • zip, rotation, ...
  28. 28. @Jean_Eudes#DevoxxSystemD All is Unit • Un service : unit • Monter un système de fichier : unit • Créer une socket : unit • Créer un cron : unit • ...
  29. 29. @YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD La boîte à outil systemD
  30. 30. @Jean_Eudes#DevoxxSystemD Gérer les services $ systemctl
  31. 31. @Jean_Eudes#DevoxxSystemD Connaître la liste des services actifs $ systemctl list-units -t service
  32. 32. @Jean_Eudes#DevoxxSystemD Connaître la liste de tous les services $ systemctl list-units -t service --all
  33. 33. @Jean_Eudes#DevoxxSystemD Gestion des unités $ systemctl start <unit> $ systemctl stop <unit> $ systemctl restart <unit> $ systemctl reload <unit>
  34. 34. @Jean_Eudes#DevoxxSystemD activer une unité au démarrage $ systemctl enable <unit> $ systemctl disable <unit>
  35. 35. @Jean_Eudes#DevoxxSystemD Mask une unité $ systemctl mask <unit> $ systemctl unmask <unit>
  36. 36. @Jean_Eudes#DevoxxSystemD Lire les logs $ journalctl
  37. 37. @Jean_Eudes#DevoxxSystemD Lire les logs pour un service donné $ journalctl -u sshd
  38. 38. @Jean_Eudes#DevoxxSystemD Lire les logs pour un pid donné $ journalctl _PID=1
  39. 39. @Jean_Eudes#DevoxxSystemD Lire les logs de la dernière heure $ journalctl --since="2015-04-10 13:30:00"
  40. 40. @Jean_Eudes#DevoxxSystemD Lire les logs de l'avant dernière heure journalctl --since="2015-04-10 12:30:00" -until="2015-04-10 13:30:00"
  41. 41. @Jean_Eudes#DevoxxSystemD De très nombreux critères de recherches • service • date • utilisateur, groupe • ...
  42. 42. @Jean_Eudes#DevoxxSystemD Des formats d'export • texte • json
  43. 43. @YourTwitterHandle@YourTwitterHandle @Jean_eudes#DevoxxSystemD Les scripts systemD
  44. 44. @Jean_Eudes#DevoxxSystemD Version SystemV . /lib/lsb/init-functions NAME=cocktail EXEC=$CATALINA_HOME/bin/startup.sh PIDFILE=$CATALINA_BASE/logs/cocktail.pid export CATALINA_PID=$PIDFILE do_start() { start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $EXEC -c tomcat } do_stop() { start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE rm -f $PIDFILE } do_status() { status_of_proc -p $PIDFILE $EXEC $NAME && exit 0 || exit $? }
  45. 45. @Jean_Eudes#DevoxxSystemD Un exemple Simple [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js $ systemctl start monAppli.service
  46. 46. @Jean_Eudes#DevoxxSystemD Activation en service [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js [Install] WantedBy=multi-user.target $ systemctl enable monAppli
  47. 47. @Jean_Eudes#DevoxxSystemD Redémarrage automatique [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js Restart=Always [Install] WantedBy=multi-user.target
  48. 48. @Jean_Eudes#DevoxxSystemD Redémarrage automatique • Les autres options : • no (par défaut) • always • on-success • on-abort • on-abnormal
  49. 49. @Jean_Eudes#DevoxxSystemD Redémarrage automatique • Définir un laps de temps : RestartSec • 100 ms par défaut
  50. 50. @Jean_Eudes#DevoxxSystemD Passons en mode production [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js Restart=Always Environnement=NODE_ENV=production [Install] WantedBy=multi-user.target
  51. 51. @Jean_Eudes#DevoxxSystemD Les variables d'environnement • Utiliser un fichier : EnvironmentFile
  52. 52. @Jean_Eudes#DevoxxSystemD Récupérons les logs [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js Restart=Always StandardOutput=journal Environnement=NODE_ENV=production [Install] WantedBy=multi-user.target
  53. 53. @Jean_Eudes#DevoxxSystemD Récupérons les logs • Les autres options : • null • tty • journal • Syslog • journal+console, syslog+console • inherit
  54. 54. @Jean_Eudes#DevoxxSystemD Récupérons les logs • On a la même option pour la sortie d'erreur : StandardError
  55. 55. @Jean_Eudes#DevoxxSystemD Utilisation d'un user non root [Unit] Description=Ma super application en node [Service] ExecStart=/opt/nodejs/bin/node /var/www/myApp/main.js Restart=Always StandardOutput=journal User=nobody Group=nobody Environnement=NODE_ENV=production [Install] WantedBy=multi-user.target
  56. 56. @Jean_Eudes#DevoxxSystemD Utilisons chroot [Unit] Description=Ma super application en node [Service] ExecStart=/nodejs/bin/node /www/myApp/main.js Restart=Always StandardOutput=journal User=nobody Group=nobody RootDirectory=/opt/myApp/ Environnement=NODE_ENV=production [Install] WantedBy=multi-user.target
  57. 57. @Jean_Eudes#DevoxxSystemD Comment arrêter mon service $ systemctl stop monAppli
  58. 58. @Jean_Eudes#DevoxxSystemD Comment arrêter mon service • Définir une commande ExecStop • Sinon kill par défaut • Tue l'ensemble des processus généré par le processus parent
  59. 59. @Jean_Eudes#DevoxxSystemD Essayons avec un tomcat [Unit] Description=Ma super application en Java [Service] Type=forking PIDFile=/var/run/tomcat.pid Environnement=CATALINA_PID=/var/run/tomcat.pid ExecStart=/usr/bin/tomcat start [Install] WantedBy=multi-user.target
  60. 60. @Jean_Eudes#DevoxxSystemD Les autres valeurs de Type • simple (valeur par défaut) • forking • oneshot • dbus, notify, idle
  61. 61. @Jean_Eudes#DevoxxSystemD Essayons avec un docker [Unit] Description=Ma super application sous docker [Service] ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done" [Install] WantedBy=multi-user.target
  62. 62. @Jean_Eudes#DevoxxSystemD Essayons avec un docker [Unit] Description=Ma super application sous docker After=docker.socket Requires=docker.socket [Service] ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done" [Install] WantedBy=multi-user.target Dépendance vers docker
  63. 63. @Jean_Eudes#DevoxxSystemD Gestion des dépendances • Requires,Wants • Before, After $ systemctl list-dependencies busybox1
  64. 64. @Jean_Eudes#DevoxxSystemD Des listeners ? [Unit] Description=Ma super application sous docker After=docker.service Requires=docker.service [Service] ExecStartPre=/usr/bin/docker kill busybox1 ExecStartPre=/usr/bin/docker rm busybox1 ExecStartPre=/usr/bin/docker pull busybox ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done" [Install] WantedBy=multi-user.target
  65. 65. @Jean_Eudes#DevoxxSystemD Des listeners ? • ExecStartPre • ExecStartPost • ExecStopPost
  66. 66. @Jean_Eudes#DevoxxSystemD Mais encore, • Démarrer une socket (System.inheritedChannel()) • Monter un système de fichier • Démarrer des cron • Lancer des containers (machinectl)
  67. 67. @Jean_Eudes#DevoxxSystemD Pour aller plus loin • man • http://0pointer.de/blog/projects/systemd.html (lennart) • http://www.freedesktop.org/wiki/Software/systemd/
  68. 68. @Jean_Eudes#DevoxxSystemD Summary
  69. 69. @Jean_Eudes#DevoxxSystemD Q & A

×