确定 Linux 内核恐慌的原因

Naf*_*Kay 27 kernel kernel-panic kernel-modules crash

我正在运行 Ubuntu 12.04 衍生版 (amd64),最近我遇到了非常奇怪的问题。出乎意料的是,X 似乎会完全冻结一段时间(1-3 分钟?),然后系统将重新启动。该系统已超频,但在 Windows 中经过验证非常稳定,这让我相信我遇到了内核恐慌或我的模块之一出现问题。即使在 Linux 中,我也可以运行 LINPACK 并且不会看到崩溃,尽管在 CPU 上施加了可笑的负载。崩溃似乎是随机发生的,即使机器闲置时也是如此。

如何调试导致系统崩溃的原因?

我预感它可能是专有的 NVIDIA 驱动程序,我一直还原到驱动程序的稳定版本 304 版本,但我仍然遇到崩溃。

任何人都可以引导我完成崩溃后的良好调试过程吗?我很乐意启动拇指驱动器并发布我所有的崩溃后配置文件,我只是不确定它们会是什么。我怎样才能找出是什么导致了我的系统崩溃?

这是一堆日志,通常是罪魁祸首。

.xsession 错误http : //pastebin.com/EEDtVkVm

/var/log/Xorg.0.loghttp://pastebin.com/ftsG5VAn

/var/log/kern.loghttp://pastebin.com/Hsy7jcHZ

在/ var / log / syslog的http://pastebin.com/9Fkp3FMz

我什至似乎根本找不到坠机记录。

触发崩溃并不是那么简单,当 GPU 试图一次绘制多个东西时,它似乎会发生。如果我全屏播放 YouTube 视频并让它重复一段时间或滚动浏览大量 GIF 并弹出 Skype 通知,有时它会崩溃。在这个问题上完全摸不着头脑。

CPU 超频到 4.8GHz,但它完全稳定,并且在昨天的 LINPACK 运行和 9 小时的 Prime95 中幸存下来,没有发生一次崩溃。

更新

我已经为我的内核版本 3.2.0-35安装了kdumpcrashlinux-crashdump,以及内核调试符号。当我apport-unpack在崩溃的内核文件上运行,然后crashVmCore故障转储上运行时,我看到的是:

      KERNEL: /usr/lib/debug/boot/vmlinux-3.2.0-35-generic
    DUMPFILE: Downloads/crash/VmCore
        CPUS: 8
        DATE: Thu Jan 10 16:05:55 2013
      UPTIME: 00:26:04
LOAD AVERAGE: 2.20, 0.84, 0.49
       TASKS: 614
    NODENAME: mightymoose
     RELEASE: 3.2.0-35-generic
     VERSION: #55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012
     MACHINE: x86_64  (3499 Mhz)
      MEMORY: 8 GB
       PANIC: "[ 1561.519960] Kernel panic - not syncing: Fatal Machine check"
         PID: 0
     COMMAND: "swapper/5"
        TASK: ffff880211251700  (1 of 8)  [THREAD_INFO: ffff880211260000]
         CPU: 5
       STATE: TASK_RUNNING (PANIC)
Run Code Online (Sandbox Code Playgroud)

当我log从该crash实用程序运行时,我会在日志底部看到以下内容:

[ 1561.519943] [Hardware Error]: CPU 4: Machine Check Exception: 5 Bank 3: be00000000800400
[ 1561.519946] [Hardware Error]: RIP !INEXACT! 33:<00007fe99ae93e54> 
[ 1561.519948] [Hardware Error]: TSC 539b174dead ADDR 3fe98d264ebd MISC 1 
[ 1561.519950] [Hardware Error]: PROCESSOR 0:206a7 TIME 1357862746 SOCKET 0 APIC 1 microcode 28
[ 1561.519951] [Hardware Error]: Run the above through 'mcelog --ascii'
[ 1561.519953] [Hardware Error]: CPU 0: Machine Check Exception: 4 Bank 3: be00000000800400
[ 1561.519955] [Hardware Error]: TSC 539b174de9d ADDR 3fe98d264ebd MISC 1 
[ 1561.519957] [Hardware Error]: PROCESSOR 0:206a7 TIME 1357862746 SOCKET 0 APIC 0 microcode 28
[ 1561.519958] [Hardware Error]: Run the above through 'mcelog --ascii'
[ 1561.519959] [Hardware Error]: Machine check: Processor context corrupt
[ 1561.519960] Kernel panic - not syncing: Fatal Machine check
[ 1561.519962] Pid: 0, comm: swapper/5 Tainted: P   M     C O 3.2.0-35-generic #55-Ubuntu
[ 1561.519963] Call Trace:
[ 1561.519964]  <#MC>  [<ffffffff81644340>] panic+0x91/0x1a4
[ 1561.519971]  [<ffffffff8102abeb>] mce_panic.part.14+0x18b/0x1c0
[ 1561.519973]  [<ffffffff8102ac80>] mce_panic+0x60/0xb0
[ 1561.519975]  [<ffffffff8102aec4>] mce_reign+0x1f4/0x200
[ 1561.519977]  [<ffffffff8102b175>] mce_end+0xf5/0x100
[ 1561.519979]  [<ffffffff8102b92c>] do_machine_check+0x3fc/0x600
[ 1561.519982]  [<ffffffff8136d48f>] ? intel_idle+0xbf/0x150
[ 1561.519984]  [<ffffffff8165d78c>] machine_check+0x1c/0x30
[ 1561.519986]  [<ffffffff8136d48f>] ? intel_idle+0xbf/0x150
[ 1561.519987]  <<EOE>>  [<ffffffff81509697>] ? menu_select+0xe7/0x2c0
[ 1561.519991]  [<ffffffff815082d1>] cpuidle_idle_call+0xc1/0x280
[ 1561.519994]  [<ffffffff8101322a>] cpu_idle+0xca/0x120
[ 1561.519996]  [<ffffffff8163aa9a>] start_secondary+0xd9/0xdb
Run Code Online (Sandbox Code Playgroud)

bt 输出回溯:

PID: 0      TASK: ffff880211251700  CPU: 5   COMMAND: "swapper/5"
 #0 [ffff88021ed4aba0] machine_kexec at ffffffff8103947a
 #1 [ffff88021ed4ac10] crash_kexec at ffffffff810b52c8
 #2 [ffff88021ed4ace0] panic at ffffffff81644347
 #3 [ffff88021ed4ad60] mce_panic.part.14 at ffffffff8102abeb
 #4 [ffff88021ed4adb0] mce_panic at ffffffff8102ac80
 #5 [ffff88021ed4ade0] mce_reign at ffffffff8102aec4
 #6 [ffff88021ed4ae40] mce_end at ffffffff8102b175
 #7 [ffff88021ed4ae70] do_machine_check at ffffffff8102b92c
 #8 [ffff88021ed4af50] machine_check at ffffffff8165d78c
    [exception RIP: intel_idle+191]
    RIP: ffffffff8136d48f  RSP: ffff880211261e38  RFLAGS: 00000046
    RAX: 0000000000000020  RBX: 0000000000000008  RCX: 0000000000000001
    RDX: 0000000000000000  RSI: ffff880211261fd8  RDI: ffffffff81c12f00
    RBP: ffff880211261e98   R8: 00000000fffffffc   R9: 0000000000000f9f
    R10: 0000000000001e95  R11: 0000000000000000  R12: 0000000000000003
    R13: ffff88021ed5ac70  R14: 0000000000000020  R15: 12d818fb42cfe42b
    ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018
--- <MCE exception stack> ---
 #9 [ffff880211261e38] intel_idle at ffffffff8136d48f
#10 [ffff880211261ea0] cpuidle_idle_call at ffffffff815082d1
#11 [ffff880211261f00] cpu_idle at ffffffff8101322a
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Sco*_*amb 38

我有两个建议可以开始。

第一个你不会喜欢。无论你认为你的超频系统有多稳定,它都会是我的第一个怀疑对象。您向其报告问题的任何开发人员都会说同样的话。您稳定的测试工作负载不一定使用相同的指令,无论如何都对内存子系统施加压力。停止超频。如果你想让人们相信问题不是超频,那么在不超频时让它发生,这样你就可以获得干净的错误报告。这将对其他人为解决这个问题投入多少精力产生巨大影响。拥有无错误的软件是一件值得骄傲的事情,但是来自硬件设置特别有问题的人的报告令人沮丧,可能根本不涉及真正的错误。

第二个是获取 oops 数据,正如您所注意到的,这些数据不会出现在您提到的任何地方。如果崩溃只在运行 X11 时发生,我认为本地控制台几乎没有了(无论如何这很痛苦),所以你需要通过串行控制台、网络或保存到本地磁盘来做到这一点(这比这听起来可能是因为您不希望不可信的内核损坏您的文件系统)。这里有一些方法可以做到这一点:

  • 使用netdump通过网络保存到服务器。我已经很多年没有这样做了,所以我不确定这个软件是否仍然存在并使用现代内核,但它很容易,值得一试。
  • 使用串行控制台启动;您需要在两台机器上都有一个免费的串行端口(无论是老式机器还是 USB 串行适配器)和一条空调制解调器电缆;您将配置另一台机器以保存输出。
  • kdump似乎是现在很酷的孩子们使用的东西,而且看起来很灵活,虽然我不喜欢它,因为它看起来很复杂。简而言之,它涉及启动一个不同的内核,该内核可以做任何事情并检查以前内核的内存内容,但是您必须基本上构建整个过程,而且我没有看到很多固定选项。更新:实际上,有一些不错的发行版;在 Ubuntu 上,linux-crashdump

获得调试信息后,您可以使用一个名为ksymoops的工具将地址转换为符号名称,并开始了解内核是如何崩溃的。如果符号转储对您没有任何意义,至少在此处或在您的 Linux 发行版的邮件列表/错误跟踪器上报告会有所帮助。


crash故障转储中,您可以尝试输入logbt获取更多信息(在恐慌和堆栈回溯期间记录的内容)。不过,您Fatal Machine check似乎是从这里来的。通过浏览代码,您的处理器报告了机器检查异常- 硬件问题。同样,我的第一个赌注是超频。似乎log输出中可能有更具体的消息可以告诉您更多信息。

同样从该代码来看,如果您使用mce=3内核参数启动,它会停止崩溃……但除了作为诊断步骤之外,我真的不推荐这样做。如果 Linux 内核认为这个错误值得崩溃,那可能是对的。


小智 5

a) 检查内核消息是否被 rsyslog 守护进程记录到文件中

vi /etc/rsyslog.conf
Run Code Online (Sandbox Code Playgroud)

并添加以下内容

kern.*                 /var/log/kernel.log
Run Code Online (Sandbox Code Playgroud)

重新启动rsyslog服务。

/etc/initd.d/rsyslog restart
Run Code Online (Sandbox Code Playgroud)

b) 记下加载的模块

`lsmod >/your/home/dir`
Run Code Online (Sandbox Code Playgroud)

c) 由于恐慌是不可重现的,所以等待它发生

d) 一旦发生紧急情况,使用实时或紧急 CD 启动系统

E)挂载文件系统(通常为/,就足够了的/ var和/ home都没有独立的文件系统),受影响的系统(pvsvgslvs命令需要,如果你正在使用受影响的系统上LVM运行,弹出LV) mount -t ext4 /dev/sdXN /mnt

f) 转到/mnt/var/log/目录并检查kernel.log文件。这应该为您提供足够的信息来确定恐慌是否发生在特定模块或其他东西上。

  • 就我的经验而言,内核崩溃很少会进入“kernel.log”,因为日志信息需要通过系统日志、文件系统驱动程序、磁盘缓存和磁盘驱动程序走很长一段路。最简单优雅的方法是使用 [`netconsole`](https://wiki.ubuntu.com/Kernel/Netconsole) 内核模块。 (2认同)