108.2 Leçon 2
Certification : |
LPIC-1 |
---|---|
Version : |
5.0 |
Thème : |
108 Services Systèmes Essentiels |
Objectif : |
108.2 Journalisation du système |
Leçon : |
2 sur 2 |
Introduction
Avec l’adoption massive de systemd
par toutes les principales distributions, le démon de journalisation (systemd-journald
) est devenu le service de journalisation par défaut. Dans cette leçon, nous allons discuter son fonctionnement et son utilisation pour faire un certain nombre de choses : le consulter, filtrer les informations selon différents critères, configurer le stockage et la taille, effacer les données périmées, récupérer les données depuis un système de secours ou une copie du système de fichiers et — enfin et surtout — comprendre son interaction avec rsyslogd
.
Bases de systemd
Présenté initialement sous Fedora, systemd
a progressivement remplacé SysV Init en tant que gestionnaire de système et de services dans la plupart des grandes distributions Linux. Voici quelques-uns de ses principaux atouts :
-
Facilité de configuration : fichiers d’unité par opposition aux scripts SysV Init.
-
Gestion polyvalente : en dehors des démons et des processus, il gère également les périphériques, les sockets et les points de montage.
-
Rétrocompatibilité avec SysV Init et Upstart.
-
Chargement parallèle à l’amorçage : les services sont chargés en parallèle, alors que Sysv Init les charge l’un après l’autre.
-
Il dispose d’un service de journalisation nommé journal avec les avantages suivants :
-
Tous les journaux sont centralisés en un seul endroit.
-
Il n’a pas besoin de rotation des journaux.
-
Les journaux peuvent être désactivés, chargés dans la RAM ou rendus persistants.
-
Unités et cibles
systemd
fonctionne sur des unités (units). Une unité est une ressource que systemd
peut gérer (par exemple le réseau, le Bluetooth, etc.). Les unités — à leur tour — sont gouvernées par des fichiers d’unité. Ce sont des fichiers texte rangés dans /lib/systemd/system
et qui incluent les paramètres de configuration — sous forme de sections et de directives — pour une ressource particulière à gérer. Il existe un certain nombre de types d’unités : service
, mount
, automount
, swap
, timer
, device
, socket
, path
, timer
, snapshot
, slice
, scope
et target
. Ainsi, chaque nom de fichier d’unité suit le schéma <ressource>.<unité>
(par exemple reboot.service
).
Une cible (target) est un type d’unité spécial qui ressemble aux niveaux d’exécution (runlevels) classiques de SysV Init. C’est parce qu’une unité cible (target unit) rassemble différentes ressources pour représenter un état particulier du système (par exemple, graphical.target
est similaire à runlevel 5
, etc). Pour vérifier la cible en cours dans votre système, utilisez la commande systemctl get-default
:
carol@debian:~$ systemctl get-default graphical.target
D’autre part, les cibles et les niveaux d’exécution diffèrent en ce que les premières sont mutuellement inclusives, alors que les seconds ne le sont pas. Ainsi, une cible peut lancer d’autres cibles, ce qui n’est pas possible avec les niveaux d’exécution.
Note
|
L’explication du fonctionnement des unités |
Le journal du système : systemd-journald
systemd-journald
est le service système qui se charge de recevoir les informations de journalisation depuis plusieurs sources : les messages du noyau, les journaux simples et structurés du système, la sortie standard et l’erreur standard des services ainsi que les enregistrements d’audit du sous-système d’audit du noyau (pour plus de détails, voir la page de manuel de systemd-journald
). Sa mission consiste à créer et à maintenir un journal structuré et indexé.
Son fichier de configuration est /etc/systemd/journald.conf
et — comme pour tout autre service — vous pouvez utiliser la commande systemctl
pour le démarrer, le redémarrer, l’arrêter ou — simplement — vérifier son état :
root@debian:~# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled) Active: active (running) since Sat 2019-10-12 13:43:06 CEST; 5min ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 178 (systemd-journal) Status: "Processing requests..." Tasks: 1 (limit: 4915) CGroup: /system.slice/systemd-journald.service └─178 /lib/systemd/systemd-journald (...)
Les fichiers de configuration du type journal.conf.d/*.conf
— qui peuvent inclure des configurations spécifiques à un paquet — sont également possibles (consultez la page de manuel de journald.conf
pour en savoir plus).
Si le journal est activé, il peut être stocké de manière persistante sur le disque ou de manière volatile sur un système de fichiers en mémoire vive. Le journal n’est pas un fichier texte, c’est un fichier binaire. Ainsi, vous ne pourrez pas utiliser des outils textuels tels que less
ou more
pour lire son contenu ; la commande journalctl
sera utilisée à la place.
Interroger le contenu du journal
journalctl
est l’outil que vous utiliserez pour interroger le journal systemd
. Vous devez être root ou utiliser sudo
pour l’invoquer. S’il est invoqué sans options, il affichera l’intégralité du journal par ordre chronologique (les entrées les plus anciennes sont affichées en premier) :
root@debian:~# journalctl -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:19:46 CEST. -- Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (...) Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu (...)
Vous pouvez effectuer des requêtes plus spécifiques en utilisant un certain nombre d’options :
-r
-
Les messages du journal seront affichés dans l’ordre inverse :
root@debian:~# journalctl -r -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:30:30 CEST. -- Oct 12 14:30:30 debian sudo[1356]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:30:30 debian sudo[1356]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -r Oct 12 14:19:53 debian sudo[1348]: pam_unix(sudo:session): session closed for user root (...)
-f
-
Cette option va afficher les messages les plus récents du journal et continuer à afficher les nouvelles entrées au fur et à mesure qu’elles s’y ajoutent — un peu comme
tail -f
:root@debian:~# journalctl -f -- Logs begin at Sat 2019-10-12 13:43:06 CEST. -- (...) Oct 12 14:44:42 debian sudo[1356]: pam_unix(sudo:session): session closed for user root Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) (...)
-e
-
Cette option va aller à la fin du journal, de sorte que les dernières entrées soient visibles dans le pager :
root@debian:~# journalctl -e (...) Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root Oct 12 14:48:39 debian sudo[1378]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -e Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by carol(uid=0)
-n <valeur>, --lines=<valeur>
-
Cette option va afficher les valeur dernières lignes (si
<valeur>
n’est pas spécifiée, elle vaut 10 par défaut) :root@debian:~# journalctl -n 5 (...) Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root Oct 12 14:48:39 debian sudo[1378]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -e Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by carol(uid=0)
-k
,--dmesg
-
Équivaut à la commande
dmesg
:root@debian:~# journalctl -k -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:53:20 CEST. -- Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18 Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' (...)
Navigation et recherche dans le journal
Vous pouvez naviguer dans les résultats du journal avec :
-
PageHaut, PageBas et les touches fléchées pour vous déplacer vers le haut, le bas, la gauche et la droite.
-
> pour aller à la fin du résultat.
-
< pour aller au début du résultat.
Vous pouvez rechercher des chaînes de caractères en aval et en amont de votre position actuelle :
-
Recherche en aval : Appuyez sur / et entrez la chaîne à rechercher, puis appuyez sur Entrée.
-
Recherche en amont : Appuyez sur ? et entrez la chaîne à rechercher, puis appuyez sur Entrée.
Pour naviguer dans les résultats de la recherche, utilisez N pour passer à l’occurrence suivante d’une correspondance et Shift+N pour passer à l’occurrence précédente.
Filtrer les données du journal
Le journal vous permet de filtrer les données des fichiers de journalisation selon un certain nombre de critères :
- Numéro d’amorçage
-
--list-boots
-
Cette option affiche tous les amorçages disponibles. Le résultat consiste en trois colonnes ; la première spécifie le numéro d’amorçage (
0
se réfère à l’amorçage actuel,-1
est l’amorçage précédent,-2
celui qui précède l’amorçage précédent et ainsi de suite) ; la deuxième colonne est l’ID de l’amorçage ; la troisième affiche les horodatages :root@debian:~# journalctl --list-boots 0 83df3e8653474ea5aed19b41cdb45b78 Sat 2019-10-12 18:55:41 CEST—Sat 2019-10-12 19:02:24 CEST
-b
,--boot
-
Cette option affiche tous les messages de l’amorçage en cours. Pour voir les messages des amorçages précédents, il suffit d’ajouter un paramètre de décalage comme expliqué ci-dessus. Par exemple, pour afficher les messages de l’amorçage précédent, vous devrez taper
journalctl -b -1
. Ceci étant dit, rappelez-vous que pour récupérer les informations des journaux précédents, la persistance du journal doit être activée (vous apprendrez comment le faire dans la section suivante) :root@debian:~# journalctl -b -1 Specifying boot ID has no effect, no persistent journal was found
- Priorité
-
-p
-
Noter que vous pouvez également filtrer par niveau de sévérité/priorité avec l’option
-p
:root@debian:~# journalctl -b -0 -p err -- No entries --
Le journal nous informe que — jusqu’ici du moins — il n’y a pas eu de messages avec une priorité
error
(ou plus) depuis l’amorçage en cours. Remarque :-b -0
peut être omis lorsqu’il s’agit de l’amorçage en cours.NoteReportez-vous à la leçon précédente pour une liste complète de tous les niveaux de sévérité (ou priorités) de
syslog
.
- Intervalle de temps
-
Vous pouvez demander à
journalctl
de n’afficher que les messages enregistrés dans un intervalle de temps donné avec les options--since
et--until
. La spécification de la date doit suivre le formatYYYY-MM-DD HH:MM:SS
. Si le temps n’est pas spécifié, c’est minuit qui sera pris en compte. De même, si la date est omise, c’est la date du jour qui est prise en compte. Par exemple, pour voir les messages enregistrés entre 19h00 et 19h01, vous devez taper :root@debian:~# journalctl --since "19:00:00" --until "19:01:00" -- Logs begin at Sat 2019-10-12 18:55:41 CEST, end at Sat 2019-10-12 20:10:50 CEST. -- Oct 12 19:00:14 debian systemd[1]: Started Run anacron jobs. Oct 12 19:00:14 debian anacron[1057]: Anacron 2.3 started on 2019-10-12 Oct 12 19:00:14 debian anacron[1057]: Normal exit (0 jobs run) Oct 12 19:00:14 debian systemd[1]: anacron.timer: Adding 2min 47.988096s random time.
De même, vous pouvez utiliser une spécification de temps légèrement différente (un nombre entier avec l’unité du temps et le mot ago) :
"integer time-unit ago"
. Ainsi, pour voir les messages enregistrés il y a deux minutes, vous devrez tapersudo journalctl --since "2 minutes ago"
. Il est également possible d’utiliser+
et-
pour spécifier des temps relatifs au temps actuel, ainsi--since "-2 minutes"
et--since "2 minutes ago"
sont équivalents.En dehors des expressions numériques, vous pouvez spécifier un certain nombre de mots-clés :
yesterday
-
À partir de minuit le jour précédant la journée en cours.
today
-
À partir de minuit la journée en cours.
tomorrow
-
À partir de minuit après la journée en cours.
now
-
Maintenant.
Voyons tous les messages depuis minuit jusqu’à 21 heures aujourd’hui :
root@debian:~# journalctl --since "today" --until "21:00:00" -- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:06:15 CEST. -- Oct 12 20:45:29 debian sudo[1416]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/systemctl r Oct 12 20:45:29 debian sudo[1416]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 20:45:29 debian systemd[1]: Stopped Flush Journal to Persistent Storage. (...)
NotePour en savoir plus sur les différentes syntaxes des spécifications de temps, consultez la page de manuel
systemd.time
.
- Programme
-
Pour voir les messages du journal relatifs à un exécutable donné, la syntaxe suivante est utilisée :
journalctl /path/to/executable
:root@debian:~# journalctl /usr/sbin/sshd -- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:54:49 CEST. -- Oct 12 21:16:28 debian sshd[1569]: Accepted password for carol from 192.168.1.65 port 34050 ssh2 Oct 12 21:16:28 debian sshd[1569]: pam_unix(sshd:session): session opened for user carol by (uid=0) Oct 12 21:16:54 debian sshd[1590]: Accepted password for carol from 192.168.1.65 port 34052 ssh2 Oct 12 21:16:54 debian sshd[1590]: pam_unix(sshd:session): session opened for user carol by (uid=0)
- Unité
-
Une unité est une ressource gérée par
systemd
et vous pouvez également filtrer par unité.-u
-
Cette option affiche les messages relatifs à une unité donnée :
root@debian:~# journalctl -u ssh.service -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 12:22:59 CEST. -- Oct 13 10:51:00 debian systemd[1]: Starting OpenBSD Secure Shell server... Oct 13 10:51:00 debian sshd[409]: Server listening on 0.0.0.0 port 22. Oct 13 10:51:00 debian sshd[409]: Server listening on :: port 22. (...)
NotePour afficher toutes les unités chargées et actives, utilisez
systemctl list-units
; pour voir tous les fichiers d’unités installés, utilisezsystemctl list-unit-files
.
- Champs
-
Le journal peut également être filtré en fonction de certains champs grâce à l’une des syntaxes suivantes :
-
<field-name>=<value>
-
_<field-name>=<value>_
-
__<field-name>=<value>
PRIORITY=
-
Une des huit valeurs possibles de la priorité
syslog
formatée comme une chaîne décimale :root@debian:~# journalctl PRIORITY=3 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:30:50 CEST. -- Oct 13 10:51:00 debian avahi-daemon[314]: chroot.c: open() failed: No such file or directory
Notez que vous auriez pu obtenir le même résultat en utilisant la commande
sudo journalctl -p err
que nous avons vue plus haut. SYSLOG_FACILITY=
-
Tout code de ressource possible formaté sous forme de chaîne décimale. Par exemple, pour voir tous les messages du niveau des utilisateurs :
root@debian:~# journalctl SYSLOG_FACILITY=1 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:42:52 CEST. -- Oct 13 10:50:59 debian mtp-probe[227]: checking bus 1, device 2: "/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1" Oct 13 10:50:59 debian mtp-probe[227]: bus: 1, device: 2 was not an MTP device Oct 13 10:50:59 debian mtp-probe[238]: checking bus 1, device 2: "/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1" Oct 13 10:50:59 debian mtp-probe[238]: bus: 1, device: 2 was not an MTP device
_PID=
-
Afficher les messages produits par un processus donné. Pour voir tous les messages générés par
systemd
, vous devez taper :root@debian:~# journalctl _PID=1 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:50:15 CEST. -- Oct 13 10:50:59 debian systemd[1]: Mounted Debug File System. Oct 13 10:50:59 debian systemd[1]: Mounted POSIX Message Queue File System. Oct 13 10:50:59 debian systemd[1]: Mounted Huge Pages File System. Oct 13 10:50:59 debian systemd[1]: Started Remount Root and Kernel File Systems. Oct 13 10:50:59 debian systemd[1]: Starting Flush Journal to Persistent Storage... (...)
_BOOT_ID
-
En vous basant sur l’identifiant d’amorçage, vous pouvez isoler les messages provenant d’un amorçage spécifique, par exemple :
sudo journalctl _BOOT_ID=83df3e8653474ea5aed19b41cdb45b78
. _TRANSPORT
-
Afficher les messages reçus d’un sous-système spécifique. Les valeurs possibles sont :
audit
(sous-système d’audit du noyau),driver
(généré en interne),syslog
(socket syslog),journal
(protocole natif du journal),stdout
(sortie standard des services ou erreur standard),kernel
(mémoire tampon circulaire du noyau — la même quedmesg
,journalctl -k
oujournalctl --dmesg
) :root@debian:~# journalctl _TRANSPORT=journal -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:46:36 CEST. -- Oct 13 20:19:58 debian systemd[1]: Started Create list of required static device nodes for the current kernel. Oct 13 20:19:58 debian systemd[1]: Starting Create Static Device Nodes in /dev... Oct 13 20:19:58 debian systemd[1]: Started Create Static Device Nodes in /dev. Oct 13 20:19:58 debian systemd[1]: Starting udev Kernel Device Manager... (...)
-
Combiner les champs
Les champs ne s’excluent pas mutuellement et vous pouvez donc en utiliser plusieurs dans la même requête. En revanche, seuls les messages qui correspondent simultanément à la valeur des deux champs seront affichés :
root@debian:~# journalctl PRIORITY=3 SYSLOG_FACILITY=0 -- No entries -- root@debian:~# journalctl PRIORITY=4 SYSLOG_FACILITY=0 -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:21:55 CEST. -- Oct 13 20:19:58 debian kernel: acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended PCI configuration (...)
Sauf si vous utilisez le séparateur +
pour combiner deux expressions à la manière d’un OU logique :
root@debian:~# journalctl PRIORITY=3 + SYSLOG_FACILITY=0 -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:24:02 CEST. -- Oct 13 20:19:58 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (...9 Oct 13 20:19:58 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID= (...) (...)
D’autre part, vous pouvez fournir deux valeurs pour le même champ et toutes les entrées correspondant à l’une ou l’autre valeur seront affichées :
root@debian:~# journalctl PRIORITY=1 -- Logs begin at Sun 2019-10-13 17:16:24 CEST, end at Sun 2019-10-13 17:30:14 CEST. -- -- No entries -- root@debian:~# journalctl PRIORITY=1 PRIORITY=3 -- Logs begin at Sun 2019-10-13 17:16:24 CEST, end at Sun 2019-10-13 17:32:12 CEST. -- Oct 13 17:16:27 debian connmand[459]: __connman_inet_get_pnp_nameservers: Cannot read /pro Oct 13 17:16:27 debian connmand[459]: The name net.connman.vpn was not provided by any .se
Note
|
Les champs du journal appartiennent à l’une des catégories suivantes : “Champs du journal de l’utilisateur”, “Champs du journal de confiance”, “Champs du journal du noyau”, “Champs pour le compte d’un programme différent” et “Champs d’adresse”. Pour plus d’informations sur ce sujet — y compris une liste complète des champs — voir la page |
Entrées manuelles dans le journal du système : systemd-cat
Tout comme la commande logger
est utilisée pour envoyer des messages de la ligne de commande vers le journal du système (comme nous l’avons vu dans la leçon précédente), la commande systemd-cat
sert un but similaire — mais plus étoffé — avec le journal du système. Elle nous permet d’envoyer l’entrée standard (stdin), la sortie standard (stdout) et l’erreur standard (stderr) au journal.
Invoqué sans paramètres, elle enverra tout ce qu’elle lit dans stdin vers le journal. Une fois que vous avez terminé, appuyez sur Ctrl+C:.
carol@debian:~$ systemd-cat This line goes into the journal. ^C
Si le résultat d’une commande lui est transmise par un pipe, elle sera également envoyée au journal :
carol@debian:~$ echo "And so does this line." | systemd-cat
Si elle est suivie d’une commande, la sortie de cette commande sera également envoyée au journal — ainsi que stderr (le cas échéant) :
carol@debian:~$ systemd-cat echo "And so does this line too."
Vous pouvez également spécifier un niveau de priorité avec l’option -p
:
carol@debian:~$ systemd-cat -p emerg echo "This is not a real emergency."
Lisez la page de manuel de systemd-cat
pour en savoir plus sur les autres options.
Pour voir les quatre dernières lignes du journal :
carol@debian:~$ journalctl -n 4 (...) -- Logs begin at Sun 2019-10-20 13:43:54 CEST. -- Nov 13 23:14:39 debian cat[1997]: This line goes into the journal. Nov 13 23:19:16 debian cat[2027]: And so does this line. Nov 13 23:23:21 debian echo[2030]: And so does this line too. Nov 13 23:26:48 debian echo[2034]: This is not a real emergency.
Note
|
Les entrées de journal dont le niveau de priorité est emergency s’affichent en gros caractères rouges sur la plupart des systèmes. |
Stockage persistant du journal
Comme nous l’avons déjà dit, vous avez trois choix pour l’emplacement du journal :
-
La journalisation peut être complètement désactivée (la redirection vers d’autres ressources comme la console est toujours possible).
-
Le garder en mémoire — ce qui le rend volatile — et vous débarrasser des journaux à chaque réamorçage du système. Dans ce scénario, le répertoire
/run/log/journal
sera créé et utilisé. -
Le rendre persistant de manière à ce que les journaux soient écrits sur le disque. Dans ce cas, les messages de journalisation iront dans le répertoire
/var/log/journal
.
Voici le comportement par défaut : si /var/log/journal/
n’existe pas, les journaux seront sauvegardés de manière éphémère dans un répertoire sous /run/log/journal/
et — par conséquent — perdus au réamorçage. Le nom du répertoire — le /etc/machine-id
— est une chaîne de 32 caractères hexadécimaux en minuscules, terminée par un retour chariot :
carol@debian:~$ ls /run/log/journal/8821e1fdf176445697223244d1dfbd73/ system.journal
Si vous essayez de le lire avec la commande less
, vous obtiendrez un avertissement. Utilisez plutôt la commande journalctl
:
root@debian:~# less /run/log/journal/9a32ba45ce44423a97d6397918de1fa5/system.journal "/run/log/journal/9a32ba45ce44423a97d6397918de1fa5/system.journal" may be a binary file. See it anyway? root@debian:~# journalctl -- Logs begin at Sat 2019-10-05 21:26:38 CEST, end at Sat 2019-10-05 21:31:27 CEST. -- (...) Oct 05 21:26:44 debian systemd-journald[1712]: Runtime journal (/run/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 4.9M, max 39.5M, 34.6M free. Oct 05 21:26:44 debian systemd[1]: Started Journal Service. (...)
Si /var/log/journal/
existe, les journaux y seront stockés de manière persistante. Si ce répertoire est supprimé, systemd-journald
ne va pas le recréer mais plutôt écrire dans /run/log/journal
. Dès que nous recréons /var/log/journal/
et que nous redémarrons le démon, l’enregistrement persistant sera rétabli :
root@debian:~# mkdir /var/log/journal/ root@debian:~# systemctl restart systemd-journald root@debian:~# journalctl (...) Oct 05 21:33:49 debian systemd-journald[1712]: Received SIGTERM from PID 1 (systemd). Oct 05 21:33:49 debian systemd[1]: Stopped Journal Service. Oct 05 21:33:49 debian systemd[1]: Starting Journal Service... Oct 05 21:33:49 debian systemd-journald[1768]: Journal started Oct 05 21:33:49 debian systemd-journald[1768]: System journal (/var/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 8.0M, max 1.1G, 1.1G free. Oct 05 21:33:49 debian systemd[1]: Started Journal Service. Oct 05 21:33:49 debian systemd[1]: Starting Flush Journal to Persistent Storage... (...)
Note
|
Par défaut, vous aurez des fichiers journaux spécifiques pour chaque utilisateur connecté, situés dans |
En plus de ce que nous venons de voir, la façon dont le démon de journalisation gère le stockage des journaux peut être modifiée après l’installation en adaptant son fichier de configuration : /etc/systemd/journald.conf
. L’option clé est Storage=
et elle peut prendre les valeurs suivantes :
Storage=volatile
-
Les données du journal seront stockées en mémoire exclusivement — sous
/run/log/journal/
. S’il n’est pas présent, le répertoire sera créé. Storage=persistent
-
Par défaut, les données du journal seront stockées sur le disque — sous
/var/log/journal/
— avec un basculement vers la mémoire (/run/log/journal/
) pendant les premières phases d’amorçage et si le disque n’est pas accessible en écriture. Les deux répertoires seront créés si nécessaire. Storage=auto
-
auto
fonctionne commepersistent
, mais le répertoire/var/log/journal
n’est pas créé en cas de besoin. C’est la valeur par défaut. Storage=none
-
Toutes les données de journalisation seront rejetées. Le transfert vers d’autres ressources comme la console, la mémoire tampon circulaire du noyau ou une socket
syslog
est toujours possible.
Par exemple, pour que systemd-journald
crée /var/log/journal/
et passe à un stockage persistant, vous devez éditer /etc/systemd/journald.conf
et mettre Storage=persistent
, sauvegarder le fichier et redémarrer le démon avec sudo systemctl restart systemd-journald
. Pour vous assurer que le redémarrage s’est déroulé sans problème, vous pouvez toujours vérifier l’état du service :
root@debian:~# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled) Active: active (running) since Wed 2019-10-09 10:03:40 CEST; 2s ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 1872 (systemd-journal) Status: "Processing requests..." Tasks: 1 (limit: 3558) Memory: 1.1M CGroup: /system.slice/systemd-journald.service └─1872 /lib/systemd/systemd-journald Oct 09 10:03:40 debian10 systemd-journald[1872]: Journal started Oct 09 10:03:40 debian10 systemd-journald[1872]: System journal (/var/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 8.0M, max 1.2G, 1.2G free.
Note
|
Les fichiers journaux dans |
Supprimer les anciennes données du journal : taille du journal
Les journaux sont enregistrés dans des fichiers journaux dont les noms se terminent par .journal
ou .journal~
et situés dans le répertoire approprié (/run/log/journal
ou /var/log/journal
selon la configuration). Pour vérifier l’espace disque occupé par les fichiers journaux (archivés et actifs), utilisez l’option --disk-usage
:
root@debian:~# journalctl --disk-usage Archived and active journals take up 24.0M in the filesystem.
Les journaux systemd
sont limités par défaut à 10% de la taille du système de fichiers dans lequel ils sont enregistrés. Par exemple, sur un système de fichiers de 1 Go, ils ne prendront pas plus de 100 Mo. Une fois cette limite atteinte, les anciens journaux commenceront à disparaître pour rester proche de cette valeur.
En revanche, on peut limiter la taille des fichiers journaux stockés en adaptant une série d’options de configuration dans le fichier /etc/systemd/journald.conf
. Ces options se déclinent en deux catégories selon le type de système de fichiers utilisé : persistant (/var/log/journal
) ou en mémoire (/run/log/journal
). La première catégorie utilise des options préfixées par le mot System
et ne s’applique que si la journalisation persistante est correctement activée et une fois que le système est entièrement amorcé. Les noms des options de la seconde commencent par le mot Runtime
et vont s’appliquer dans les scénarios suivants :
SystemMaxUse=
,RuntimeMaxUse=
-
Ces options déterminent la quantité d’espace disque qui peut être occupée par le journal. La valeur par défaut est de 10% de la taille du système de fichiers, mais elle peut être modifiée (par exemple
SystemMaxUse=500M
) tant qu’elle ne dépasse pas un maximum de 4 Gio. SystemKeepFree=
,RuntimeKeepFree=
-
Ces options déterminent la quantité d’espace disque qui doit être laissée libre pour les autres utilisateurs. Elle est fixée par défaut à 15% de la taille du système de fichiers mais peut être modifiée (par exemple
SystemKeepFree=500M
) tant qu’elle ne dépasse pas un maximum de 4 Gio.En ce qui concerne la priorité de
*MaxUse
et*KeepFree
,systemd-journald
va satisfaire les deux en utilisant la plus petite des deux valeurs. De même, gardez à l’esprit que seuls les fichiers journaux archivés (par opposition aux fichiers actifs) seront supprimés. SystemMaxFileSize=
,RuntimeMaxFileSize=
-
Ces options déterminent la taille maximale que peuvent atteindre les fichiers individuels du journal. La valeur par défaut est 1/8 de
*MaxUse
. La réduction de taille s’effectue de manière synchrone et les valeurs peuvent être spécifiées en octets ou en utilisantK
,M
,G
,T
,P
,E
pour kibioctet, mébioctet, gibioctet, tébioctet, pébioctet et exbioctet, respectivement. SystemMaxFiles=
,RuntimeMaxFiles=
-
Ces options déterminent le nombre maximum de fichiers journaux individuels et archivés à stocker (les fichiers journaux actifs ne sont pas affectés). La valeur par défaut est 100.
En dehors de la suppression et de la rotation des messages de journalisation basées sur la taille, systemd-journald
permet également des critères basés sur le temps en utilisant les deux options suivantes : MaxRetentionSec=
et MaxFileSec=
. Reportez-vous à la page de manuel de journald.conf
pour plus d’informations sur ces options et bien d’autres.
Note
|
Chaque fois que vous modifiez le comportement par défaut de |
Faire le ménage dans le journal
Vous pouvez à tout moment nettoyer manuellement les fichiers journaux archivés à l’aide de l’une des trois options suivantes :
--vacuum-time=
-
Cette option basée sur le temps supprime tous les messages des fichiers journaux dont l’horodatage est antérieur à la période spécifiée. Les valeurs devront être écrites avec l’un des suffixes suivants :
s
,m
,h
,days
(oud
),months
,weeks
(ouw
) etyears
(ouy
). Par exemple, pour vous débarrasser de tous les messages dans les fichiers journaux archivés qui datent de plus d’un mois :root@debian:~# journalctl --vacuum-time=1months Deleted archived journal /var/log/journal/7203088f20394d9c8b252b64a0171e08/system@27dd08376f71405a91794e632ede97ed-0000000000000001-00059475764d46d6.journal (16.0M). Deleted archived journal /var/log/journal/7203088f20394d9c8b252b64a0171e08/user-1000@e7020d80d3af42f0bc31592b39647e9c-000000000000008e-00059479df9677c8.journal (8.0M).
--vacuum-size=
-
Cette option basée sur la taille supprimera les fichiers journaux archivés jusqu’à ce qu’ils occupent une valeur inférieure à la taille spécifiée. Les valeurs devront être écrites avec l’un des suffixes suivants :
K
,M
,G
ouT
. Par exemple, pour éliminer les fichiers journaux archivés jusqu’à ce qu’ils soient inférieurs à 100 mébioctets :root@debian:~# journalctl --vacuum-size=100M Vacuuming done, freed 0B of archived journals from /run/log/journal/9a32ba45ce44423a97d6397918de1fa5.
--vacuum-files=
-
Cette option veille à ce qu’il ne reste pas plus de fichiers journaux archivés que le nombre spécifié. La valeur spécifiée est un nombre entier. Par exemple, pour limiter le nombre de fichiers journaux archivés à 10 :
root@debian:~# journalctl --vacuum-files=10 Vacuuming done, freed 0B of archived journals from /run/log/journal/9a32ba45ce44423a97d6397918de1fa5.
Le nettoyage supprime uniquement les fichiers journaux archivés. Si vous souhaitez vous débarrasser de tout (y compris des fichiers journaux actifs), vous devrez utiliser un signal (SIGUSR2
) qui demande la rotation immédiate des fichiers journaux avec l’option --rotate
. D’autres signaux importants peuvent être invoqués avec les options suivantes :
--flush
(SIGUSR1)
-
Cette option lance le transfert des fichiers du journal de
/run/
vers/var/
pour rendre le journal persistant. Elle nécessite l’activation de la journalisation persistante et le montage de/var/
. --sync
(SIGRTMIN+1
)-
Cette option est utilisée pour déclencher l’écriture de toutes les données non enregistrées du journal sur le disque.
Note
|
Pour vérifier la cohérence interne du fichier journal, utilisez |
Récupérer les données d’un journal à partir d’un système de secours
En tant qu’administrateur système, vous pouvez vous retrouver dans une situation où vous devez accéder à des fichiers journaux sur le disque dur d’une machine défectueuse par le biais d’un système de secours (un CD amorçable ou une clé USB contenant une distribution Linux live).
journalctl
recherche les fichiers journaux dans /var/log/journal/<machine-id>/
. Étant donné que les identifiants de machine sur le système de secours et le système défectueux seront différents, vous devrez utiliser l’option suivante :
-D </path/to/dir>
,--directory=</path/to/dir>
-
Avec cette option, nous spécifions le chemin du répertoire dans lequel
journalctl
cherchera les fichiers journaux au lieu des emplacements par défaut du système en cours d’exécution.
Il est donc nécessaire de monter la racine du système défectueux (/dev/sda1
) sur le système de fichiers de secours pour y lire les fichiers journaux comme ceci :
root@debian:~# journalctl -D /media/carol/faulty.system/var/log/journal/ -- Logs begin at Sun 2019-10-20 12:30:45 CEST, end at Sun 2019-10-20 12:32:57 CEST. -- oct 20 12:30:45 suse-server kernel: Linux version 4.12.14-lp151.28.16-default (geeko@buildhost) (...) oct 20 12:30:45 suse-server kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.12.14-lp151.28.16-default root=UUID=7570f67f-4a08-448e-aa09-168769cb9289 splash=> oct 20 12:30:45 suse-server kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' oct 20 12:30:45 suse-server kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' (...)
D’autres options peuvent être utiles dans ce contexte :
-m
,--merge
-
Cette option fusionne les entrées de tous les journaux disponibles dans
/var/log/journal
, y compris les journaux distants. --file
-
Cette option va afficher les entrées dans un fichier donné, par exemple :
journalctl --file /var/log/journal/64319965bda04dfa81d3bc4e7919814a/user-1000.journal
. --root
-
Un chemin signifiant que le répertoire racine est passé en argument.
journalctl
y recherchera les fichiers journaux (par exemplejournalctl --root /faulty.system/
).
Consultez la page de manuel journalctl
pour plus d’informations.
Transférer les données de journalisation vers un démon syslog
traditionnel
Les données du journal peuvent être mises à disposition d’un démon syslog
traditionnel :
-
En transférant les messages vers le fichier socket
/run/systemd/journal/syslog
pour quesyslogd
les lise. Cette fonctionnalité est activée avec l’optionForwardToSyslog=yes
. -
Avec un démon
syslog
qui se comporte commejournalctl
et qui lit les messages de journalisation directement depuis les fichiers journaux. Dans ce cas, l’option pertinente est celle deStorage
; elle doit avoir une valeur autre quenone
.
Note
|
De même, vous pouvez transférer les messages de journalisation vers d’autres destinations avec les options suivantes : |
Exercices guidés
-
En supposant que vous soyez
root
, complétez le tableau avec les commandesjournalctl
appropriées :Objectif Commande Afficher les messages du noyau
Afficher les messages du deuxième amorçage depuis le début du journal
Afficher les messages du deuxième amorçage depuis la fin du journal
Afficher les messages de journal les plus récents et continuer à surveiller les nouveaux messages
Afficher uniquement les nouveaux messages depuis maintenant et mettre à jour les résultats en permanence
Afficher les messages de l’amorçage précédent avec un niveau de priorité
warning
et dans l’ordre inverse -
Le comportement du démon de journalisation en ce qui concerne le stockage est principalement contrôlé par la valeur de l’option
Storage
dans/etc/systemd/journald.conf
. Indiquez quel comportement est lié à quelle valeur dans le tableau suivant :Comportement Storage=auto
Storage=none
Storage=persistent
Storage=volatile
Les données du journal sont jetées, mais le transfert est possible.
Une fois le système amorcé, les données du journal seront stockées dans
/var/log/journal
. S’il n’est pas déjà présent, le répertoire sera créé.Une fois le système amorcé, les données du journal seront stockées dans
/var/log/journal
. S’il n’est pas déjà présent, le répertoire ne sera pas créé.Les données du journal seront stockées dans
/var/run/journal
, mais ne seront pas conservées après un réamorçage. -
Comme vous l’avez appris, le journal peut être vidé manuellement en fonction du temps, de la taille et du nombre de fichiers. Effectuez les tâches suivantes en utilisant
journalctl
avec les options appropriées :-
Vérifiez l’espace disque occupé par les fichiers du journal :
-
Réduisez l’espace réservé aux fichiers journaux archivés et fixez-le à 200 Mio :
-
Vérifiez à nouveau l’espace disque et expliquez le résultat :
-
Exercices d’approfondissement
-
Quelles options devez-vous modifier dans
/etc/systemd/journald.conf
pour que les messages soient transférés vers/dev/tty5
? Quelles sont les valeurs à donner à ces options ? -
Fournissez le filtre
journalctl
correct pour afficher ce qui suit :Objectif Filtre + Valeur Afficher les messages appartenant à un utilisateur spécifique
Afficher les messages provenant d’un hôte nommé
debian
Afficher les messages appartenant à un groupe spécifique
Afficher les messages appartenant à
root
En fonction du chemin d’accès de l’exécutable, afficher les messages
sudo
En fonction du nom de la commande, afficher les messages
sudo
-
Lors du filtrage par priorité, les journaux dont la priorité est supérieure à celle indiquée seront également inclus dans la liste ; par exemple
journalctl -p err
affichera les messages error, critical, alert et emergency. Cependant, vous pouvez demander àjournalctl
de n’afficher qu’une plage spécifique. Quelle commande utiliseriez-vous pour quejournalctl
n’affiche que les messages des niveaux de priorité warning, error et critical ? -
Les niveaux de priorité peuvent également être spécifiés de manière numérique. Réécrivez la commande de l’exercice précédent en utilisant la notation numérique des niveaux de priorité :
Résumé
Voici ce que nous avons vu dans cette leçon :
-
Les avantages liés au choix de
systemd
comme gestionnaire de services. -
Les fondamentaux des unités et des cibles
systemd
. -
D’où
systemd-journald
obtient les données de journalisation. -
Les options que vous pouvez passer à
systemctl
pour contrôlersystemd-journald
:start
,status
,restart
etstop
. -
L’emplacement du fichier de configuration du journal —
/etc/systemd/journald.conf
— et ses principales options. -
Comment interroger le journal d’une manière générale et pour des données spécifiques avec des filtres.
-
Comment naviguer dans le journal et effectuer des recherches.
-
Comment gérer le stockage des fichiers journaux : en mémoire ou sur le disque.
-
Comment désactiver complètement la journalisation.
-
Comment vérifier l’espace disque occupé par le journal, appliquer des limites de taille aux fichiers journaux stockés et nettoyer manuellement les fichiers journaux archivés (vacuuming).
-
Comment récupérer les données du journal à partir d’un système de secours.
-
Comment transférer les données de journalisation à un démon
syslog
traditionnel.
Voici les commandes utilisées dans cette leçon :
systemctl
-
Contrôle le gestionnaire de système et de services
systemd
. journalctl
-
Interroge le journal de
systemd
. ls
-
Affiche le contenu d’un répertoire.
less
-
Affiche le contenu d’un fichier.
mkdir
-
Crée un répertoire.
Réponses aux exercices guidés
-
En supposant que vous soyez
root
, complétez le tableau avec les commandesjournalctl
appropriées :Objectif Commande Afficher les messages du noyau
journalctl -k
oujournalctl --dmesg
Afficher les messages du deuxième amorçage depuis le début du journal
journalctl -b 2
Afficher les messages du deuxième amorçage depuis la fin du journal
journalctl -b -2 -r
orjournalctl -r -b -2
Afficher les messages de journal les plus récents et continuer à surveiller les nouveaux messages
journalctl -f
Afficher uniquement les nouveaux messages depuis maintenant et mettre à jour les résultats en permanence
journalctl --since "now" -f
Afficher les messages de l’amorçage précédent avec un niveau de priorité
warning
et dans l’ordre inversejournalctl -b -1 -p warning -r
-
Le comportement du démon de journalisation en ce qui concerne le stockage est principalement contrôlé par la valeur de l’option
Storage
dans/etc/systemd/journald.conf
. Indiquez quel comportement est lié à quelle valeur dans le tableau suivant :Comportement Storage=auto
Storage=none
Storage=persistent
Storage=volatile
Les données du journal sont jetées, mais le transfert est possible
x
Une fois le système amorcé, les données du journal seront stockées dans
/var/log/journal
. S’il n’est pas déjà présent, le répertoire sera crééx
Une fois le système amorcé, les données du journal seront stockées dans
/var/log/journal
. S’il n’est pas déjà présent, le répertoire ne sera pas crééx
Les données du journal seront stockées dans
/var/run/journal
, mais ne seront pas conservées après un réamorçagex
-
Comme vous l’avez appris, le journal peut être vidé manuellement en fonction du temps, de la taille et du nombre de fichiers. Effectuez les tâches suivantes en utilisant
journalctl
avec les options appropriées :-
Vérifiez l’espace disque occupé par les fichiers du journal :
journalctl --disk-usage
-
Réduisez l’espace réservé aux fichiers journaux archivés et fixez-le à 200 Mio :
journalctl --vacuum-size=200M
-
Vérifiez à nouveau l’espace disque et expliquez le résultat :
journalctl --disk-usage
Il n’y a pas de corrélation car
--disk-usage
affiche l’espace occupé par les fichiers journaux actifs et archivés alors que--vacuum-size
ne s’applique qu’aux seuls fichiers archivés.
-
Réponses aux exercices d’approfondissement
-
Quelles options devez-vous modifier dans
/etc/systemd/journald.conf
pour que les messages soient transférés vers/dev/tty5
? Quelles sont les valeurs à donner à ces options ?ForwardToConsole=yes TTYPath=/dev/tty5
-
Fournissez le filtre
journalctl
correct pour afficher ce qui suit :Objectif Filtre + Valeur Afficher les messages appartenant à un utilisateur spécifique
_ID=<user-id>
Afficher les messages provenant d’un hôte nommé
debian
_HOSTNAME=debian
Afficher les messages appartenant à un groupe spécifique
_GID=<group-id>
Afficher les messages appartenant à
root
_UID=0
En fonction du chemin d’accès de l’exécutable, afficher les messages
sudo
_EXE=/usr/bin/sudo
En fonction du nom de la commande, afficher les messages
sudo
_COMM=sudo
-
Lors du filtrage par priorité, les journaux dont la priorité est supérieure à celle indiquée seront également inclus dans la liste ; par exemple
journalctl -p err
affichera les messages error, critical, alert et emergency. Cependant, vous pouvez demander àjournalctl
de n’afficher qu’une plage spécifique. Quelle commande utiliseriez-vous pour quejournalctl
n’affiche que les messages des niveaux de priorité warning, error et critical ?journalctl -p warning..crit
-
Les niveaux de priorité peuvent également être spécifiés de manière numérique. Réécrivez la commande de l’exercice précédent en utilisant la notation numérique des niveaux de priorité :
journalctl -p 4..2