So überprüfen Sie, ob ein Kernel-Tracepoint in Linux aktiv ist

LinuxLinuxBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir untersuchen, wie man prüft, ob ein Kernel-Tracepoint (Kernel-Spurpunkt) in Linux aktiv ist. Tracepoints sind unerlässlich für die Beobachtung von Kernel-Ereignissen und von unschätzbarem Wert für das Debugging und die Leistungsanalyse. Wir beginnen damit, die verfügbaren Tracepoints auf Ihrem System mithilfe des Dateisystems /sys/kernel/debug/tracing aufzulisten.

Nach der ersten Untersuchung werden wir lernen, wie man den Status bestimmter Tracepoints mit dem trace-cmd-Hilfsprogramm prüft und schließlich die Tracepoints durch die Prüfung der Datei /proc/kallsyms verifiziert.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/PackagesandSoftwaresGroup -.-> linux/apt("Package Handling") subgraph Lab Skills linux/ls -.-> lab-558726{{"So überprüfen Sie, ob ein Kernel-Tracepoint in Linux aktiv ist"}} linux/cat -.-> lab-558726{{"So überprüfen Sie, ob ein Kernel-Tracepoint in Linux aktiv ist"}} linux/grep -.-> lab-558726{{"So überprüfen Sie, ob ein Kernel-Tracepoint in Linux aktiv ist"}} linux/apt -.-> lab-558726{{"So überprüfen Sie, ob ein Kernel-Tracepoint in Linux aktiv ist"}} end

Auflisten von Tracepoints mit ls /sys/kernel/debug/tracing

In diesem Schritt werden wir die Linux-Tracepoints (Kernel-Spurpunkte) erkunden. Tracepoints sind Hooks, die im Kernel-Quellcode platziert sind und es Ihnen ermöglichen, bestimmte Ereignisse im Kernel zu beobachten. Sie sind von unschätzbarem Wert für das Debugging und die Leistungsanalyse.

Der Linux-Kernel bietet ein Tracing-Framework (Spurensammelframework), das oft über das Verzeichnis /sys/kernel/debug/tracing zugänglich ist. Dieses Verzeichnis enthält verschiedene Dateien, die das Tracing steuern und Informationen darüber liefern.

Um die verfügbaren Tracepoints auf Ihrem System anzuzeigen, können Sie den Inhalt des events-Verzeichnisses im Tracing-Dateisystem auflisten.

Öffnen Sie Ihr Terminal, wenn es noch nicht geöffnet ist. Denken Sie daran, dass Sie das Xfce Terminal-Symbol auf der linken Seite Ihres Desktops finden können.

Geben Sie jetzt den folgenden Befehl ein und drücken Sie Enter:

ls /sys/kernel/debug/tracing/events

Dieser Befehl verwendet ls, um den Inhalt des /sys/kernel/debug/tracing/events-Verzeichnisses aufzulisten. Das events-Verzeichnis ist der Ort, an dem der Kernel die verfügbaren Tracepoints exposes (zur Verfügung stellt), organisiert nach Subsystemen.

Sie werden eine Liste von Verzeichnissen sehen, von denen jedes ein Kernel-Subsystem darstellt (z. B. syscalls, sched, ext4 usw.). Innerhalb dieser Verzeichnisse befinden sich die eigentlichen Tracepoint-Namen.

Beispielsweise könnten Sie eine Ausgabe ähnlich der folgenden sehen (die genaue Ausgabe variiert je nach Ihrer Kernel-Version und Konfiguration):

block/      ext4/       kmem/       net/        pci/        random/     sock/       task/       workqueue/
bpf/        fib/        kvm/        nfs/        power/      raw_syscalls/ signal/     timer/      xfs/
compaction/ ftrace/     libata/     nipi/       printk/     regmap/     skb/        udp/        xen/
cpu-freq/   gpio/       mdio/       oom/        qdisc/      rpm/        snd/        vmscan/
cgroup/     header_event  header_page  irq/        migrate/    pagemap/    ras/        scsi/       spi/        writeback/
dma_fence/  i2c/        kcsan/      module/     perf_events/  rcu/        sfc/        syscalls/   xhci-hcd/
enable      iommu/      kprobe/     mpx/        powerpc/    regulator/  signal/     tcp/        xilinx-vsec/
exceptions/ iov/        kscan/      napi/       probe/      rpm/        skb/        timer/      xfs/

Diese Ausgabe zeigt die verschiedenen Kategorien von Ereignissen, die Sie verfolgen können. In den nächsten Schritten werden wir lernen, wie man den Status dieser Tracepoints prüft.

Klicken Sie auf Weiter, um fortzufahren.

Prüfen des Tracepoint-Status mit trace-cmd

Im vorherigen Schritt haben wir die verfügbaren Tracepoints (Kernel-Spurpunkte) durch die Untersuchung des /sys/kernel/debug/tracing/events-Verzeichnisses aufgelistet. Jetzt verwenden wir das trace-cmd-Hilfsprogramm, um detailliertere Informationen über Tracepoints zu erhalten, insbesondere ihren Status (ob sie aktiviert oder deaktiviert sind).

Der trace-cmd-Befehl ist ein leistungsstarkes Werkzeug zum Interagieren mit dem Linux-Tracing-Framework (Spurensammelframework). Wenn trace-cmd noch nicht installiert ist, können Sie es mit apt installieren.

Zuerst aktualisieren Sie die Paketliste:

sudo apt update

Dann installieren Sie trace-cmd:

sudo apt install trace-cmd

Möglicherweise sehen Sie eine Ausgabe, die darauf hinweist, dass trace-cmd bereits installiert ist. Das ist in Ordnung.

Um nun alle verfügbaren Tracepoints und ihren Status aufzulisten, verwenden Sie den trace-cmd list -e-Befehl. Die Option -e teilt trace-cmd mit, Ereignisse (Tracepoints) aufzulisten.

Geben Sie den folgenden Befehl ein und drücken Sie Enter:

trace-cmd list -e

Dieser Befehl gibt eine lange Liste von Tracepoints aus, die ihr Subsystem und ihren Namen anzeigen, gefolgt von ihrem aktuellen Status in eckigen Klammern ([enabled] oder [disabled]).

Sie werden eine Ausgabe ähnlich der folgenden sehen (wiederum variiert die genaue Liste):

  block:block_bio_backmerge [disabled]
  block:block_bio_bounce [disabled]
  block:block_bio_complete [disabled]
  block:block_bio_frontmerge [disabled]
  block:block_bio_queue [disabled]
  block:block_bio_remap [disabled]
  block:block_dirty_buffer [disabled]
  block:block_getrq [disabled]
  block:block_plug [disabled]
  block:block_rq_complete [disabled]
  block:block_rq_insert [disabled]
  block:block_rq_issue [disabled]
  block:block_rq_remap [disabled]
  block:block_rq_requeue [disabled]
  block:block_sync_buffer [disabled]
  block:block_touch_buffer [disabled]
  block:block_unplug [disabled]
  bpf:bpf_trace_printk [disabled]
  bpf:bpf_trace_vprintk [disabled]
  ... (viele weitere Tracepoints)

Wie Sie sehen können, sind die meisten Tracepoints standardmäßig deaktiviert, um Leistungseinbußen zu vermeiden. Sie würden normalerweise bestimmte Tracepoints aktivieren, wenn Sie bestimmte Kernel-Ereignisse verfolgen müssen.

Die Verwendung von trace-cmd list -e ist eine bequeme Möglichkeit, die vollständige Liste der Tracepoints und ihren aktuellen Zustand anzuzeigen, ohne manuell das /sys/kernel/debug/tracing-Dateisystem zu durchsuchen.

Klicken Sie auf Weiter, um zum nächsten Schritt zu gelangen.

Überprüfen von Tracepoints in /proc/kallsyms

In den vorherigen Schritten haben wir gelernt, wie man Tracepoints (Kernel-Spurpunkte) mithilfe des Tracing-Dateisystems und des trace-cmd-Hilfsprogramms auflistet. Jetzt erkunden wir eine andere Möglichkeit, Informationen zu Tracepoints zu erhalten: die Datei /proc/kallsyms.

Die Datei /proc/kallsyms enthält die Adressen und Namen aller exportierten Kernel-Symbole, einschließlich Funktionen und Variablen. Tracepoints werden in dieser Datei ebenfalls als Symbole dargestellt.

Sie können Befehle wie cat und grep verwenden, um nach Tracepoint-Symbolen in /proc/kallsyms zu suchen. Tracepoint-Symbole folgen in der Regel einer Namenskonvention und enthalten oft tracepoint oder _tracepoint.

Versuchen wir, Symbole in /proc/kallsyms zu finden, die mit Tracepoints zusammenhängen. Wir verwenden cat, um die Datei zu lesen, und leiten die Ausgabe an grep weiter, um nach Zeilen zu suchen, die das Wort "tracepoint" enthalten.

Geben Sie den folgenden Befehl ein und drücken Sie Enter:

cat /proc/kallsyms | grep tracepoint

Dieser Befehl zeigt die Zeilen aus /proc/kallsyms an, die die Zeichenkette "tracepoint" enthalten. Sie werden eine Ausgabe ähnlich der folgenden sehen:

...
ffffffffXXXXXXXX R __tracepoint_module_load
ffffffffXXXXXXXX R __tracepoint_module_free
ffffffffXXXXXXXX R __tracepoint_module_get
ffffffffXXXXXXXX R __tracepoint_module_put
ffffffffXXXXXXXX R __tracepoint_module_request_module
ffffffffXXXXXXXX R __tracepoint_module_module_init
ffffffffXXXXXXXX R __tracepoint_module_module_exit
ffffffffXXXXXXXX R __tracepoint_module_module_request
ffffffffXXXXXXXX R __tracepoint_module_module_autoload
ffffffffXXXXXXXX R __tracepoint_module_module_kset_reg
ffffffffXXXXXXXX R __tracepoint_module_module_kset_unreg
...

Das XXXXXXXX steht für hexadezimale Adressen, die auf Ihrem System unterschiedlich sein werden. Der wichtige Teil ist der Symbolname, der oft mit __tracepoint_ beginnt, gefolgt vom Subsystem- und Ereignisnamen.

Dies bestätigt, dass Tracepoints tatsächlich als Symbole in der Kernel-Symboltabelle dargestellt werden, auf die über /proc/kallsyms zugegriffen werden kann. Während /sys/kernel/debug/tracing und trace-cmd eine benutzerfreundlichere Schnittstelle für die Verwaltung und Ansicht von Tracepoints bieten, ist das Verständnis, dass sie als Kernel-Symbole existieren, grundlegend für fortgeschrittene Kernel-Tracing-Konzepte.

Sie haben nun drei verschiedene Methoden gelernt, um Tracepoints auf einem Linux-System zu identifizieren und zu untersuchen.

Klicken Sie auf Weiter, um dieses Lab abzuschließen.

Zusammenfassung

In diesem Lab haben wir uns zunächst mit Linux-Tracepoints (Kernel-Spurpunkten) beschäftigt, die für die Kernel-Debugging und Leistungsanalyse von entscheidender Bedeutung sind. Wir haben gelernt, dass das Verzeichnis /sys/kernel/debug/tracing Zugang zum Tracing-Framework (Spurensammelframework) des Kernels bietet. Insbesondere haben wir den Befehl ls /sys/kernel/debug/tracing/events verwendet, um die verfügbaren Tracepoints aufzulisten, die im events-Verzeichnis nach Kernel-Subsystemen organisiert sind. Dieser erste Schritt hat gezeigt, wie man die verschiedenen Kernel-Ereignisse identifiziert, die auf einem System verfolgt werden können.