有没有办法将内核恐慌推到屏幕上?

有没有办法将内核恐慌推到屏幕上?

用户可以将内核崩溃的原因显示在屏幕上吗?

答案1

Linux 确实会将恐慌转储到屏幕上...具体取决于您对屏幕的定义。

Linux 实际上所做的就是转储到系统控制台。通常这是屏幕,但也可以是串行控制台(或其他地方)。

然而,大多数人在他们的桌面上运行 X。这意味着控制台是不是在屏幕上,帧缓冲区是。在这种情况下,您需要将 Linux 转储到帧缓冲区,我怀疑这确实是您正在寻找的。

你很幸运,有一个致力于此的项目在 Ubuntu 上。我不知道这个项目进展到什么程度,但看起来很有希望,这就是你应该开始的地方。

答案2

免责声明:我发布这个答案是因为你说你通缉康基。如果您正在谈论真正的内核恐慌而不仅仅是错误消息等,那么这将不起作用,因为内核将忙于恐慌而无法执行其他任何操作。


conky应该位于您的发行版的存储库中,因此安装它很简单。完成此操作后,您将需要创建一个~/.conkyrc文件。我的有点复杂,这是一个最小的工作,以良好的格式.conkyrc显示最后 8 行:dmesg

    double_buffer yes
     background yes
    update_interval 1
    total_run_times 0
    own_window yes
    own_window_type desktop
    own_window_transparent yes
    own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
    minimum_size 230 5
    maximum_width 230
    gap_x 1365
    gap_y 40

TEXT

${execpi 3 dmesg |tail -n8}

但这看起来有点难看,所以我有一个脚本来格式化输出,折叠长行并缩进以将同一消息中的行分组在一起。要使用它,请将下面的脚本保存为类似的内容~/bin/conkyLogging,使其可执行chmod a+x ~/bin/conkyLogging并将最后一行更改为

 ${execpi 3 dmesg |tail -n8 | /home/USERNAME/scripts/conkyLogging.pl} 

脚本是:

#!/usr/bin/env perl
my $lim=32;
my @a;
while(<>){/.*?\]\s*(.+)$/;
 push @a,$1;
}
my $k;
for($n=$#a;$n>=0; $n--){
    $_=$a[$n];
    @c=split(/[\s]+/);
    @b=split(//);
    my $k=0;
    my $kk=0;
    print "    ";
    for($i=0;$i<=$#b; $i++){
    $_=$b[$i];
    if (/^\s+$/){
        $k+=length($c[$kk+1]);
        $kk++ ;
    }
    if($k>$lim){
        s/([=,\-\s])/$1\n\t  /;
        $k=0;
    }
    print STDOUT;
    }
    print STDOUT "\n";
}

有关各种conky变量以及如何设置的.conkyrc更多信息,请参阅这里这里

答案3

据推测,将原因推到屏幕上意味着强制内核将信息转储到屏幕上。

到目前为止我还不是专家,但据我所知,没有办法。当发生内核崩溃时,它将信息转储到控制台,然后崩溃。这意味着恐慌之后无法做任何事情,因为没有任何东西在运行。

如果您使用的是实际的 tty(而不是 xterm),我相信您会看到信息。但否则你就不走运了。什么是“内核恐慌”?似乎有一些这方面的信息。

答案4

如果您遇到恐慌的情况不仅仅是很少,那么您最好的选择可能是连接另一个(可能是低功耗)设备并通过串行电缆或登录到它网络控制台。 Netconsole 的明显优势是使用另一个已经运行的设备(如果需要,您甚至可以登录到家庭路由器)。

相关内容