Tips en Trucs 2022

Systemd journal

Bijna alle Linux distributies gebruiken vandaag Systemd om een systeem te starten. Eén van de kritiekpunten op Systemd is dat het veel meer is dan een eenvoudig opstartsysteem. Het probeert namelijk verschillende Linux subsystemen heruit te vinden.

Het traditionele Linux logsysteem was rsyslog, een moderne versie van syslog. Systemd introduceerde z'n eigen logsysteem: de journald daemon (dienst) slaat loggegevens binair op, die je opvraagt met de journalctl opdracht.

Het journald configuratiebestand

Het gedrag van de journald daemon kan je aanpassen in het configuratiebestand /etc/systemd/journald.conf. Rechtstreeks aanpassen in dit bestand wordt afgeraden. Je plaatst aangepaste parameters beter in aparte configuratiebestanden (.conf) in de map /etc/systemd/journald.conf.d/.

De bestanden binnen de map /etc/systemd/journald.conf.d/ hebben voorrang op /etc/systemd/journald.conf. Ze staan gesorteerd in lexicografische (logische) volgorde en worden in die volgorde uitgevoerd, na het hoofd configuratiebestand. Indien een bepaalde optie in verschillende bestanden voorkomt, wordt enkel de laatste effectief gebruikt.

Het /etc/systemd/journald.conf bestand bevat standaard een lijst uitgeschakelde (in commentaar geplaatste) standaard opties (voorbeeld van openSUSE).

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes
#Audit=yes

De Storage optie

De Storage optie bepaalt waar de journal gegevens worden bewaard. De standaard waarde is auto, mogelijke waarden zij:

Bij volatile worden de journal gegevens in het geheugen bewaard in de map /run/log/journal/ (/run/ is een tmpfs), waardoor het geen systeem herstart overleeft.

Bij persistent daarentegen worden de journal gegevens op de schijf bewaard in de map /var/log/journal/, die indien nodig wordt aangemaakt. Als de schijf geen schrijfrechten heeft, wordt toch /run/log/journal/ gebruikt.

De standaard auto waarde werkt zoals persistent en worden de journal gegevens bewaard in de map /var/log/journal/. Maar indien deze map niet bestaat, worden de logs in het geheugen bewaard.

Bij het gebruik van de waarde none worden er geen journal gegevens bewaard. Het doorsturen naar ander logsystemen werkt wel nog.

De Compress optie

De Compress optie bepaalt of gegevens met een grootte van meer dan 512 bytes gecomprimeerd worden bewaard. Als deze optie de boolean yes bevat is de compressie actief. Bevat deze optie een getal, dan is dit de grootte waarbij de compressie actief wordt. Deze wordt standaard in bytes uitgedrukt maar mag ook uitgebreid worden met K, M of G.

De ForwardToSyslog optie

Voor Systemd werden de logs beheerd door een syslog systeem (rsyslog). Journald kan zijn gegevens doorsluizen naar verschillende doelen, zoals tekstbestanden, terminals en zelfs naar andere netwerkapparaten.

Journald en syslog kunnen naast elkaar werken. Dit is soms nodig omdat journald sommige mogelijkheden mist, zoals gecentraliseerd loggen. Of juist omdat we de logs in tekstbestanden willen opslaan om deze met standaard Linux opdrachten te manipuleren.

De ForwardToSyslog heeft een boolean waarde. De waarde yes zorgt dat de berichten in de socket /run/systemd/journal/syslog terecht komen, waar syslog ze kan lezen. Deze optie kan je ook activeren bij het starten (boot) met de optie systemd.journald.forward_to_syslog.

Gelijkaardige opties kunnen gebruikt worden om gegevens door te sturen naar kmsg (kernel log buffer), naar een console of wall (als log berichten naar aangemelde gebruikers). Enkel de laatste optie is standaard ingeschakeld.

Journal log gegevens opvragen

Om systeem logs te onderzoeken en het systemd journal te raadplegen gebruiken we journalctl. Zonder parameters toont deze opdracht de volledige journal. Gelukkig kunnen we filteren.

Filteren op eenheid

Eén van de meest waardevolle opties van journalctl is -u (--unit). Deze optie toont enkel de berichten van een bepaalde systemd-eenheid. Om bijvoorbeeld de berichten afkomstig van de NetworkManager.service eenheid weer te geven, gebruiken we:

dany@pindabook:~> sudo journalctl -u NetworkManager
[sudo] wachtwoord voor root: 
-- Logs begin at Sun 2022-02-13 17:52:56 CET, end at Sun 2022-02-13 18:45:05 CET. --
feb 13 17:53:03 pindabook systemd[1]: Starting Network Manager...
feb 13 17:53:03 pindabook NetworkManager[1313]:   [1644771183.6311] NetworkManager (version 1.22.10) is starting... (for the f>
feb 13 17:53:03 pindabook NetworkManager[1313]:   [1644771183.6312] Read config: /etc/NetworkManager/NetworkManager.conf
feb 13 17:53:03 pindabook systemd[1]: Started Network Manager.
feb 13 17:53:03 pindabook NetworkManager[1313]:   [1644771183.6371] bus-manager: acquired D-Bus service "org.freedesktop.Netwo>
feb 13 17:53:03 pindabook NetworkManager[1313]:   [1644771183.6404] manager[0x55d95cfab070]: monitoring kernel firmware direct>
feb 13 17:53:04 pindabook NetworkManager[1313]:   [1644771184.1745] hostname: hostname: using hostnamed
...
feb 13 18:37:30 pindabook NetworkManager[1313]:   [1644773850.4020] dhcp4 (eth1): option routers              => '192.168.1.1'
feb 13 18:37:30 pindabook NetworkManager[1313]:   [1644773850.4020] dhcp4 (eth1): option subnet_mask          => '255.255.255.>
feb 13 18:37:30 pindabook NetworkManager[1313]:   [1644773850.4020] dhcp4 (eth1): state changed extended -> extended

Om enkel kernel berichten weer te geven, gebruik je de -k (--dmesg) optie.

Filteren op datum

We kunnen journald berichten filteren op datum met twee opties: -S (--since) en -U (--until). Beide opties aanvaarden datums in het formaat YYYY-MM-DD hh:mm:ss. Als je de tijd weglaat, wordt automatisch 00:00:00 gebruikt.

dany@pindabook:~> sudo journalctl --since "2022-02-13 18:59:00" --until "2022-02-13 19:00:00"
-- Logs begin at Sun 2022-02-13 17:52:56 CET, end at Sun 2022-02-13 19:05:18 CET. --
feb 13 18:59:28 pindabook NetworkManager[1313]:   [1644775168.0843] dhcp4 (eth1):   address 192.168.1.9
feb 13 18:59:28 pindabook NetworkManager[1313]:   [1644775168.0843] dhcp4 (eth1):   plen 24 (255.255.255.0)
feb 13 18:59:28 pindabook NetworkManager[1313]:   [1644775168.0843] dhcp4 (eth1):   gateway 192.168.1.1
...
feb 13 18:59:28 pindabook systemd[1]: Started Network Manager Script Dispatcher Service.
feb 13 18:59:34 pindabook org_kde_powerdevil[1968]: powerdevil: Udev device changed "/sys/devices/pci0000:00/0000:00:02.0/drm/card0/>
feb 13 18:59:38 pindabook systemd[1]: NetworkManager-dispatcher.service: Succeeded.

In plaats van volledige datums kan je de volgende aliassen gebruiken:

De recentste journald gegevens volgen

Start je journalctl met de optie -f (--follow) dan volg je de journald berichten terwijl ze zich voordoen. Dit werkt zoals je de opdracht tail met de optie -f uitvoert. Wil je enkel de laatste berichten weergeven, gebruik dan de optie -e (--pager-end).

Uitvoer opties

De uitvoer die we ontvangen van journalctl kunnen we opmaken met de optie -o (--output). Deze optie heeft als belangrijkste waarden:

De standaard short uitvoer beperkt de uitvoer tot één regel per bericht:

dany@pindabook:~> sudo journalctl --since "2022-02-14 17:52:14" --until "2022-02-14 17:52:15" -u NetworkManager
[sudo] wachtwoord voor root: 
-- Logs begin at Mon 2022-02-14 17:52:07 CET, end at Mon 2022-02-14 18:30:44 CET. --
feb 14 17:52:14 pindabook systemd[1]: Starting Network Manager...
feb 14 17:52:14 pindabook NetworkManager[1381]:   [1644857534.7907] NetworkManager (version 1.22.10) is starting... (for the f>
feb 14 17:52:14 pindabook NetworkManager[1381]:   [1644857534.7907] Read config: /etc/NetworkManager/NetworkManager.conf
feb 14 17:52:14 pindabook systemd[1]: Started Network Manager.
feb 14 17:52:14 pindabook NetworkManager[1381]:   [1644857534.7950] bus-manager: acquired D-Bus service "org.freedesktop.Netwo>
feb 14 17:52:14 pindabook NetworkManager[1381]:   [1644857534.7985] manager[0x5580d740a070]: monitoring kernel firmware direct

Deze uitvoer kan je verder beperken door te filteren met zoektermen. Daarvoor gebruik je de optie -g (--grep):

dany@pindabook:~> sudo journalctl --since "2022-02-14 17:52:14" --until "2022-02-14 17:52:15" -u NetworkManager -g "Started Network Manager"
-- Logs begin at Mon 2022-02-14 17:52:07 CET, end at Mon 2022-02-14 18:34:43 CET. --
feb 14 17:52:14 pindabook systemd[1]: Started Network Manager.

De verbose uitvoer toont alle velden van het bericht:

dany@pindabook:~> sudo journalctl --since "2022-02-14 17:52:14" --until "2022-02-14 17:52:15" -u NetworkManager -g "Started Network Manager" -o verbose
-- Logs begin at Mon 2022-02-14 17:52:07 CET, end at Mon 2022-02-14 18:36:30 CET. --
Mon 2022-02-14 17:52:14.794983 CET [s=404702ed20bc4850892ffa63085c743b;i=510;b=e3d175a0d11749dd85295bdb3f460d6a;m=a82196;t=5d7fd3d11>
    PRIORITY=6
    _BOOT_ID=e3d175a0d11749dd85295bdb3f460d6a
    _MACHINE_ID=ce5361ac5e594fd69d023ca57cadfb7e
    _HOSTNAME=pindabook
    SYSLOG_FACILITY=3
    SYSLOG_IDENTIFIER=systemd
    _UID=0
    _GID=0
    _SELINUX_CONTEXT=unconfined
    _TRANSPORT=journal
    CODE_FILE=src/core/job.c
    CODE_LINE=948
    CODE_FUNC=job_log_done_status_message
    JOB_TYPE=start
    JOB_RESULT=done
    MESSAGE_ID=39f53479d3a045ac8e11786248231fbf
    _PID=1
    _COMM=systemd
    _EXE=/usr/lib/systemd/systemd
    _CAP_EFFECTIVE=ffffffffff
    _SYSTEMD_CGROUP=/init.scope
    _SYSTEMD_UNIT=init.scope
    _SYSTEMD_SLICE=-.slice
    _CMDLINE=/usr/lib/systemd/systemd --switched-root --system --deserialize 29
    JOB_ID=271
    UNIT=NetworkManager.service
    INVOCATION_ID=9b67aa38565c4fea81dd7f08284dc69c
    MESSAGE=Started Network Manager.
    _SOURCE_REALTIME_TIMESTAMP=1644857534794983

Terwijl de json-pretty uitvoer zorgt voor een leesbaar JSON-object:

dany@pindabook:~> sudo journalctl --since "2022-02-14 17:52:14" --until "2022-02-14 17:52:15" -u NetworkManager -g "Started Network Manager" -o json-pretty
Journalctl

En verder

Wil je nog meer uit journald halen, raadpleeg dan de handleidingen met de opdrachten man journald.conf en man journalctl.