Heim > Artikel > Betrieb und Instandhaltung > Wissen Sie wirklich, wie man Fehler im Linux-Kernel debuggt? Nach der Lektüre dieses Artikels werden Sie aufgeklärt!
Der Linux-Kernel ist der Kern des Betriebssystems und steuert den Zugriff auf Systemressourcen (wie CPU, E/A-Geräte, physischer Speicher und Dateisysteme). Während des Bootvorgangs und im laufenden Systembetrieb schreibt der Kernel verschiedene Meldungen in den Kernel-Ringpuffer. Diese Meldungen enthalten verschiedene Informationen zum Systembetrieb.
Der Kernel-Ringpuffer ist ein Teil des physischen Speichers, der zum Speichern der Protokollmeldungen des Kernels verwendet wird. Es hat eine feste Größe, was bedeutet, dass ältere Protokolldatensätze überschrieben werden, sobald der Puffer voll ist. Das Befehlszeilendienstprogramm
dmesg wird zum Drucken und Steuern des Kernel-Ringpuffers unter Linux und anderen Unix-ähnlichen Betriebssystemen verwendet. Nützlich zum Überprüfen von Kernel-Boot-Meldungen und zum Debuggen von Hardwareproblemen.
In diesem Tutorial behandeln wir die Grundlagen des Befehls dmesg.
Die Syntax des dmesg-Befehls lautet wie folgt:
dmesg [OPTIONS] 在不带任何选项的情况下调用时,dmesg将所有消息从内核环形缓冲区写入标准输出:
$ dmesg
Standardmäßig können alle Benutzer den dmesg-Befehl ausführen. Auf einigen Systemen ist der Zugriff auf dmesg jedoch möglicherweise auf Nicht-Root-Benutzer beschränkt. In diesem Fall erhalten Sie beim Aufruf von dmesg eine Fehlermeldung wie diese:
dmesg: Readkernel-Puffer fehlgeschlagen: Vorgang nicht zulässig
Kernel-Parameter kernel.dmesg_restrictGibt an, ob nicht privilegierte Benutzer dmesg verwenden können, um Nachrichten aus dem Kernel-Protokollpuffer anzuzeigen. Um die Beschränkung aufzuheben, setzen Sie sie auf Null:
$ sudo sysctl -w kernel.dmesg_restrict=0<code style='margin: 3px;padding: 3px;font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);'>$ sudo sysctl -w kernel.dmesg_restrict=0
通常,输出包含很多信息行,因此只能看到输出的最后一部分。要一次查看一页,请将输出通过管道传送到分页实用程序,例如less或more:
$ dmesg --color=always | less
其中的--color=always参数用于保留彩色输出。
如果要过滤缓冲区消息,可能使用grep。例如,要仅查看与 USB 相关的消息,请键入:
$ dmesg | grep -i usb
$ dmesg | grep -i usb🎜<p data-tool="mdnice编辑器" style='margin-bottom: 20px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;text-align: left;white-space: normal;text-size-adjust: auto;line-height: 1.8em;color: rgb(58, 58, 58);'>dmesg 从/proc/kmsg虚拟文件中读取内核生成的消息。该文件提供了到内核环形缓冲区的接口,并且只能由一个进程打开。如果系统上正在运行syslog进程,并且你尝试使用cat或less命令读取文件,则命令将挂起。</p>
<p data-tool="mdnice编辑器" style='margin-bottom: 20px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;text-align: left;white-space: normal;text-size-adjust: auto;line-height: 1.8em;color: rgb(58, 58, 58);'>syslog守护程序将内核消息转储到/var/log/dmesg,因此你也可以使用该日志文件:</p>
<p data-tool="mdnice编辑器" style='margin-bottom: 20px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;text-align: left;white-space: normal;text-size-adjust: auto;line-height: 1.8em;color: rgb(58, 58, 58);'><code style='margin: 3px;padding: 3px;font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);'>$ cat /var/log/dmesg
格式化 dmesg 输出。
dmesg命令提供了许多选项,可帮助你格式化和过滤输出。
dmesg中最常用的选项之一是-H(--human),它将输出更容易读的结果。
$ dmesg -H
要打印人类可读的时间戳,请使用-T(--ctime选项):
$ dmesg -T [Mon Oct 14 14:38:04 2019] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
时间戳格式也可以使用--time-format
$ dmesg --time-format=delta
$ dmesg --time-format=delta
你也可以组合两个或多个选项:
$ dmesg -H -T
要实时观看dmesg命令的输出,请使用-w(--follow)选项:
$ dmesg --follow
$ dmesg -H -T
Um die Ausgabe des dmesg-Befehls anzusehen Echtzeit, bitte verwenden Sie die Option -w (--follow): 🎜🎜$ dmesg --follow Code>🎜 🎜Dmesg-Ausgabe filtern. 🎜🎜Sie können die DMESG-Ausgabe auf bestimmte Einrichtungen und Ebenen beschränken. dmesg unterstützt die folgenden Typen: 🎜? <ul class="list-paddingleft-2" data-tool="mdnice编辑器" style='margin-top: 8px;margin-bottom: 8px;padding-left: 25px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;text-align: left;white-space: normal;text-size-adjust: auto;'>sys log-intern syslogd-Meldungen <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"></section></li>lpr – Zeilendrucker-Subsystem <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"></section></li>news – Netzwerknachrichten-Subsystem <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"></section></li> -f (--facility<li>) Mit der Option -f (--facility<section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">) können Sie die Ausgabe auf ein bestimmtes Gerät beschränken. Diese Option akzeptiert ein oder mehrere durch Kommas getrennte Funktionen. </section>
</li>
<li>
<section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"></section> Um beispielsweise nur Kernel- und System-Daemon-Nachrichten anzuzeigen, können Sie Folgendes verwenden: </li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"></section></li> Jede Protokollnachricht ist mit einer Protokollebene verknüpft, die die Wichtigkeit der Nachricht anzeigt. dmesg unterstützt die folgenden Protokollebenen: <li>
<ul class="list-paddingleft-2" data-tool="mdnice编辑器" style='margin-top: 8px;margin-bottom: 8px;padding-left: 25px;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;text-align: left;white-space: normal;text-size-adjust: auto;'>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">emerg – Das System ist nicht verfügbar </section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">alert – Es muss sofort gehandelt werden </section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">crit – Notfallsituation </section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">err – Fehlerzustand </section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">warn – Warnzustand. </section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">kein Eis - normale, aber wichtige Bedingungen </section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">Info - Information </section></li>
<li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">Debug - Debug-Level-Meldung </section></li>
</ul>
<p data-tool="mdnice编辑器" style='margin-bottom: 20px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;text-align: left;white-space: normal;text-size-adjust: auto;line-height: 1.8em;color: rgb(58, 58, 58);'><code style="margin: 3px;padding: 3px;font-size: 14px;border-radius: 4px; Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: Break-All;Farbe: RGB(155, 110, 35);Hintergrundfarbe: RGB(255, 245, 227);“ > Mit der Option -l (--level 4309a73696dbaeac0ddd115cebb6f9b7)
können Sie die Ausgabe auf eine definierte Ebene beschränken. Die Option akzeptiert eine oder mehrere durch Kommas getrennte Ebenen. Der folgende Befehl zeigt nur Fehler- und kritische Meldungen an: $ dmesg -l err,crit
清除环形缓冲区
-C(--clear)选项可让您清除环形缓冲区:
$ sudo dmesg -C
$ dmesg -l err,crit
Ringpuffer löschen 🎜🎜-C (--clear) Option ermöglicht das Löschen des Ringpuffers: 🎜🎜 $ sudo dmesg -C
🎜🎜Nur Root oder ein Benutzer mit Sudo-Berechtigungen können den Puffer löschen. 🎜Um den Pufferinhalt vor dem Löschen auszudrucken, verwenden Sie die Option -c (--read-clear):
$ sudo dmesg -c
如果要在清除文件之前将当前dmesg日志保存到文件中,你可以将输出重定向到文件:
$ dmesg > dmesg_messages
Wenn Sie das aktuelle dmesg-Protokoll vor dem Löschen in einer Datei speichern möchten, können Sie die Ausgabe in die Datei umleiten: $ dmesg > dmesg_messages
Fazit
Mit dem Befehl dmesg können Sie den Kernel-Ringpuffer anzeigen und steuern. Dies ist hilfreich bei der Fehlerbehebung bei Kernel- oder Hardwareproblemen.
Das obige ist der detaillierte Inhalt vonWissen Sie wirklich, wie man Fehler im Linux-Kernel debuggt? Nach der Lektüre dieses Artikels werden Sie aufgeklärt!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!