RHEL7 : Résumé des changements apportés par Systemd

RHEL7 : Résumé des changements apportés par Systemd
Photo by Aaron Burden / Unsplash

1. Présentation Systemd

Nouvelles gestions des services. Systemd remplace l’ancien SysV Init, il permet de paralléliser les démarrages de services et gère nativement les dépendances entre eux.
Les scripts dans /etc/init.d ne sont plus à l’ordre du jour. Ils ont été remplacés par des « unit file » de service (il existe des unit file pour les montages de fs, timer, socket, etc). La doc est disponible dans les pages de man avec la commande : man systemd.service, pour les services ou systemd.* pour tous les autres (ie : systemd.unit). Pour résumé, ces units file sont des fichiers de configuration avec des directives décrivant le comportement du système pour la gestion de l’unit.

Pour un service, cela se composera d’une description, d’éventuelles dépendances, le type de lancement, la commande a lancé pour le démarrage, l’arrêt etc.

Exemple rsyslog.service :

# cat /usr/lib/systemd/system/rsyslog.service
[Unit]
Description=System Logging Service
;Requires=syslog.socket

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
StandardOutput=null

[Install]
WantedBy=multi-user.target
;Alias=syslog.service

Les fichiers de configuration sont dans le répertoire /etc/systemd.

Les units files du système sont stockés dans /usr/lib/systemd/system, il ne faut pas modifier ces fichiers. S’il doit y avoir des modifications, elles doivent être faites dans /etc/systemd/system

2. Runlevel et Target

Les runlevel ont laissé la place au target. Le fichier inittab n’existe plus et la gestion des différents runlevel est assurée par les targets : runlevel0.target,runlevel1.target,runlevel2.target,runlevel3.target,runlevel4.target,runlevel5.target,runlevel6.target. Ceux-ci ne sont que des liens symboliques vers d’autres targets :

lrwxrwxrwx. 1 root root  15 Jul 29 13:35 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root  13 Jul 29 13:35 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root  17 Jul 29 13:35 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root  17 Jul 29 13:35 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root  17 Jul 29 13:35 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root  16 Jul 29 13:35 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root  13 Jul 29 13:35 /usr/lib/systemd/system/runlevel6.target -> reboot.target

Les targets sont des étapes dans le démarrage de linux. Ainsi, les services font référence à une target dans leur section [Install]. L’étape (la cible peu importe) est atteinte lorsque tous les services activés pour cette target sont démarrés.

Pour atteindre une target :

# systemctl isolate runlevel3.target

Connaitre et configurer la target par défaut :

# systemctl get-default
# systemctl set-default multi-user.target

Pour éteindre et redémarrer le système préférer la commande systemctl à shutdown:

# systemctl poweroff
# systemctl reboot

3. Gestion des services

La gestion des services se fait par la commande systemctl :

Démarrage, arrêt, redémarrage, rechargement :

# systemctl start chronyd
# systemctl stop chronyd
# systemctl restart chronyd
# systemctl reload chronyd

Note : Normalement le démarrage et l’arrêt d’unit se fait en spécifiant le nom entier, default.target par exemple. Sauf pour les services où cela est implicite.

Obtenir l’état d’un service :

# systemctl status chronyd
chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
   Active: active (running) since Thu 2015-09-17 09:36:24 CEST; 49min ago
  Process: 690 ExecStartPost=/usr/libexec/chrony-helper add-dhclient-servers (code=exited, status=0/SUCCESS)
  Process: 654 ExecStart=/usr/sbin/chronyd -u chrony $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 668 (chronyd)
   CGroup: /system.slice/chronyd.service
           `-668 /usr/sbin/chronyd -u chrony

Sep 17 09:36:24 devdbsud chronyd[668]: chronyd version 1.29.1 starting
Sep 17 09:36:24 devdbsud chronyd[668]: Linux kernel major=3 minor=10 patch=0
Sep 17 09:36:24 devdbsud chronyd[668]: hz=100 shift_hz=7 freq_scale=1.00000000 nominal_tick=10000 slew_delta_tick=833 max_tick_bias=1000 shift_pll=2
Sep 17 09:36:24 devdbsud systemd[1]: Started NTP client/server.
Sep 17 10:07:43 devdbsud chronyd[668]: NTP packet received from unauthorised host 10.145.13.15 port 1230
Sep 17 10:21:41 devdbsud chronyd[668]: Source 37.187.103.150 online
Sep 17 10:21:41 devdbsud chronyd[668]: Source 195.154.216.44 online
Sep 17 10:21:41 devdbsud chronyd[668]: Source 37.187.2.84 online
Sep 17 10:21:41 devdbsud chronyd[668]: Source 176.31.109.39 online

Infos importantes à retenir dans les premières lignes.
Sur la ligne Loaded, on retrouve le chemin vers l’unit file qui se charge ce service, s’il est activé ou non pour la target.
La ligne Active parle d’elle même
Les lignes Process décrivent les commandes utilisées pour démarrer le service et leur retour.
Les 10 dernières lignes sont les dernières lignes de log de ce service.

Savoir si un service est activé ou non :

# systemctl is-enabled chronyd

Activer/Désactiver un service :

# systemctl enable chronyd
# systemctl disable chronyd

Obtenir la liste des units :

# systemctl

La même chose en résumé :

# systemctl list-unit-files

4. Linux environnement

4.1. Hostnamectl

Il existe 3 types d’hostname désormais : static, transient et pretty. Static est l’hostname classique choisi par l’utilisateur et stocké dans /etc/hostname. Transient est l’hostname dynamique qui est enregistré par le kernel, par défaut cette valeur est initialisé sur celle de static. Et pretty est l’hostname sans contrainte de caractère présenté à l’utilisateur par l’interface.

On peut configurer les hostnames avec la commande suivante :

# hostnamectl set-hostname

Ajouter une option -pretty,-transient,-static si vous voulez configurer séparément l’un des trois hostname.

4.2. Localectl

Localectl permet de configurer simplement les locales de la machine.

# localectl
System Locale: LANG=en_US.UTF-8
VC Keymap: en_US
X11 Layout: en_US

Configurer la valeur fr_FR.ISO8859-15 pour la locale système :

# localectl set-locale LANG=fr_FR.ISO8859-15

Configurer la valeur fr_FR pour la virtual console keymap:

# localectl set-keymap fr_FR

Configurer la valeur fr_FR value pour le X11 layout:

# localectl set-x11-keymap fr_FR

4.3. Timedatectl

Le contrôle de la date, heure et format d’affichage se feront avec la commande timedatectl

Connaitre la configuration actuelle :

# timedatectl

Configurer la date:

# timedatectl set-time YYYY-MM-DD

Configurer l’heure:

# timedatectl set-time HH:MM:SS

Obtenir la liste des timezones:

# timedatectl list-timezones

Changer la timezone :

# timedatectl set-timezone Europe/Paris

5. Journaux

Les journaux sont désormais enregistrés par systemd-journald, en plus de syslog pour faire la transition. On peut y accéder avec la commander avec la commande journalctl. Voici quelques commandes permettant de consulter les journaux de manière efficace :

Consulter le journal entier :

# journalctl

Obtenir tout les enregistrements relatifs au process crond :

# journalctl /sbin/crond

Note: Peut être remplacé par `which crond`.

Connaitre les enregistrements depuis le dernier boot:

# journalctl -b

Tout les évènements du jour :

# journalctl --since=today

Connaitre toutes les erreurs:

# journalctl -p err

Lire les 10 derniers enregistrements et attendre les nouveaux (l’équivalent de “tail -f /var/log/messages“) :

# journalctl -f

6. Autres changements indépendants de Systemd

6.1. Norme de nommage des interfaces réseaux

Red Hat applique le “Consistent Network Device Naming”. Les interfaces précédemment nommées ‘ethX’ seront nommées ‘eno1’ r ‘ens192’ (Dell and VMware, respectivement).

Les règles sont (d’après la documentation Red Hat) :

  • Scheme 1: Names incorporating Firmware or BIOS provided index numbers for on-board devices (example: eno1), are applied if that information from the firmware or BIOS is applicable and available, else falling back to scheme 2.
  • Scheme 2: Names incorporating Firmware or BIOS provided PCI Express hotplug slot index numbers (example: ens1) are applied if that information from the firmware or BIOS is applicable and available, else falling back to scheme 3.
  • Scheme 3: Names incorporating physical location of the connector of the hardware (example: enp2s0), are applied if applicable, else falling directly back to scheme 5 in all other cases.
  • Scheme 4: Names incorporating interface’s MAC address (example: enx78e7d1ea46da), is not used by default, but is available if the user chooses.
  • Scheme 5: The traditional unpredictable kernel naming scheme, is used if all other methods fail (example: eth0).

6.2. Configuration réseau

La commande ifconfig est devenue obsolète et est toujours disponible pour des soucis de compatibilités avec les VMWare Tools. Pour configurer le réseau, il faut passer de préférence par les commandes ip et nmcli ou nmtui pour avoir une interface ncurse plus user friendly.

6.3. Remplacement de NTPD

NTPD a été remplacé par chronyd qui est adapté pour les systèmes qui redémarre ou déconnecté fréquemment. Ainsi, une source de temps accessible seulement par intermittence est possible. Il se synchronise plus vite et par défaut ne fait pas de saut brusque dans le temps. Je vous laisse lire cet intéressant article qui l’explique très bien.

6.4. Pare-feu : firewalld

L’interface pour le pare-feu est passé d’iptables à firewalld.

6.5. FS par défaut XFS

Le filesystem par défaut est désormais XFS qui apporte les fonctionnalités suivantes :

    • Complétement journalisé
    • Support pour les filesystems de 500TB
    • Pas de fsck effectué au démarrage
        Un substitue qui ne fait rien est exécuté à la place
    • Si une error est détectée dans les metadata du FS:
        Le fs est démonté et retourne EFSCORRUPTED
        La commande

xfs_repair

        peut réparer ces erreurs
        Le journal/log doit être propre pour que

xfs_repair

        puisse être exécuté
        Les commandes

mount

        et

unmount

      doivent d’abord être utilisés pour rejouer le log
  • Le numbre d’inode peut dépasser 2^32
      Ce ne devrait pas être un problème, sauf pour les appels 32-bit stat
      Un paramètre au montage existe, “-o inode32”, pour la compatibilité
  • Speculative-Preallocation est utilisé et permet de réduire la fragmentation
      Si une pré-allocation n’est pas utilisée, elle est recyclée après 5min
      Cependant, cela peut aussi augmenter temporairement l’occupation disque et causer des erreurs “ENOSPC” (No-Space-Remaining)
      Une option au montage existe, “-o allocsize=amount”, qui peut contourner ce problème en limitant des pré-allocation excessives.