网络上流传着许多想要dmesg
实时观看输出结果的人提出的问题。所有建议和答案都涉及使用dmesg -w
、tail
、journalctl -f
配置 systemd 和/或 syslog 以将 dmesg 信息输出到特定控制台等。
我陷入了一个不寻常的情况:我也需要实时查看 dmesg(内核调试)输出,但是在用户空间冻结的计算机上。(详情见下文)
如果我启动一个非常准系统的内核init=/bin/bash
,Alt++SysRq将h立即打印神奇的 SysRq 帮助文本,即使没有 syslog 或类似的进程正在运行。这个例子证明内核可以直接将 dmesg 信息打印到屏幕上,而无需用户空间的任何帮助。
不幸的是,我的 Arch Linux 系统的一个组件正在吃掉内核打印的消息,然后它们才会到达屏幕,即使我console=tty1 loglevel=9
的内核命令行中有。在 tty1 处按Alt+ SysRq+h似乎没有任何作用,直到我手动使用 去钓鱼dmesg | tail
。
(编辑:)评论建议使用setterm
来启用消息。我很惊讶地发现这没有造成明显的影响。
我猜 systemd 的日志需要重新配置。我不知道从哪里开始。
细节/背景:
我的笔记本电脑(一台旧的但仍然有用的 ThinkPad T400)有时会任意决定从挂起恢复时锁定。 ACPI 唤醒工作正常,恢复视频,背光工作正常,键盘工作,在控制台之间切换(只要我小心地避免 X 打开)工作,甚至向上滚动 tty 工作......但用户空间仍然冻结。
我对睡眠的理解是...
# echo mem > /sys/power/state
(...)
t400 kernel: Freezing user space processes ... (elapsed 0.047 seconds) done.
(...)
t400 kernel: smpboot: CPU 1 is now offline
<system is asleep>
<I open the lid!>
t400 kernel: ACPI: Low-level resume complete
(...)
t400 kernel: Restarting tasks ... done.
(...)
# echo ohi
ohi
# _
...对于相当大量的睡眠->恢复过程,用户空间/任务被冻结,因此没有任何东西会干扰挂起->睡眠->唤醒->恢复周期。
答案1
系统systemd-sysctl.service
服务禁用所有“Magic SysRq”功能除了s(同步)。您需要在某个位置提供您自己的/etc/sysctl.d/
具有更高优先级的重写设置。
console=tty1
仅输出到第一个内核虚拟终端,该终端不一定是活动的 KVT。无论当时发生什么情况,要始终输出到活动 KVT,请使用console=tty0
。
进一步阅读
- 乔纳森·德博因·波拉德 (2018)。 ”linux-控制台”。 设备。诺什工具集。
- 乔纳森·德博因·波拉德 (2018)。 ”linux-vt”。 设备。诺什工具集。
- https://unix.stackexchange.com/a/384792/5132
- 戈弗雷多·巴龙切利 (2013-10-05)。系统设置
kernel.sysrq=16
。 Debian 错误 #725422。 - 伦纳特·珀特林等人。 (2016)。
systemd-sysctl
。 systemd 手册页。 Freedesktop.org。 - 伦纳特·珀特林等人。 (2016)。
sysctl.d
。 systemd 手册页。 Freedesktop.org。 - https://unix.stackexchange.com/a/411232/5132