RHEL7 : Résumé des changements apportés par Systemd
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
- 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.
- doivent d’abord être utilisés pour rejouer le log