用户可以将内核崩溃的原因显示在屏幕上吗?
答案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";
}
答案3
据推测,将原因推到屏幕上意味着强制内核将信息转储到屏幕上。
到目前为止我还不是专家,但据我所知,没有办法。当发生内核崩溃时,它将信息转储到控制台,然后崩溃。这意味着恐慌之后无法做任何事情,因为没有任何东西在运行。
如果您使用的是实际的 tty(而不是 xterm),我相信您会看到信息。但否则你就不走运了。什么是“内核恐慌”?似乎有一些这方面的信息。
答案4
如果您遇到恐慌的情况不仅仅是很少,那么您最好的选择可能是连接另一个(可能是低功耗)设备并通过串行电缆或登录到它网络控制台。 Netconsole 的明显优势是使用另一个已经运行的设备(如果需要,您甚至可以登录到家庭路由器)。