启动后如何查看Linux中的所有启动消息?

Att*_*eld 14 linux boot scrolling linux-kernel dmesg

相关问题是:

Linux 在哪里放置引导消息?

记录引导过程的日志文件的名称

然而,这些都没有回答这个问题。这个问题与如何查看所有启动消息有关。

如果您想获得具体信息,这适用于 Gentoo、OpenRC、现代内核、4.9.6。然而,适用于所有发行版的通用解决方案会更可取。

问题是有时错误或警告会滚动得太快以至于无法看到。也不总是可以简单地向上滚动,原因有两个(即使在 inittab 中使用 --noclear):当切换到帧缓冲区时,滚动到切换之前的位置不再可能,第二,在 X 启动之后,在新文本添加到缓冲区之前,切换到控制台并尝试向上滚动根本不允许滚动。有时,在 dmesg 或 /var/log/messages 中根本找不到某些消息。

如何查看所有消息?

我在这里看到有人https://www.linuxquestions.org/questions/linux-newbie-8/please-how-to-pause-scrolling-messages-at-boot-323772/建议按下滚动锁可能会暂停它。然而,这充其量也不是一个非常优雅的解决方案——一些消息滚动得太快,这些天系统在启动时会突然产生大量文本。

这就是我理想中想要的:

  • 一条消息 | 如果可能的话,less 类型的解决方案,或其他一些单步执行引导过程的方式。
  • 一种确保打印在屏幕上的所有内容也被记录的方法。

有没有一种直接的方法来实现这些?

我知道一种解决方案:

CONFIG_BOOT_PRINTK_DELAY:将每个启动printk消息延迟N毫秒

奇怪的是,我似乎甚至不允许在我的 menuconfig 中选择 BOOT_PRINTK_DELAY,我可以在搜索它时找到它,但是在 Kernel hacking -> printk 和 dmesg 选项 -> 下,我只有“在 printks 上显示时间信息”和“默认”消息日志级别”。printk 延迟选项在哪里?我是否需要先启用其他功能才能使其可见?什么?如果有人知道,最好将此作为答案的一部分。

但无论如何,这需要内核重新编译,这对于看似微不足道的任务来说是一个丑陋且侵入性的黑客攻击。非常欢迎这样做的正确方法。

use*_*686 11

所以你的控制台有两种类型的消息:

  • 由内核生成(通过printk);
  • 由用户空间(通常是您的初始化系统)生成。

内核消息始终存储在 kmsg 缓冲区中,可通过dmesg. 它们也经常被复制到您的系统日志中。(这也适用于写入 的用户空间消息/dev/kmsg,但这些消息相当罕见。)

同时,当用户空间将其花哨的启动状态文本写入/dev/consoleor 时/dev/tty1,它根本不会存储在任何地方。它只是进入屏幕,仅此而已。所以我认为几乎任何解决方案——除了 Rowan 的串行控制台建议——最终要么非常特定于发行版(由于每个 init 系统执行不同的日志记录)或涉及 strace 或内核黑客等的“侵入性黑客”。

在最好的情况下,您的 init 系统本身会将所有重要事件记录到系统日志(/var/log/messages 等)。例如:

systemd[1]: Starting BIRD routing daemon...
bird[478296]: /etc/bird.conf, line 2: syntax error
systemd[1]: bird.service: Control process exited, code=exited status=1
systemd[1]: Failed to start BIRD routing daemon.
Run Code Online (Sandbox Code Playgroud)

(systemd 和 upstart 也记录服务的 stdout/stderr;许多其他 init 系统只是将它重定向到控制台或无处。)