故障排除 Linux操作系统死机处理方法总结

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
 

通常在出现系统崩溃后,大家会担心再次出现故障,但是发现系统各日志中并没有记录到任何死机前后的信息,无法分析故障原因,认为已经无药可救。但是,实际上,Linux 有多种机制来保证发生系统崩溃后,可以获取有价值的信息用以分析问题。确定是硬件故障,还是应用程序bug 导致的。

 

Linux 中,有如下几种方法来获取各种崩溃时产生的信息。

 

1.Core dump

 

Core dump 通常用来调试应用程序错误,当某些应用程序运行出现异常崩溃时,可以开启系统的 core dump 功能,来得到一个程序崩溃时的内存信息,用来分析崩溃原因:

 

在/etc/profile里加上(或者改)一条:

 

ulimit -c 0

 

运行命令:sysctl -w "kernel.core_name_format=/coredump/%n.core"

 

该命令意思是指core文件放在/coredump目录下,文件名是进程名+.core

 

2.Diskdump

 

diskdump工具提供了在单机上创建和采集vmcore(kernel dump)的能力,而无须使用网络。当内核本身出现崩溃的时候,当前的内存和CPU状态以及相关的信息都会被保存到一个支持diskdump的磁盘上的保留分区上。在下一次重新启动的时候,当系统重新启动,diskdump的初始化脚本会从保留分区中读取保存的信息并创建一个vcore文件,然后这个文件被再次存放到/var/crash/目录下,文件名为127.0.0.1-

 

如下是一个配置 HP SCSI 设备上启用 diskdump 的过程,如果不是 HP SCSI 设备(即设备名为 /dev/sdX的形式),则无须执行第三、四两个步骤。但需要在第一步前先执行命令: modprobe

 

diskdump

 

第一步:编辑 /etc/sysconfig/diskdump文件,将一个空白分区的设备名填入后保存退出,例如:

 

DEVICE=/dev/cciss/c0d0p2

 

第二步:初使化 dump 设备

 

#service diskdump initialformat

 

警告:该分区的所以数据会丢失。

 

第三步:使用 cciss_dump 模块替换当前的 cciss 模块:

 

在 /etc/modprobe.conf 找到如下行:

 

alias scsi_hostadapter cciss

 

修改为:

 

alias scsi_hostadapter cciss_dump

 

再增加一行:

 

options cciss_dump dump_drive=1

 

注:假设diskdump文件中配置的为 /dev/cciss/c0d[#a]p[#b], 请设置为: options cciss_dump dump_drive=[#a]

 

第四步:重建 initrd 文件:

 

#mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img.old

 

#mkinitrd /boot/initrd-`uname -r`.img `uname -r`

 

第五步:设置 diskdump 服务能够开机自启动:

 

# chkconfig diskdump on

 

3.Netdump

 

如果使用红旗DC4.0 或 3.0 版本系统,是不能支持 diskdump 的,可以利用netdump 来达到输出vmcore 的目的。但是Netdump要求至少有一个服务器以及任意数目的客户端。服务器用来接收客户端死机时的信息,客户端是经常死机的机器。 

 

(一)服务器配置:

 

(1).检验netdump服务器是否安装完毕:

 

rpm -q netdump-server

 

如果未安装,请在光盘 RedFlag/RPMS/ 目录中找到 netdump-server 打头的软件包,执行命令:

 

rpm -ivh netdump-server-x.x.x.rpm (x为版本号)

 

进行安装。

 

(2).服务器包安装后,用命令:

 

passwd netdump

 

更改用户的密码.

 

(3).打开服务:

 

chkconfig netdump-server on

 

(4).运行服务器:

 

service netdump-server start

 

(二)客户端配置:

 

(1).校验客户端是否已安装

 

rpm -q netdump

 

如果未安装,在光盘 RedFlag/RPMS/ 目录中找到 netdum 打头的软件包,执行命令:

 

rpm -ivh netdump-x.x.x.rpm (x为版本号)

 

安装.

 

(2).编辑文件/etc/sysconfig/netdump,添加如下行:

 

DEV=eth0

 

NETDUMPADDR=172.16.81.182

 

NETDUMPMACADDR=00:0C:29:79:F4:E0

 

172.16.81.182指 netdump 服务器地址。

(3).运行下面的命令,出现提示符时输入密码:

 

service netdump propagate

 

(4).打开客户端:

 

chkconfig netdump on

 

(5).运行客户端:

 

service netdump start

 

(6).测试

 

为了测试netdump的配置是否正确,在netdump客户机上做下面操作:

 

cp /usr/share/doc/netdump-xxxxxx/crash.c .

 

gcc -DKERNEL -DMODULE -I/lib/modules/$(uname -r)/build/include -c crash.c

 

insmod ./crash.o

 

这会造成系统崩溃,你会在netdump服务器的/var/crash/<客户端IP> /目录下,看到一个核心转储。当客户机正在转储数据到服务器的时候,你会看到一个名叫“vmcore-incomplete"的文件。当转储结束后,该文件会改名成 "vmcore"。"vmcore"文件的大小会变化,可能达到几个GB.在一个内存是512M的系统上,上面的测试会产生大约510M的vmcore文件。

怎么判断网卡是否支持netdump功能?

 

内核调试工具netdump需要网卡驱动支持netpoll功能。netpoll的目的是让内核在网络和I/O子系统尚不能完整可用时,依然能发送和接收数据包。主要用于网络控制台(net console)和远程内核调试(KGDBoE)中。实现netpoll功能,主要是要实现kernel中的poll_controller函数,该函数定义:void (*poll_controller)(strUCt net_device *dev)。该函数的作用是在缺少设备中断的情况下,还能对控制器做出响应。几乎所有的poll_controller函数都定义成如下形式:

 

void my_poll_controller(struct net_device *dev) {

 

disable_device_interrupt(dev);

 

call_interrupt_handler(dev->irq, dev);

 

enable_device_interrupt(dev);

 

}

 

所以,poll_controller只是模拟了来自指定设备的中断。一个最简单的判断一个网卡驱动是否这次支持netpoll功能的方法是安装内核源代码,然后在代码树 /usr/src/kernel-<version>中搜索HAVE_POLL_CONTROLLER的定义, grep -r "HAVE_POLL_CONTROLLER" /usr/src/linux-<version>/drivers/net示例如下:

 

# grep -r "HAVE_POLL_CONTROLLER" /usr/src/linux-2.4/drivers/net

 

/usr/src/linux-2.4/drivers/net/3c59x.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/3c59x.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/e100/e100_main.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/e100/e100_main.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/e1000/e1000_main.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/e1000/e1000_main.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/e1000/e1000_main.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/eepro100.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/eepro100.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/pcnet32.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/pcnet32.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/tg3.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/tg3.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/tlan.c:#ifdef HAVE_POLL_CONTROLLER

/usr/src/linux-2.4/drivers/net/tlan.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/tulip/tulip_core.c:#ifdef HAVE_POLL_CONTROLLER

 

/usr/src/linux-2.4/drivers/net/tulip/tulip_core.c:#ifdef HAVE_POLL_CONTROLLER

 

从输出可以看到,3c59x, e100, e1000, eepro100, pcnet32, tg3, tlan和tulip都支持netpoll。

 

如果系统使用了这些网卡,那么系统应该支持netpoll,那么就支持netdump。

 

如果希望进一步确认网卡是否是使用这些网卡,可以查看/etc/modules.conf:

 

# cat /etc/modules.conf

 

alias eth1 e100

 

alias eth0 3c59x

 

4.SysRq

 

SysRq组合键是一组"魔术组合键",只要内核没有被完全锁住,键盘还能够使用,不管内核在做什么事情,使用这些组合键可以立即打印出内核的信息。

 

使用sysrq组合键是了解系统目前运行情况的最好方式。如果系统出现挂起的情况或者在诊断一些和内核相关,比较怪异,比较难重现的问题的时候,使用sysrq键是一个比较好的方式。

 

为了安全起见,默认SysRq组合键是关闭的。

 

打开这个功能,运行:

 

# echo 1 > /proc/sys/kernel/sysrq

 

关闭这个功能:

 

# echo 0 > /proc/sys/kernel/sysrq

 

如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1. 重新启动以后,此功能将会自动打开。

 

kernel.sysrq = 1

 

因为打开sysrq键的功能以后,有终端访问权限的用户将会拥有一些特殊的功能。因此,除非是要调试,解决问题,一般情况下,不要打开此功能。如果一定要打开,请确保您的终端访问的安全性。

 

如何触发一个sysrq事件?

 

有几种方式可以触发sysrq事件。在带有AT键盘的一般系统上,在终端上输入一下组合键:

 

Alt+PrintScreen+[CommandKey]

 

例如,要让内核导出内存信息(CommandKey "m"),您应该同时按下Alt 和 Print Screen 键,然后按下 m 键. 提示: 此组合键在Xwindows上是无法使用的。所以,您先要切换到文本虚拟终端下。如果您现在是在图形界面,可以按Ctrl+Alt+F1切换到虚拟终端。

 

当我触发一个sysrq事件的时候,结果保存在什么地方?

 

当一个sysrq命令被触发,内核将会打印信息到内核的环形缓冲并输出到系统控制台。此信息一般也会通过syslog输出到/var/log/messages.

 

有时候,可能系统已经无法响应,syslogd可能无法记录此信息。在这种情况下,建议您配置一个串口终端来收集这个信息。

 

那些类型的sysrq事件可以被触发?

 

sysrq功能被打开后,有几种sysrq事件可以被触发。不同的内核版本可能会有些不同。但有一些是共用的:

 

* m - 导出关于内存分配的信息

 

* t - 导出线程状态信息

 

* p - 到处当前CPU寄存器信息和标志位的信息

 

* c - 故意让系统崩溃(在使用netdump或者diskdump的时候有用)

 

* s - 立即同步所有挂载的文件系统

 

* u - 立即重新挂载所有的文件系统为只读

 

* b - 立即重新启动系统

 

* o - 立即关机(如果机器配置并支持此项功能)

 

故障分析

 

虽然我们可以通过上述的几种方法来获取应用程序或操作系统崩溃时的各种信息,但是分析这些问题有一定难度。

 

常见问题

 

软件相关

 

系统平时运行一切正常,自从新实施了一项应用后,频繁发生崩溃现象,此类问题多数与应用程序Bug有关,不一定在所有相同配置系统中都会产生,但是一旦触发该Bug,就有可能发生崩溃。

 

系统平时运行一切正常,自从新实施了一项应用后,频繁发生崩溃现象,也有一些情况是新增的应用需要做一定的操作系统配置,没有设置的话,也有可能出现资源利用问题,导致崩溃发生。

 

系统平时运行一切正常,自从新实施了一项应用后,频繁发生崩溃现象,也有一些情况是应用的版本与操作系统版本不匹配,应用软件所需的系统库文件版本不对应,容易引发应用程序崩溃。

 

系统平时运行正常,近期没有任何新增应用,也没有更改系统配置,却接连发生多次崩溃现象。此类问题多数是压力增大,超出了硬件所能承受的负载,耗尽资源,发生崩溃。

 

系统平时运行正常,近期无新增应用,系统负载也不高,却发生崩溃现象。不排除操作系统本身的问题,有可能某种操作诱发了一个系统Bug,发生崩溃。

 

硬件相关

 

新增内存后,系统经常发生崩溃现象,此类问题有可能是32位机器配置了超过12GB的内存,但没有使用 hugemem 核心导致,具体原因可参见第一节中的说明。

 

机器使用期限较长,某个硬件发生故障,也会导致系统崩溃的发生。

 

新配置的机器经常发生崩溃现象,有可能硬件较新,而驱动程序版本较低,一般可通过升级驱动解决,驱动一般集成在内核当中,常见的办法是升级内核版本。

探索-Linux Kdump 机制 它也没有占用多少内存空间,除了一些控制头部分占用少量内存,大块的空间都是模拟的,只有在用户读操作的时候才会从对应的内存空间去读取的。在系统发生故障时状态是很不稳定的,时间也是很紧急的,所以我们在 normal kernel 中就尽可能早的把 /proc/vomcore 文件的 elf header 数据准备好。本次并不打算对 kexec 加载内核和地址转换流程以及 kdump 的拷贝裁剪进行详细的解析,我们只关注其中的两个重要文件 /proc/kcore 和 /proc/vmcore 阅读详情

相关推荐

Linux: crash: WARNING: ***: may be truncated or incomplete

问题是这个vmcore文件,不完整。这种crash直接退出,不再提供调试功能。dumpfile size: 7018375680 文件的实际大小。bytes required: 8594327576、、期望的大小。

mzhan017的博客 574

crash

程序crash之后,使用 Crash 工具分析 Linux dump 文件 51099.com发布 来源:网络 发布时间:2010-11-23 字体: [大 中 小]      关键字:分析 文件 工具 之后 使用 程序 内核 内存 系统 一个     前言 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试

jincm的专栏 2427

Linux系统崩溃后的应对方法

例如,Alt+SysRq+R可以重新启动键盘,Alt+SysRq+E可终止所有进程并重新挂载文件系统,Alt+SysRq+S用于同步所有挂载的文件系统等。如果系统无法进入救援模式或需要进一步的故障排除,可以使用Live CD或USB来引导系统。这些是独立的操作系统镜像,可以直接从CD或USB驱动器启动。使用Live CD或USB可以访问系统的硬盘驱动器并执行各种维护任务,如修复文件系统、备份数据或查找故障的硬件。通常,在启动时按下某个特定的键(如F12或Esc)以进入引导菜单,然后选择救援模式或恢复模式。

IoqDelphi的博客 1106

centos中vmcore的生成过程窥探以及优化

vmcore

Jian Sun_的博客 2017

Kdump机制介绍以及分享

Kdump的简单介绍 什么是Kdump? Kdump是在系统崩溃、死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的crash dump。在第一kernel在运行的时候,系统内部在内存中就已经留存好了给第二kernel(捕获内核)的预留空间(这个预留空间的大小可以自己设定)。在第一kernelcrash的时候,就会进入第二kernel,在第二kernel中执行用户态程序makedumpfile对第一kernel的

wardenjohn的博客 1万+

linux系统服务经常会死机,故障排除 Linux操作系统死机处理方法总结

(3).运行下面的命令,出现提示符时输入密码:service netdump propagate(4).打开客户端:chkconfig netdump on(5).运行客户端:service netdump start(6).测试为了测试netdump的配置是否正确,在netdump客户机上做下面操作:cp /usr/share/doc/netdump-xxxxxx/crash.c .gcc -D...

weixin_42363565的博客 1972

linux系统运行死机,故障排除 Linux操作系统死机处理方法

poll_controller只是模拟了来自指定设备的中断。一个最简单的判断一个网卡驱动是否这次支持netpoll功能的方法是安装内核源代码,然后在代码树 /usr/src/kernel-<version>中搜索HAVE_POLL_CONTROLLER的定义, grep -r "HAVE_POLL_CONTROLLER" /usr/src/linux-<version>/drivers/net示例...

weixin_29189363的博客 748

linux串口导致死机,Linux系统死机情况分析与处理方案介绍

我们在使用Linux系统的时候会发现系统没有响应出现死机现象。这个时候要做些什么呢?说到这有人就会问,Linux系统会死机么?我可以很肯定地说,会!要让Linux死机很容易,但难的是在死机以后如何安全的让他摆脱死机状态,本文讲述如何从Linux死机状态中挣脱出来。Linux系统死机有很多种情况,最常见的是系统负载过高导致的。如上次介绍的fork***就是这个原理,此外还可以运行内存耗用极大的程序...

weixin_33272631的博客 1687

Linux 操作系统死机故障处理方法总结

转自:http://blog.chinaunix.net/uid-20380484-id-1692991.html 2007-07-12 16:16:02 分类: LINUX 通常在出现系统崩溃后,大家会担心再次出现故障,但是发现系统各日志中并没有记录到任何死机前后的信息,无法分析故障原因,认为已经无药可救。但是,实际上,Linux有多种机制来保证发生系统崩溃后,可以获取有

adazone的专栏 2995

我手机计算机屏幕是黑色的,教你处理手机或者电脑黑屏的简单方法

当计算机屏幕变黑时该怎么办?我们希望每次打开电脑时,我们希望它都能正常工作。当他们出现这样或者那样问题的时候,会令人非常沮丧,尤其是当我们不知道如何解决问题时。所谓的“黑屏死机”在整个操作系统中都很常见-打开机器,但屏幕空白。有时监视器会亮起,而其他时候则保持黑屏。值得庆幸的是,这种情况很少见,所以人们给它起了一个容易记住的名字。那么,当它发生在你身上时你会怎么做?屏幕无法打开可能是屏幕故障或笔记...

weixin_31225753的博客 2245

解决Ubuntu 12.04下频繁死机-Chrome

1、现象 当ubuntu出12.04(64bit)时我决定重装为12.04这个版本。装完后在2个月时间里经常出现Ubuntu死机的情况。尤其是在用chrome浏览网页时,拖动右侧的滚动条。先是页面死,1-2s后鼠标和输入设备都死了,只能按power重启。抑郁~ 2、处理过程 当时我总以为ati显卡的驱动没有装好,玩命搞fglrx。后来被我完全搞坏了。准备尝试装一下Mint Xfce这个系统。

东亮博客 1万+

Linux 死机了怎么办

https://linuxtoy.org/archives/what-to-do-if-linux-crash.html 转载于:https://www.cnblogs.com/ITniu/p/6340941.html

weixin_30553837的博客 61

linux基础与应用 linux系统常用技巧

假设键入的字符足以确定目录下一个唯一的文件时,我们只须按键盘上的 Tab 键就可以自动补齐该文件名的剩下部分,例如要把目录 /ccc 下的文件 ddddddd-1.2.3.tar.gz 解包时,当我们在命令行中键入到tar xvfz /ccc/d时,如果该文件是该目录下唯一以d起头的文件的话就可以直接按下键盘上的Tab键,这时命令会被自动补齐为:tar xvfz /ccc/ddddddd-1.2.3.tar.gz ,从而提高了输入效率。只需用这两张盘启动系统后,进入急救模式,这时使用的是root账户。

sillyoung的博客 192

使用 Linux 操作系统: Dell PowerVault RD1000 附录

概览 Linux 兼容性 在 Linux 上使用 RD1000 故障排除[@more@]---------------------------------------------------------------------...

congsikuai0611的博客 217

Linux内存卡槽故障判断,内存插槽损坏的三种常见故障

内存可以说是计算机中故障最频繁的部件之一。由于内存故障的表现是比较直接的,所以我们在维护的时候不用花太多时间去判断故障的来源。一般情况下,只要更换一个新的内存条,如果机器能够顺利启动并稳定运行,就可以断定内存条有问题。目前市场上内存的厂家很多,价格便宜很多。内存故障后,我们通常会选择用新的替换它。其实有些时候不是内存本身有问题,而是主板质量不太硬或者我们经常插拔内存芯片,导致内存插槽变形,导致机器...

weixin_42097668的博客 2644

红帽企业 Linux 故障排除指南(一)

精通 Linux Shell 脚本编程》将成为你的圣经,也是一个手册,用于在 Linux、OS X 或 Unix 中创建和编辑 bash shell 脚本。从基础知识开始,我们迅速帮助你用实际示例创建有用的脚本。这样,你的学习变得高效而迅速。每一章中,我们都提供了代码的解释和示例,因此这本书不仅是一本学习书,还可以作为一个现成的参考书,如果你需要了解如何编写特定任务的程序。这标志着本章的结束,我相信你可能会发现这很有用。

龙哥盟 476
上一篇: UNIX Shell命令行的解释执行过程最终解读
下一篇: 理解Linux系统的日志
axzeros
博客等级 码龄19年 1粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值