SYSTEMD-ANALYZE(1) | systemd-analyze | SYSTEMD-ANALYZE(1) |
BEZEICHNUNG
systemd-analyze - Systemverwalter analysieren und auf Fehler überprüfen
ÜBERSICHT
systemd-analyze [OPTIONEN…] [Zeit]
systemd-analyze [OPTIONEN…] blame
systemd-analyze [OPTIONEN…] critical-chain [UNIT…]
systemd-analyze [OPTIONEN…] dump [MUSTER…]
systemd-analyze [OPTIONEN…] plot [>Datei.svg]
systemd-analyze [OPTIONEN…] dot [MUSTER…] [>Datei.dot]
systemd-analyze [OPTIONEN…] unit-files
systemd-analyze [OPTIONEN…] unit-paths
systemd-analyze [OPTIONEN…] exit-status [STATUS…]
systemd-analyze [OPTIONEN…] capability [CAPABILITY…]
systemd-analyze [OPTIONEN…] condition BEDINGUNG…
systemd-analyze [OPTIONEN…] syscall-filter [GRUPPE…]
systemd-analyze [OPTIONEN…] filesystems [GRUPPE…]
systemd-analyze [OPTIONEN…] calendar SPEZ…
systemd-analyze [OPTIONEN…] timestamp ZEITSTEMPEL…
systemd-analyze [OPTIONEN…] timespan SPANNE…
systemd-analyze [OPTIONEN…] cat-config NAME|PFAD…
systemd-analyze [OPTIONEN…] compare-versions VERSION1 [OP] VERSION2
systemd-analyze [OPTIONEN…] verify DATEI…
systemd-analyze [OPTIONEN…] security [UNIT…]
systemd-analyze [OPTIONEN…] inspect-elf DATEI…
systemd-analyze [OPTIONEN…] malloc [D-BUS-DIENST…]
systemd-analyze [OPTIONEN…] fdstore UNIT…
systemd-analyze [OPTIONEN…] image-policy RICHTLINIE…
systemd-analyze [OPTIONEN…] pcrs [PCR…]
systemd-analyze [OPTIONEN…] srk [>DATEI]
systemd-analyze [OPTIONEN…] architectures [NAME…]
BESCHREIBUNG
systemd-analyze kann zur Bestimmung der Systemstartleistungsstatistik benutzt werden. Es kann Status- und Nachverfolgungsinformationen aus dem System- und Diensteverwalter abrufen und die Korrektheit von Unit-Dateien überprüfen. Es wird auch dazu verwandt, auf besondere Funktionen zuzugreifen, die für fortgeschrittene Systemverwalterfehlersuche nützlich sind.
Falls kein Befehl übergeben wird, wird systemd-analyze time impliziert.
systemd-analyze time
Dieser Befehl gibt die im Kernel verbrachte Zeit, bevor der Anwendungsbereich erreicht wurde, die Zeit, die in der Initrd verbracht wurde, bevor die normale Systemanwendungsebene erreicht wurde und die Zeit, die die normale Systemanwendungsebene zur Initialisierung benötigte, aus. Beachten Sie, dass diese Messungen einfach die Zeit zu dem Punkt messen, an dem alle Systemdienste gestartet wurden, aber nicht notwendigerweise bis sie ihre Initialisierung abgeschlossen hatten oder die Platte im Leerlauf war.
Beispiel 1. Anzeigen, wie lange ein Systemstart brauchte
# in einem Container $ systemd-analyze time Startup finished in 296ms (userspace) multi-user.target reached after 275ms in userspace # in einer echten Maschine $ systemd-analyze time Startup finished in 2.584s (kernel) + 19.176s (initrd) + 47.847s (userspace) = 1min 9.608s multi-user.target reached after 47.820s in userspace
systemd-analyze blame
Dieser Befehl gibt eine Liste aller laufenden Units, sortiert nach der Initialisierungszeitdauer, aus. Diese Informationen können zur Optimierung der Systemstartzeit verwandt werden. Beachten Sie, dass die Ausgabe irreführend sein kann, da die Initialisierung eines Dienstes einfach deshalb langsam sein kann, da sie auf den Abschluss der Initialisierung eines anderen Dienstes wartet. Beachten Sie auch: systemd-analyze blame zeigt keine Ergebnisse für Dienste mit Type=simple an, da Systemd solche Dienste als sofort gestartet betrachtet und daher keine Messungen der Initialisierungsverzögerungen erfolgen können. Beachten Sie auch, dass dieser Befehl nur die Zeit anzeigt, die die Units für das Hochfahren benötigten, er zeigt nicht an, wie lange sich die Units in der Ausführungswarteschlange befanden. Insbesondere zeigt er die Zeit, die die Units im Zustand »activating« verbrachten; dieser Zustand ist für Units wie Geräte-Units nicht definiert, die direkt von »inactive« nach »active« übergehen. Dieser Befehl gibt daher den Eindruck der Leistung von Programmcode, kann aber nicht die durch das Warten auf Hardware und ähnliche Ereignisse verursachte Latenz genau wiedergeben.
Beispiel 2. Zeigt, welche Units beim Systemstart die meiste Zeit verbrauchten
$ systemd-analyze blame 32.875s pmlogger.service 20.905s systemd-networkd-wait-online.service 13.299s dev-vda1.device ... 23ms sysroot.mount 11ms initrd-udevadm-cleanup-db.service 3ms sys-kernel-config.mount
systemd-analyze critical-chain [UNIT…]
Dieser Befehl gibt einen Baum der zeitkritischen Unit-Kette (für jede der angegebenen UNITs oder andernfalls für das Standardziel) aus. Die Zeit, nach der die Unit aktiv oder gestartet ist, wird nach dem Zeichen »@« ausgegeben. Die Zeit, die die Unit zum Starten benötigt, wird nach dem Zeichen »+« ausgegeben. Beachten Sie, dass die Ausgabe irreführend sein kann, da die Initialisierung von Diensten abhängig von der Aktivierung eines Sockets sein kann und da die Units parallel ausgeführt werden. Dies berücksichtigt auch ähnlich zu dem Befehl blame nur die Zeit, die die Unit im Zustand »activating« verbringt und deckt daher Units nicht ab, die niemals durch den Zustand »inactive« laufen (wie beispielsweise Geräte-Units, die direkt von »inactive« zu »active« übergehen). Desweiteren zeigt es keine Informationen über Aufträge an (und insbesondere über Aufträge, die eine Zeitüberschreitung erlebten).
Beispiel 3. systemd-analyze critical-chain
$ systemd-analyze critical-chain multi-user.target @47.820s └─pmie.service @35.968s +548ms └─pmcd.service @33.715s +2.247s └─network-online.target @33.712s └─systemd-networkd-wait-online.service @12.804s +20.905s └─systemd-networkd.service @11.109s +1.690s └─systemd-udevd.service @9.201s +1.904s └─systemd-tmpfiles-setup-dev.service @7.306s +1.776s └─kmod-static-nodes.service @6.976s +177ms └─systemd-journald.socket └─system.slice └─-.slice
systemd-analyze dump [Muster…]
Ohne jeden Parameter gibt dieser Befehl eine (normalerweise sehr lange) menschenlesbare Serialisierung des kompletten Diensteverwalterzustandes aus. Es können optionale Glob-Muster angegeben werden, die dazu führen, dass die Ausgabe auf Units beschränkt wird, die auf eines der Muster passen. Das Ausgabeformat unterliegt ohne Ankündigungen Änderungen und sollte nicht durch Anwendungen ausgewertet werden. Für nicht privilegierte Benutzer ist dieser Befehl ratenbegrenzt.
Beispiel 4. Den internen Zustand des Benutzerverwalters anzeigen
$ systemd-analyze --user dump Timestamp userspace: Thu 2019-03-14 23:28:07 CET Timestamp finish: Thu 2019-03-14 23:28:07 CET Timestamp generators-start: Thu 2019-03-14 23:28:07 CET Timestamp generators-finish: Thu 2019-03-14 23:28:07 CET Timestamp units-load-start: Thu 2019-03-14 23:28:07 CET Timestamp units-load-finish: Thu 2019-03-14 23:28:07 CET -> Unit proc-timer_list.mount: Description: /proc/timer_list ... -> Unit default.target: Description: Main user target …
systemd-analyze malloc [D-Bus-Dienst…]
Dieser Befehl kann zur Anfrage der Ausgabe des internen Speicherzustandes (wie von malloc_info(3) zurückgeliefert) eines D-Bus-Dienstes verwandt werden. Falls kein Dienst angegeben ist, wird die Anfrage an org.freedesktop.systemd1 (dem System- oder Benutzerdiensteverwalter) gesandt. Es wird nicht garantiert, dass das Ausgabeformat stabil ist und es sollte nicht von Anwendungen ausgewertet werden.
Der Dienst muss die Schnittstelle org.freedesktop.MemoryAllocation1 implementieren. In der Systemd-Sammlung ist dies aktuell nur für den Verwalter der Fall.
systemd-analyze plot
Dieser Befehl gibt entweder eine SVG-Graphik aus, die detailliert, welche Systemdienste zu welcher Zeit gestartet wurden und hervorhebt, welche Zeit sie zur Initialisierung verbraucht haben oder die rohen Zeitdaten im JSON- oder Tabellenformat.
Beispiel 5. Eine Systemstartübersicht darstellen
$ systemd-analyze plot >bootup.svg $ eog bootup.svg&
Beachten Sie, dass diese Darstellung auf den jüngsten Unit-bezogenen Zeitmessungsdaten von geladenen Units basiert. Das bedeutet, dass die angezeigten Informationen den letzten Startzyklus abdecken werden, falls eine Unit gestartet, gestoppt und dann wieder gestartet wird, nicht den ersten. Daher wird empfohlen, diese Informationen nur kurz nach dem Systemstart zu betrachten, so dass dieser Unterschied keine Rolle spielt. Desweiteren könnten Units, die von keiner anderen Unit über eine Abhängigkeit referenziert werden, durch den Diensteverwalter entladen werden, sobald sie sich beenden (und nicht fehlschlugen). Solche Units werden in der Darstellung nicht auftauchen.
systemd-analyze dot [Muster…]
Dieser Befehl erstellt eine textuelle Abhängigkeitsgraphbeschreibung im Dot-Format zur weiteren Verarbeitung mit dem GraphViz-Werkzeug dot(1). Verwenden Sie eine Befehlszeile der Art systemd-analyze dot | dot -Tsvg >systemd.svg, um einen graphischen Abhängigkeitsbaum zu erstellen. Falls weder --order noch --require angegeben sind, wird der erstellte Graph sowohl Ordnungs- als auch Anforderungsabhängigkeiten darstellen. Optional können am Ende Muster-Festlegungen im Glob-Stil (z.B. *.target) angegeben werden. Eine Unit-Abhängigkeit ist im Graph enthalten, falls eines dieser Muster entweder auf den Quell- oder den Zielknoten passt.
Beispiel 6. Zeichnet alle Abhängigkeiten von jeder Unit, deren Name mit »avahi-daemon« beginnt
$ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg >avahi.svg $ eog avahi.svg
Beispiel 7. Zeichnet alle Abhängigkeiten zwischen allen bekannten Ziel-Units
$ systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' \ | dot -Tsvg >Ziele.svg $ eog Ziele.svg
systemd-analyze unit-paths
Dieser Befehl gibt eine Liste aller Verzeichnisse aus, aus denen Unit-Dateien, .d overrides- und .wants-, .requires-Symlinks geladen werden können. Kombinieren Sie dies mit --user, um die Liste für die Benutzerverwalterinstanz abzufragen und --global für die globale Konfiguration der Benutzerverwalterinstanzen.
Beispiel 8. Alle Pfade für erstellte Units anzeigen
$ systemd-analyze unit-paths | grep '^/run' /run/systemd/system.control /run/systemd/transient /run/systemd/generator.early /run/systemd/system /run/systemd/system.attached /run/systemd/generator /run/systemd/generator.late
Beachten Sie, dass dieser Unterbefehl die Liste ausgibt, die in systemd-analyze selbst einkompiliert wurde und keine Kommunikation mit dem laufenden Verwalter stattfindet. Verwenden Sie
systemctl [--user] [--global] show -p Unit-Pfad --value
um die tatsächliche Liste, die der Verwalter benutzt, abzufragen, wobei alle leeren Verzeichnisse ausgelassen werden.
systemd-analyze exit-status [STATUS…]
Dieser Befehl gibt eine Liste von Exit-Status zusammen mit ihrer »Klasse« aus, d.h. der Quelle der Definition (entweder »glibc«, »systemd«, »LSB« oder »BSD«), siehe den Abschnitt PROZESS-EXIT-CODES in systemd.exec(5). Falls keine zusätzlichen Argumente angegeben sind, werden alle bekannten Status angezeigt. Andernfalls werden nur die Definitionen für die angegebenen Codes angezeigt.
Beispiel 4. Ein paar Beispiel-Exit-Status anzeigen
$ systemd-analyze exit-status 0 1 {63..65} NAME STATUS CLASS SUCCESS 0 glibc FAILURE 1 glibc - 63 - USAGE 64 BSD DATAERR 65 BSD
systemd-analyze capability [CAPABILITY…]
Dieser Befehl gibt eine Liste der Linux-Capabilities zusammen mit ihren numerischen Kennungen aus. Siehe capabilities(7) für Details. Falls kein Argument angegeben ist, wird die vollständige Liste der dem Diensteverwalter und dem Kernel bekannten Capabilities ausgegeben. Capabilities, die vom Kernel definiert werden aber dem Diensteverwalter nicht bekannt sind, werden als »cap_???« angezeigt. Falls Argumente angegeben sind, können sich diese optional auch auf bestimmte Capabilities über ihren Namen oder ihre numerische Kennung beziehen, wodurch dann nur die bezeichneten Capabilities in der Tabelle angezeigt werden.
Beispiel 10. Ein paar Beispiel-Capability-Namen anzeigen
$ systemd-analyze capability 0 1 {30..32} NAME NUMBER cap_chown 0 cap_dac_override 1 cap_audit_control 30 cap_setfcap 31 cap_mac_override 32
systemd-analyze condition BEDINGUNG…
Dieser Befehl wertet die Zuweisungen Condition*=… und Assert*=… aus und gibt ihre Werte und den daraus ergebenen Wert des kombinierten Bedingungssatzes aus. Siehe systemd.unit(5) für eine Liste der verfügbaren Bedingungen und Zusicherungen.
Beispiel 11. Bedingungen auswerten, die Kernelversionen prüfen
$ systemd-analyze condition 'ConditionKernelVersion = ! <4.0' \ 'ConditionKernelVersion = >=5.1' \ 'ConditionACPower=|false' \ 'ConditionArchitecture=|!arm' \ 'AssertPathExists=/etc/os-release' test.service: AssertPathExists=/etc/os-release succeeded. Asserts succeeded. test.service: ConditionArchitecture=|!arm succeeded. test.service: ConditionACPower=|false failed. test.service: ConditionKernelVersion=>=5.1 succeeded. test.service: ConditionKernelVersion=!<4.0 succeeded. Conditions succeeded.
systemd-analyze syscall-filter [GRUPPE…]
Dieser Befehl führt die in der angegebenen GRUPPE enthaltenen Systemaufrufe auf oder alle bekannten Gruppen, falls keine Gruppen angegeben sind. Das Argument GRUPPE muss das Präfix »@« enthalten.
systemd-analyze filesystems [GRUPPE…]
Dieser Befehl führt die in der angegebenen Dateisystemgruppe GRUPPE enthaltenen Dateisysteme auf oder alle bekannten Gruppen, falls keine Gruppen angegeben sind. Das Argument GRUPPE muss das Präfix »@« enthalten.
systemd-analyze calendar AUSDRUCK…
Dieser Befehl wertet wiederholende Kalenderzeitereignisse aus und normiert und berechnet, wann sie das nächste Mal ablaufen. Dies akzeptiert die gleiche Eingabe wie die Einstellung OnCalendar= in systemd.timer(5) und folgt der in systemd.time(7) beschriebenen Syntax. Standardmäßig wird nur der nächste Zeitpunkt angezeigt, zu dem der Kalenderausdruck abläuft; verwenden Sie --iterations=, um die angegebene Anzahl der nächsten Male anzuzeigen, zu denen der Ausdruck abläuft. Jedes Mal, wenn der Ausdruck abläuft, wird ein Zeitstempel gebildet, siehe den Unterbefehl timestamp weiter unten.
Beispiel 12. Schalttage in der näheren Zukunft anzeigen
$ systemd-analyze calendar --iterations=5 '*-2-29 0:0:0' Original form: *-2-29 0:0:0 Normalized form: *-02-29 00:00:00 Next elapse: Sat 2020-02-29 00:00:00 UTC From now: 11 months 15 days left Iter. #2: Thu 2024-02-29 00:00:00 UTC From now: 4 years 11 months left Iter. #3: Tue 2028-02-29 00:00:00 UTC From now: 8 years 11 months left Iter. #4: Sun 2032-02-29 00:00:00 UTC From now: 12 years 11 months left Iter. #5: Fri 2036-02-29 00:00:00 UTC From now: 16 years 11 months left
systemd-analyze timestamp ZEITSTEMPEL…
Dieser Befehl wertet den Zeitstempel (d.h. einen einzelnen Zeitpunkt) aus und gibt die normalisierte Form und den Unterschied zwischen diesem Zeitstempel und jetzt aus. Der Zeitstempel sollte daher der Syntax wie in systemd.time(7), Abschnitt »ZEITSTEMPEL AUSWERTEN« dokumentiert folgen.
Beispiel 13. Die Auswertung von Zeitstempeln anzeigen
$ systemd-analyze timestamp yesterday now tomorrow Original form: yesterday Normalized form: Mon 2019-05-20 00:00:00 CEST (in UTC): Sun 2019-05-19 22:00:00 UTC UNIX seconds: @15583032000 From now: 1 day 9h ago Original form: now Normalized form: Tue 2019-05-21 09:48:39 CEST (in UTC): Tue 2019-05-21 07:48:39 UTC UNIX seconds: @1558424919.659757 From now: 43us ago Original form: tomorrow Normalized form: Wed 2019-05-22 00:00:00 CEST (in UTC): Tue 2019-05-21 22:00:00 UTC UNIX seconds: @15584760000 From now: 14h left
systemd-analyze timespan AUSDRUCK…
Dieser Befehl wertet die Zeitspanne (d.h. die Differenz zwischen zwei Zeitstempeln) aus und gibt die normalisierte Form und das Äquivalent in Mikrosekunden aus. Die Zeitspanne sollte daher der Syntax wie in systemd.time(7), Abschnitt »ZEITSPANNEN AUSWERTEN« dokumentiert folgen. Werte ohne Einheit werden als Sekunden ausgewertet.
Beispiel 14. Die Auswertung von Zeitspannen anzeigen
$ systemd-analyze timespan 1s 300s '1year 0.000001s' Original: 1s μs: 1000000 Human: 1s Original: 300s μs: 300000000 Human: 5min Original: 1year 0.000001s μs: 31557600000001 Human: 1y 1us
systemd-analyze cat-config NAME|PFAD…
Dieser Befehl ist ähnlich zu systemctl cat, agiert aber auf Konfigurationsdateien. Er kopiert den Inhalt einer Konfigurationsdatei und aller Ergänzungsdateien in die Standardausgabe; dabei berücksichtigt es die normale Gruppe an Systemd-Verzeichnissen und Regeln bezüglich des Vorrangs. Jedes Argument muss entweder ein absoluter Pfad einschließlich des Präfixes (wie /etc/systemd/logind.conf oder /usr/lib/systemd/logind.conf) oder ein Name relativ zu dem Präfix (wie systemd/logind.conf) sein.
Beispiel 15. Anzeige der Logind-Konfiguration
$ systemd-analyze cat-config systemd/logind.conf # /etc/systemd/logind.conf ... [Login] NAutoVTs=8 ... # /usr/lib/systemd/logind.conf.d/20-test.conf … und einiges aus einem anderen Paket, das außer Kraft setzt # /etc/systemd/logind.conf.d/50-override.conf … und was vom Administrator, das außer Kraft setzt
systemd-analyze compare-versions VERSION1 [OP] VERSION2
Dieser Befehl hat zwei unterschiedliche Betriebsmodi, abhängig davon, ob der Operator OP angegeben wurde.
Im ersten Modus – wenn OP nicht angegeben wurde – wird er die zwei Versionszeichenketten vergleichen und entweder »VERSION1 < VERSION2«, »VERSION1 == VERSION2« oder »VERSION1 > VERSION2« (je nachdem, was passt) ausgeben.
Der Exit-Status ist 0, falls die Versionen identisch sind, 11, falls die Version auf der rechten Seite kleiner ist und 12, falls die Version auf der linken Seite kleiner ist. (Dies passt auf die von rpmdev-vercmp verwandten Konventionen.)
Im zweiten Modus – wenn OP angegeben wurde – wird er die zwei Versionszeichenketten mittels der Operation OP vergleichen und 0 (Erfolg) zurückliefern, falls die Bedingung erfüllt ist und andernfalls 1 (Fehlschlag). OP kann lt, le, eq, ne, ge, gt sein. In diesem Modus erfolgt keine Ausgabe. (Dies passt auf die von dpkg(1) --compare-versions verwandte Konvention.)
Beispiel 16. Versionen eines Paketes vergleichen
$ systemd-analyze compare-versions systemd-250~rc1.fc36.aarch64 systemd-251.fc36.aarch64 systemd-250~rc1.fc36.aarch64 < systemd-251.fc36.aarch64 $ echo $? 12 $ systemd-analyze compare-versions 1 lt 2; echo $? 0 $ systemd-analyze compare-versions 1 ge 2; echo $? 1
systemd-analyze verify DATEI…
Dieser Befehl lädt Unit-Dateien und gibt Warnungen aus, falls irgendwelche Fehler erkannt werden. Auf der Befehlszeile angegebene Dateien werden geladen, aber auch alle von diesen referenzierte Units. Der Unit-Name auf der Platte kann außer Kraft gesetzt werden, indem nach dem Dopppelpunkt ein Alias angegeben wird, ein Beispiel hierfür ist weiter unten zu finden. Der komplette Unit-Suchpfad wird durch Kombination der Verzeichnisse für alle Befehlzeilenargumente und dem normalen Unit-Ladepfad zusammengestellt. Die Variable $SYSTEMD_UNIT_PATH wird unterstützt und kann zum Ersetzen oder Erweitern der einkompilierten Gruppe von Unit-Ladepfaden verwandt werden; siehe systemd.unit(5)). Alle Unit-Dateien, die in den in der Befehlszeile enthaltenen Verzeichnissen vorhanden sind, werden gegenüber den in anderen Pfaden vorgezogen.
Derzeit werden die folgenden Fehler erkannt:
Beispiel 17. Falschgeschriebene Anweisung
$ cat ./user.slice [Unit] WhatIsThis=11 Documentation=man:nosuchfile(1) Requires=different.service [Service] Description=x $ systemd-analyze verify ./user.slice [./user.slice:9] Unknown lvalue 'WhatIsThis' in section 'Unit' [./user.slice:13] Unknown section 'Service'. Ignoring. Error: org.freedesktop.systemd1.LoadFailed: Unit different.service failed to load: No such file or directory. Failed to create user.slice/start: Invalid argument user.slice: man nosuchfile(1) command failed with code 16
Beispiel 18. Fehlende Dienste-Units
$ tail ./a.socket ./b.socket ==> ./a.socket <== [Socket] ListenStream=100 ==> ./b.socket <== [Socket] ListenStream=100 Accept=yes $ systemd-analyze verify ./a.socket ./b.socket Service a.service not loaded, a.socket cannot be started. Service b@0.service not loaded, b.socket cannot be started.
Beispiel 19. Alias für eine Unit
$ cat /tmp/source [Unit] Description=Hostname printer [Service] Type=simple ExecStart=/usr/bin/echo %H MysteryKey=true $ systemd-analyze verify /tmp/source Failed to prepare filename /tmp/source: Invalid argument $ systemd-analyze verify /tmp/source:alias.service alias.service:7: Unknown key name 'MysteryKey' in section 'Service', ignoring.
systemd-analyze security [UNIT…]
Dieser Befehl analysiert die Sicherheits- und Sandbox-Einstellungen einer oder mehrerer angegebener Units. Falls mindestens ein Unit-Name angegeben ist, werden die Sicherheitseinstellungen der angegebenen Dienste-Units untersucht und eine detaillierte Analyse angezeigt. Falls kein Unit-Name angegeben ist, werden alle derzeit geladenen, langlaufenden Dienste-Units untersucht und eine knappe Tabelle mit den Ergebnissen angezeigt. Der Befehl prüft auf verschiedene sicherheitsbezogene Diensteeinstellungen, weist jeder einen »Gefährdungsstufen«-Wert zu, abhängig davon, wie wichtig die Einstellung ist. Dann berechnet es eine Gesamtgefährdungsstufe für die gesamte Unit, die eine Abschätzung im Bereich 0.0…10.0 ist und anzeigt, wie aus Sicherheitssicht ein Dienst gefährdet ist. Hohe Gefährdungsstufen deuten an, dass Sandboxing nur im geringen Umfang verwandt wird. Geringe Gefährdungsstufen deuten an, dass enges Sandboxing und stärkste Sicherheitsbeschränkungen angewandt werden. Beachten Sie, dass dies nur die Sicherheitsfunktionalitäten pro Dienst analysiert, die Systemd selbst implementiert. Das bedeutet, dass sämtliche zusätzlichen Sicherheitsmechanismen, die vom Dienste-Code selbst erbracht werden, nicht berücksichtigt werden. Die auf diese Art bestimmte Gefährdungsstufe sollte nicht missverstanden werden: eine hohe Gefährdungsstufe bedeutet weder, dass vom Dienste-Code selbst kein wirksames Sandboxing angewandt wird, noch dass der Dienst tatsächlich für lokale Angriffe oder solche aus der Ferne verwundbar ist. Hohe Gefährdungsstufen deuten allerdings an, dass der Dienst am wahrscheinlichsten von zusätzlichen Einstellungen für sie Nutzen ziehen würde.
Bitte beachten Sie, dass viele der Sicherheits- und Sandboxing-Einstellungen jeweils einzeln umgangen werden können — außer sie werden mit anderen kombiniert. Falls ein Dienst beispielsweise das Privileg behält, Einhängepunkte zu etablieren oder rückgängig zu machen, können viele der Sandboxing-Optionen durch den System-Code selbst rückgängig gemacht werden. Daher ist es wesentlich, dass jeder Dienst die umfassendsten und strengsten Sicherheits- und Sandboxing-Einstellungen, die möglich sind, verwendet. Das Werkzeug wird einige dieser Kombinationen und Beziehungen zwischen den Einstellungen berücksichtigen, aber nicht alle. Beachten Sie auch, dass die Sicherheits- und Sandboxing-Einstellungen, die hier analysiert werden, nur für vom Dienste-Code selbst ausgeführte Aktionen greifen. Falls ein Dienst Zugriff auf ein IPC-System (wie D-Bus) hat, könnte er Aktionen von anderen Diensten erbitten, die nicht den gleichen Beschränkungen unterliegen. Daher ist jede umfassende Sicherheits- und Sandboxing-Analyse unvollständig, falls die IPC-Zugriffsregeln nicht auch gegengeprüft werden.
Beispiel 20. systemd-logind.service analysieren
$ systemd-analyze security --no-pager systemd-logind.service NAME DESCRIPTION EXPOSURE ✗ PrivateNetwork= Service has access to the host's network 0.5 ✗ User=/DynamicUser= Service runs as root user 0.4 ✗ DeviceAllow= Service has no device ACL 0.2 ✓ IPAddressDeny= Service blocks all IP address ranges ... → Overall exposure level for systemd-logind.service: 4.1 OK 🙂
systemd-analyze inspect-elf DATEI…
Dieser Befehl wird die angegebenen Dateien laden, falls sie ELF-Objekte (Programme, Bibliotheken, Speicherauszugdateien usw.) sind wird es die eingebetteten Paketierungsmetadaten auswerten, falls vorhanden, und sie in einer Tabelle im JSON-Format ausgeben. Siehe die Dokumentation Metadaten-Paketierung[1] für weitere Informationen.
Beispiel 21. Informationen über eine Speicherauszugsdatei als JSON ausgeben
$ systemd-analyze inspect-elf --json=pretty \ core.fsverity.1000.f77dac5dc161402aa44e15b7dd9dcf97.58561.1637106137000000 { "elfType" : "coredump", "elfArchitecture" : "AMD x86-64", "/home/bluca/git/fsverity-utils/fsverity" : { "type" : "deb", "name" : "fsverity-utils", "version" : "1.3-1", "buildId" : "7c895ecd2a271f93e96268f479fdc3c64a2ec4ee" }, "/home/bluca/git/fsverity-utils/libfsverity.so.0" : { "type" : "deb", "name" : "fsverity-utils", "version" : "1.3-1", "buildId" : "b5e428254abf14237b0ae70ed85fffbb98a78f88" } }
systemd-analyze fdstore UNIT…
Listet die aktuellen Inhalte des Dateideskriptorspeichers der angegebenen Dienste-Unit auf. Dies zeigt Namen, Inode-Typen, Gerätenummern, Inode-Nummern, Pfade und Öffnungsmodi der offenen Dateideskriptoren an. Die angegebenen Units müssen FileDescriptorStoreMax= aktiviert haben, siehe systemd.service(5) zu Details.
Beispiel 22. Tabellenausgabe
$ systemd-analyze fdstore systemd-journald.service FDNAME TYPE DEVNO INODE RDEVNO PATH FLAGS stored sock 0:8 4218620 - socket:[4218620] ro stored sock 0:8 4213198 - socket:[4213198] ro stored sock 0:8 4213190 - socket:[4213190] ro ...
Hinweis: Die Spalte »DEVNO« bezieht sich auf die Major-/Minor-Nummern des Geräteknotens, der dem Dateisystem zu Grunde liegt, auf dem die Inode des Dateideskriptors ist. Die Spalte »RDEVNO« bezieht sich auf die Major-/Minor-Nummern des Geräteknotens selbst, falls der Dateideskriptor sich auf einen bezieht. Vergleichen Sie dies mit den entsprechenden Feldern .st_dev und .st_rdev in struct stat (siehe stat(2) zu Details). Die aufgeführten Inode-Nummern in der Spalte »INODE« sind auf dem durch »DEVNO« angezeigten Dateisystem.
systemd-analyze image-policy RICHTLINIE…
Dieser Befehl analysiert die angegebene Abbild-Richtlinienzeichenkette gemäß systemd.image-policy(7). Die Richtlinie wird normalisiert und vereinfacht. Für jeden aktuell definierten Partitionskennzeichner (gemäß der Spezifikation für auffindbare Partitionen[2]) wird die Auswirkung der Abbild-Richtlinienzeichenkette in Tabellenform dargestellt.
Beispiel 23. Beispielausgabe
$ systemd-analyze image-policy swap=encrypted:usr=read-only-on+verity:root=encrypted Analyzing policy: root=encrypted:usr=verity+read-only-on:swap=encrypted Long form: root=encrypted:usr=verity+read-only-on:swap=encrypted:=unused+absent PARTITION MODE READ-ONLY GROWFS root encrypted - - usr verity yes - home ignore - - srv ignore - - esp ignore - - xbootldr ignore - - swap encrypted - - root-verity ignore - - usr-verity unprotected yes - root-verity-sig ignore - - usr-verity-sig ignore - - tmp ignore - - var ignore - - default ignore - -
systemd-analyze pcrs [PCR…]
Dieser Befehl zeigt die bekannten TPM2-PCRs zusammen mit ihren kennzeichnenden Namen und aktuellen Werten.
Beispiel 24. Beispielausgabe
$ systemd-analyze pcrs NR NAME SHA256 0 platform-code bcd2eb527108bbb1f5528409bcbe310aa9b74f687854cc5857605993f3d9eb11 1 platform-config b60622856eb7ce52637b80f30a520e6e87c347daa679f3335f4f1a600681bb01 2 external-code 1471262403e9a62f9c392941300b4807fbdb6f0bfdd50abfab752732087017dd 3 external-config 3d458cfe55cc03ea1f443f1562beec8df51c75e14a9fcf9a7234a13f198e7969 4 boot-loader-code 939f7fa1458e1f7ce968874d908e524fc0debf890383d355e4ce347b7b78a95c 5 boot-loader-config 864c61c5ea5ecbdb6951e6cb6d9c1f4b4eac79772f7fe13b8bece569d83d3768 6 - 3d458cfe55cc03ea1f443f1562beec8df51c75e14a9fcf9a7234a13f198e7969 7 secure-boot-policy 9c905bd9b9891bfb889b90a54c4b537b889cfa817c4389cc25754823a9443255 8 - 0000000000000000000000000000000000000000000000000000000000000000 9 kernel-initrd 9caa29b128113ef42aa53d421f03437be57211e5ebafc0fa8b5d4514ee37ff0c 10 ima 5ea9e3dab53eb6b483b6ec9e3b2c712bea66bca1b155637841216e0094387400 11 kernel-boot 0000000000000000000000000000000000000000000000000000000000000000 12 kernel-config 627ffa4b405e911902fe1f1a8b0164693b31acab04f805f15bccfe2209c7eace 13 sysexts 0000000000000000000000000000000000000000000000000000000000000000 14 shim-policy 0000000000000000000000000000000000000000000000000000000000000000 15 system-identity 0000000000000000000000000000000000000000000000000000000000000000 16 debug 0000000000000000000000000000000000000000000000000000000000000000 17 - ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 18 - ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 19 - ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 20 - ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 - ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 22 - ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 23 application-support 0000000000000000000000000000000000000000000000000000000000000000
systemd-analyze srk [>DATEI]
Dieser Befehl liest den Speicherwurzelschlüssel (SRK) aus dem TPM2-Gerät und schreibt ihn in angeordnetem TPM2B_PUBLIC-Format in die Standardausgabe. Die Ausgabe sind nicht darstellbare Daten, sie sollte in eine Datei oder eine Pipe umgeleitet werden.
Beispiel 25. Den Speicherwurzelschlüssel in srk.tpm2b_public speichern
systemd-analyze srk >srk.tpm2b_public
systemd-analyze architectures [NAME…]
Listet alle bekannten CPU-Architekturen auf und welche davon nativ sind. Die aufgeführten Architekturnamen sind diejenigen, die ConditionArchitecture= unterstützt, siehe systemd.unit(5) zu Details. Falls Architekturnamen angegeben werden, werden nur die angegebenen aufgeführt.
Beispiel 26. Tabellenausgabe
$ systemd-analyze architectures NAME SUPPORT alpha foreign arc foreign arc-be foreign arm foreign arm64 foreign … sparc foreign sparc64 foreign tilegx foreign x86 secondary x86-64 native
OPTIONEN
Die folgenden Optionen werden verstanden:
--system
Hinzugefügt in Version 209.
--user
Hinzugefügt in Version 186.
--global
Hinzugefügt in Version 238.
--order, --require
Hinzugefügt in Version 198.
--from-pattern=, --to-pattern=
Jeder davon kann mehr als einmal verwandt werden, dann müssen die Unit-Namen auf jeden der Werte passen. Falls Tests für beide Seiten der Relation vorhanden sind, muss eine Relation beide Tests bestehen, um angezeigt zu werden. Wenn Muster zudem als positionsabhängige Argumente angegeben werden, müssen sie auf mindestens einer Seite der Relation passen. Mit anderen Worten, Muster, die mit diesen zwei Optionen angegeben werden, verkürzen die Liste der Kanten, auf die die positionsabhängigen Argumente passen, falls welche angegeben werden, und zeigen die komplette Liste der Kanten andernfalls.
Hinzugefügt in Version 201.
--fuzz=Zeitspanne
Hinzugefügt in Version 203.
--man=no
Hinzugefügt in Version 235.
--generators
Hinzugefügt in Version 235.
--recursive-errors=MODUS
Hinzugefügt in Version 250.
--root=PFAD
Hinzugefügt in Version 239.
--image=PFAD
Hinzugefügt in Version 250.
--image-policy=Richtlinie
--offline=LOGISCH
Hinzugefügt in Version 250.
--profile=PFAD
Hinzugefügt in Version 250.
--threshold=WERT
Hinzugefügt in Version 250.
--security-policy=PFAD
Tabelle 1. Akzeptierte
Bewertungs-Testkennzeichner
Bewertungs-Testkennzeichner |
UserOrDynamicUser |
SupplementaryGroups |
PrivateMounts |
PrivateDevices |
PrivateTmp |
PrivateNetwork |
PrivateUsers |
ProtectControlGroups |
ProtectKernelModules |
ProtectKernelTunables |
ProtectKernelLogs |
ProtectClock |
ProtectHome |
ProtectHostname |
ProtectSystem |
RootDirectoryOrRootImage |
LockPersonality |
MemoryDenyWriteExecute |
NoNewPrivileges |
CapabilityBoundingSet_CAP_SYS_ADMIN |
CapabilityBoundingSet_CAP_SET_UID_GID_PCAP |
CapabilityBoundingSet_CAP_SYS_PTRACE |
CapabilityBoundingSet_CAP_SYS_TIME |
CapabilityBoundingSet_CAP_NET_ADMIN |
CapabilityBoundingSet_CAP_SYS_RAWIO |
CapabilityBoundingSet_CAP_SYS_MODULE |
CapabilityBoundingSet_CAP_AUDIT |
CapabilityBoundingSet_CAP_SYSLOG |
CapabilityBoundingSet_CAP_SYS_NICE_RESOURCE |
CapabilityBoundingSet_CAP_MKNOD |
CapabilityBoundingSet_CAP_CHOWN_FSETID_SETFCAP |
CapabilityBoundingSet_CAP_DAC_FOWNER_IPC_OWNER |
CapabilityBoundingSet_CAP_KILL |
CapabilityBoundingSet_CAP_NET_BIND_SERVICE_BROADCAST_RAW |
CapabilityBoundingSet_CAP_SYS_BOOT |
CapabilityBoundingSet_CAP_MAC |
CapabilityBoundingSet_CAP_LINUX_IMMUTABLE |
CapabilityBoundingSet_CAP_IPC_LOCK |
CapabilityBoundingSet_CAP_SYS_CHROOT |
CapabilityBoundingSet_CAP_BLOCK_SUSPEND |
CapabilityBoundingSet_CAP_WAKE_ALARM |
CapabilityBoundingSet_CAP_LEASE |
CapabilityBoundingSet_CAP_SYS_TTY_CONFIG |
CapabilityBoundingSet_CAP_BPF |
UMask |
KeyringMode |
ProtectProc |
ProcSubset |
NotifyAccess |
RemoveIPC |
Delegate |
RestrictRealtime |
RestrictSUIDSGID |
RestrictNamespaces_user |
RestrictNamespaces_mnt |
RestrictNamespaces_ipc |
RestrictNamespaces_pid |
RestrictNamespaces_cgroup |
RestrictNamespaces_uts |
RestrictNamespaces_net |
RestrictAddressFamilies_AF_INET_INET6 |
RestrictAddressFamilies_AF_UNIX |
RestrictAddressFamilies_AF_NETLINK |
RestrictAddressFamilies_AF_PACKET |
RestrictAddressFamilies_OTHER |
SystemCallArchitectures |
SystemCallFilter_swap |
SystemCallFilter_obsolete |
SystemCallFilter_clock |
SystemCallFilter_cpu_emulation |
SystemCallFilter_debug |
SystemCallFilter_mount |
SystemCallFilter_module |
SystemCallFilter_raw_io |
SystemCallFilter_reboot |
SystemCallFilter_privileged |
SystemCallFilter_resources |
IPAddressDeny |
DeviceAllow |
AmbientCapabilities |
Siehe die nachfolgende beispielhafte »JSON-Richtlinie«.
Hinzugefügt in Version 250.
--json=MODUS
Hinzugefügt in Version 250.
--iterations=ANZAHL
Hinzugefügt in Version 242.
--base-time=ZEITSTEMPEL
Hinzugefügt in Version 244.
--unit=UNIT
Hinzugefügt in Version 250.
--table
Hinzugefügt in Version 253.
--no-legend
Hinzugefügt in Version 253.
-H, --host=
-M, --machine=
-q, --quiet
Hinzugefügt in Version 250.
--tldr
Hinzugefügt in Version 255.
-h, --help
--version
--no-pager
EXIT-STATUS
Für die meisten Befehle wird bei Erfolg 0 zurückgegeben, anderenfalls ein Fehlercode ungleich Null.
Mit dem Unterbefehl compare-versions in der 2-Argumente-Form wird 12, 0, 11 zurückgeliefert, falls die zweite Versionszeichenkette größer, gleich bzw. kleiner als die erste ist. In der 3-Argumente-Form 0 oder 1, falls die Bedingung wahr bzw. falsch ist.
UMGEBUNGSVARIABLEN
$SYSTEMD_LOG_LEVEL
$SYSTEMD_LOG_COLOR
Diese Einstellung ist nur nützlich, falls die Nachrichten direkt auf das Terminal geschrieben werden, da journalctl(1) und andere Werkzeuge, die Protokolle anzeigen, selbständig Nachrichten gemäß ihrer Protokollierungsstufe einfärben.
$SYSTEMD_LOG_TIME
Diese Einstellung ist nur nützlich, falls die Nachrichten direkt auf das Terminal oder in eine Datei geschrieben werden, da journalctl(1) und andere Werkzeuge, die Protokolle anzeigen, selbständig Zeitstempel basierend auf ihren Metadaten den Nachrichten anhängen.
$SYSTEMD_LOG_LOCATION
Beachten Sie, dass der Protokollierort sowieso oft als Metadaten zu den Journal-Einträgen angehängt ist. Die Aufnahme in den Nachrichtentext kann bei der Fehlersuche in Programmen dennoch praktisch sein.
$SYSTEMD_LOG_TID
Beachten Sie, dass diese Informationen sowieso als Metadaten an Journal-Einträge angehängt wird. Die Aufnahme direkt im Nachrichtentext kann aber trotzdem bei der Fehlersuche in Programmen praktisch sein.
$SYSTEMD_LOG_TARGET
$SYSTEMD_LOG_RATELIMIT_KMSG
$SYSTEMD_PAGER
Beachten Sie: Falls $SYSTEMD_PAGERSECURE nicht gesetzt ist, dann wird $SYSTEMD_PAGER (sowie $PAGER) ohne Rückmeldung ignoriert.
$SYSTEMD_LESS
Benutzer könnten insbesondere zwei Optionen ändern wollen:
K
Falls der Wert von $SYSTEMD_LESS kein »K« enthält und less das aufgerufene Textanzeigeprogramm ist, wird Strg+C durch das Programm ignoriert und muss durch das Textanzeigeprogramm selbst gehandhabt werden.
X
Beachten Sie, dass das Setzen der regulären Umgebungsvariablen $LESS keine Auswirkungen auf die Ausführung von less(1) durch systemd(1)-Werkzeuge hat.
Siehe less(1) für weitere Ausführungen.
$SYSTEMD_LESSCHARSET
Beachten Sie, dass das Setzen der regulären Umgebungsvariablen $LESSCHARSET keine Auswirkungen auf die Ausführungen von less(1) durch systemd(1)-Werkzeuge hat.
$SYSTEMD_PAGERSECURE
Hinweis: Wenn Befehle mit erhöhten Rechten ausgeführt werden, beispielsweise mittels sudo(8) oder pkexec(1), muss Vorsicht walten gelassen werden, um sicherzustellen, dass keine ungeplanten interaktiven Funktionalitäten aktiviert werden. Der »sichere« Modus für das Textanzeigeprogramm kann wie oben beschrieben automatisch aktiviert werden. Durch Setzen von SYSTEMD_PAGERSECURE=0 oder durch Nichtenfernen dieser Einstellung aus der ererbten Umgebung wird es dem Benutzer ermöglicht, beliebige Befehle auszuführen. Beachten Sie, dass auch $SYSTEMD_PAGERSECURE gesetzt werden muss, falls die Variablen $SYSTEMD_PAGER oder $PAGER berücksichtigt werden sollen. Es kann sinnvoll sein, stattdessen das Textanzeigeprogramm komplett mit --no-pager zu deaktivieren.
$SYSTEMD_COLORS
$SYSTEMD_URLIFY
BEISPIELE
Beispiel 27. JSON-Richtlinie
Die als Pfadparameter an --security-policy= übergebene JSON-Datei hat ein JSON-Objekt oberster Stufe, wobei die Schlüssel die oben erwähnten Bewertungstestkennzeichner sind. Die Werte in der Datei sollten JSON-Objekte mit einem oder mehreren der folgenden Felder sein: description_na (Zeichenkette), description_good (Zeichenkette), description_bad (Zeichenkette), weight (vorzeichenlose Ganzzahl) und range (vorzeichenlose Ganzzahl). Falls eines dieser Felder, die bestimmten Kennungen der Unit-Datei entsprechen, im JSON-Objekt fehlt, wird standardmäßig der eingebaute Vorgabefeldwert, der der gleichen Kennung entspricht, für die Sicherheitsanalyse verwandt. Die Felder »weight« und »range« werden zum Bestimmen der Gesamt-Offenlegungsstufe der Unit-Dateien verwandt: dem Wert jeder Einstellung wird ein Schlechtigkeitsstand zugewiesen, der mit dem Richtliniengewicht multipliziert und durch den Richtlinienbereich geteilt wird, um die Gesamtoffenlegung zu bestimmen, den diese Einstellung impliziert. Die berechnete Schlechtigkeit wird über alle Einstellungen in der Unit-Datei aufsummiert, auf den Bereich 1…100 normiert und dazu verwandt, die Gesamtoffenlegungsstufe der Unit zu bestimmen. Indem Benutzer diese Felder verändern können, gibt der »security«-Unterbefehl ihnen die Möglichkeit, für sich selbst zu entscheiden, welche Kennungen wichtiger sind und daher einen größeren Effekt auf die Offenlegungsstufe haben sollten. Ein Gewicht von »0« bedeutet, dass die Einstellung nicht geprüft wird.
{ "PrivateDevices": { "description_good": "Dienst hat keinen Zugriff auf Hardware-Geräte", "description_bad": "Dienst hat möglicherweise Zugriff auf Hardware-Geräte", "weight": 1000, "range": 1 }, "PrivateMounts": { "description_good": "Dienst kann keine Systemeinhängungen installieren", "description_bad": "Dienst darf Systemeinhängungen installieren", "weight": 1000, "range": 1 }, "PrivateNetwork": { "description_good": "Dienst hat keinen Zugriff auf das Netzwerk des Rechners", "description_bad": "Dienst hat Zugriff auf das Netzwerk des Rechners", "weight": 2500, "range": 1 }, "PrivateTmp": { "description_good": "Dienst hat keinen Zugriff auf die temporären Dateien anderer Software", "description_bad": "Dienst hat Zugriff auf die temporären Dateien anderer Software", "weight": 1000, "range": 1 }, "PrivateUsers": { "description_good": "Dienst hat keinen Zugriff auf andere Benutzer", "description_bad": "Dienst hat Zugriff auf andere Benutzer", "weight": 1000, "range": 1 } }
SIEHE AUCH
ANMERKUNGEN
- 1.
- Metadaten-Paketierung
- 2.
- Spezifikation für auffindbare Partitionen
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.
systemd 256.5 |