如何查找 Linux 死机原因?

标签: Tips Crash Panic | 发表时间:2011-10-28 16:13 | 作者:黑日白月 张家良
出处:http://linuxtoy.org

Linux 内核虽然号称“不死族”,几乎不会崩溃或者死机,但是特殊情况下,还是有一定几率会宕机的。转载自 deleak.com

因为 Linux 广泛用于生产环境,所以每一次宕机都会引起相当大的损失。它 Uptime 达到上百天也许你习以为常,但是只要 Down 十几秒,就会立即急的满头大汗。真的很难以想象证交所宕机会怎么样,也许全国股民会闹翻天。所以我们需要一些小技巧来查找死机的原因,从而避免死机或者内核崩溃。(话说 windows 天天蓝屏也没感觉呀 :-o 难道已经麻木了 :oops: )

请注意:以下方法可能不适用于 Server,因为桌面环境和 Server 还是有很大区别的。

X Crash

事实上 Linux 内核很少出错,平常我们所遇到的“死机”都是 X 无响应造成的错觉。那 X 没响应了应该怎么处理呢?

通常套路是 Ctrl + Alt +F7 (F8) 切换到某个 tty,然后用 root 登陆,执行 top 查看吃资源最多的程序,然后使用 pkill/kill/killall 等命令杀死该程序。或使用组合键 Ctrl + Alt + Backspace 重启 X (黑日白月注:这个快捷键组合在最新的 Ubuntu 和 Fedora 中关闭)。

如果偶遇切换 tty 失败或者没响应,可以试着使用 SSH 登陆此电脑,然后再杀死程序。也许只是 X 不响应,而内核和 SSH daemon 仍然工作,故此可以实施此法。

arch 配置 SSH daemon

万一 X 不给力,各种方法试了无效,又没有办法通过 SSH 登陆到此 pc,那怎么办呢?别着急,我们还有万能的 “reisub” 大法。不过在启用前先要激活内核 sysrq 功能 (via) 。系统启动时执行: echo "1" > /proc/sys/Kernel/sysrq 或者修改 /etc/sysctl.conf 文件,设置 Kernel.sysrq = 1。系统异常时依次按下 Alt+sysrq+{reisub} ,然后系统会自动重启。(有关 sysrq 请看:Linux 死机了怎么办?

不建议长按 Power 按键强制关机,有可能损坏硬件或者丢失数据,甚至导致磁盘坏道!

X 崩溃而内核完好常见的症状有:程序无响应,花屏,鼠标移动指针无动作,键盘输入没有识别等。但后台的音乐可以正常播放,或者键盘 Caps Lock/Num Lock/Scroll Lock 按键按后对应 LED 可以正常亮灭。遇到此种情况可以使用上述方法重启 X 或者电脑即可恢复正常。

Application Crash

这个比较常见,但是也是相当难解决的。因为 Linux 上的应用软件大部分都是开源的,所以可能没有超高的稳定性。也许由于库的缺少或者版本错误,或者代码的 Bug,都有可能导致程序出现异常。

一般遇到这种问题,建议检查配置文件是否正确,对配置文件的错误修改可能导致程序的运行失败。如果您确信配置文件没有错误但是程序仍然异常,可以尝试把配置文件删除(注意备份!),然后再次打开软件尝试。通常程序的配置文件在:

  • ~/.[APPNAME]
  • ~/.config/[APPNAME]
  • /etc/[APPNAME].conf

或者有可能是库的错误,您可以在终端输入程序名或者程序路径运行程序,根据终端的提示信息除错。由于导致程序崩溃的可能性多种多样,在此不能一一列举,所以建议您根据出错信息去 google 搜索并找到解决方案。

Kernel Panic

X 的问题还好办,可是如果 RPWT 碰到 Kernel Panic,那可真是上天无路入地无门,撞墙的心都有 :evil: 。

一般引起 Kernel Panic 的原因很多,但是都比较罕见。例如硬件问题 (irq confilct, bad block, high temperature),软件问题(错误的 mod,内核的 Bug),或者文件系统不支持(没有内建 ext4 支持却挂载 ext4 的 root 分区),硬件的变动(如添加/更换内存,不支持架构的cpu),错误的驱动。

Kernel Panic 的表现形式也是多种多样:启动失败,不正常的长时间 io 操作,键盘灯的不正常频闪,wireless 等指示灯错误闪烁,无响应(请区别 xorg crash 情况),彻底锁死,黑屏,reisub 大法不灵 等等。

一般情况下,秉承 KISS 原则的 Linux 内核,会尽力解决一切错误并正常运行,如果遇到极端情况发生 Panic,它会尽可能把所有相关信息显示在屏幕上——至于多少,别奢求,Kernel 已经尽力了。

因为 Kernel Panic 是一种很极端的情况,有的人可能自从使用 Linux 就没有遇到过。所以我们要收集所有相关的信息来解决问题。发生错误后的各种输出是最直接的最有效的( Dump 在 tty。请关闭 x)。因为 Kernel 已经崩溃,不一定能找到完整的 Log。您可以根据以下线索尝试:

  1. /var/log/messages —— rp 爆发的时候,也许会记录下很多相关信息。按照时间戳查找。
  2. 回溯操作 —— 回忆 Kernel Panic 之前所做的所有事,并回滚。(如安装了某个程序,可以在 /var/log/pacman.log 找到安装日志)
  3. Dump 信息 —— 屏幕输出信息是系统最后的“遗言”,请使用数码相机或者笔纸记录。(tty only)

接下来就应该根据错误发生的可能原因进行排除。将内核启动参数化为最简形式,不应附加任何不必要参数,并 BIOS 中禁用掉所有无关硬件。相关日志文件:

  • /var/log/boot
  • /var/log/xorg 所有相关(仅参考)
  • /var/log/messages

如果可以,您应该记录下所有屏幕输出信息,并查看 /var/log/messages

可能遇到的问题,和解决方法:

  1. irq conflict (还好我没碰到),可以尝试从 bios 修改硬件irq,或者升级 bios,都不生效就换电脑或者禁用冲突硬件;
  2. bad balock,尝试修复坏道或者屏蔽坏道分区,建议更换磁盘;
  3. io error,同上,也有可能是没有内建文件系统支持的原因,重新编译内核或者找最新版的内核安装;
  4. mod,删除可能导致错误的内核模块(如 vboxdrv),涉及到的命令有:
    • lsmod: 列出已载入的模块
    • modprobe: 载入模块(黑日白月注:在这里和其他命令对应的为 insmod + depmod 比较好,modprobe 更类似于 XXXmod 系列命令的升级整合版本。)
    • rmmod: 移除内核中模块,效果等同于 modprobe -r
    • modinfo: 显示模块相关信息
  5. driver,a卡或者n卡驱动,也容易造成问题;
  6. 硬件本身的问题导致,建议检测硬件可用性和兼容性(例如 memtest+);
  7. 内核 bug,如果您有能力,建议使用 KDB (Kernel debugger) 排错,或者重新编译内核;
  8. 不负责任的告诉您,最好的方法是换 windows :mrgreen:

为了方便作者集中回复,请前往原文评论

消息来源

分类: Tips | 永久链接 | 收藏到 del.icio.us | Email 给好友 | 无评论 | 捐助本站

相关 [linux 死机 原因] 推荐:

如何查找 Linux 死机原因?

- 张家良 - LinuxTOY
Linux 内核虽然号称“不死族”,几乎不会崩溃或者死机,但是特殊情况下,还是有一定几率会宕机的. 因为 Linux 广泛用于生产环境,所以每一次宕机都会引起相当大的损失. 它 Uptime 达到上百天也许你习以为常,但是只要 Down 十几秒,就会立即急的满头大汗. 真的很难以想象证交所宕机会怎么样,也许全国股民会闹翻天.

linux死机了怎么办?

- 临峰 - 牛博山寨 编辑推荐
曾经啊,对着键盘上 Print Screen/SysRq 的键琢磨许久,也不知道所谓 SysRq 到底是做什么用的. 自从用了 linux,才算知道是给内核传递信息,紧急情况下重启系统用的. 因为在 windows 的时候,从来没有用到过这个按键,所以我也就一直忽略掉了它的存在. 直到有一天一个 flash 视频全屏后,x 崩溃,不要说进 tty 杀 gnome,就是按下 numberlock 都要反应好一会熄灭…… 幸好我有 SysRq 这个终极武器 ,顺利重启系统,避免了当前数据的丢失.

Linux运行慢?找出原因

- alswl - 笨兔兔
对Linux 和Windows 都很熟悉的同学会告诉你:在同一配置上Linux 将会有更加出色的表现. 有些同学会感觉到与上面的说法正好想法. 据Top500.org统计,约90%的世界一流超级计算机都运行Linux. 内核和系统基本一样,速度却有高低之分,原因大部分出现在硬件和一些软件问题上. 本文稍微给大家介绍下检验技巧,找到问题所在.

导致Linux Kernel电源问题原因可能找到

- Hitsmaxft - Solidot
自Linux 2.6.38 kernel开始,移动Linux用户发现电力消耗迅速飚升,电池续航时间迅速减少,这迫使部分用户放弃使用Linux发行版如Ubuntu 11.04,电源退化(regression)问题受到了许多人的关注,在Launchpad上有数百人报告这一bug. phoronix.com执行了一次自动耗电量测试,寻找出问题的根源.

Javascript 里跑Linux

- rockmaple - Shellex's Blog
牛逼到暴的大拿 Fabrice Bellard,用Javascript实现了一个x86 PC 模拟器,然后成功在这个模拟器里面跑Linux(请用Firefox 4 / Google Chrome 11打开,Chome 12有BUG). 关于这个东西… 伊说 “I did it for fun“,大大啊大大啊….

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

linux makefile编写

- hl - C++博客-首页原创精华区
在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则. target也就是一个目标文件,可以是Object File,也可以是执行文件. prerequisites就是,要生成那个target所需要的文件或是目标. command也就是make需要执行的命令. 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在 command中.

Linux下的VDSO

- 圣斌 - Adam's
VDSO(Virtual Dynamically-linked Shared Object)是个很有意思的东西, 它将内核态的调用映射到用户态的地址空间中, 使得调用开销更小, 路径更好.. 开销更小比较容易理解, 那么路径更好指的是什么呢. 拿x86下的系统调用举例, 传统的int 0×80有点慢, Intel和AMD分别实现了sysenter, sysexit和syscall, sysret, 即所谓的快速系统调用指令, 使用它们更快, 但是也带来了兼容性的问题.

Linux wget命令

- - CSDN博客推荐文章
wget是linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径. 例如: # wget  http://www.linuxsense.org/xxxx/xxx.tar.gz. 简单说一下-c参数, 这个也非常常见, 可以断点续传, 如果不小心终止了, 可以继续使用命令接着下载.

linux 小技巧

- - DBA Blog
2:如何限制用户的最小密码长度. 修改/etc/login.defs里面的PASS_MIN_LEN的值. 比如限制用户最小密码长度是8:. 3:如何使新用户首次登陆后强制修改密码. 4:更改Linux启动时用图形界面还是字符界面. 将id:5:initdefault: 其中5表示默认图形界面. 改id:3: initdefault: 3表示字符界面.