“ 小明是某IT公司的资深架构运维攻城狮,一次,老板来了个大活,给A股某个券商安装系统。第一天开盘,股价一直狂跌,然后就死机了,老板损失惨重。老板喊小明来解决。小明翻遍了某哥的私房宝典,也找不到解决办法,两手一摊:搞不定,要找红帽。老板怒:滚”
现在是Linux系统大行其道的年代,虽然Linux系统是由全球顶尖的程序猿开发的,但是蛮难不会发生死机黑屏的问题。就连牛气冲天的微软也经常在关键时刻蓝屏死机。小的时候看到windows蓝屏死机了,总在想,如果我能分析出来蓝屏死机的原因就牛了。
windows的死机
Linux的死机黑屏
可是到了今天,依然不会分析windows蓝屏死机,但是如果今天你还不会分析Linux内核的黑屏死机的话,就会被淘汰了。不管你是Linux/Centos运维还是Linux驱动内核研发,不管有多少个RHEL的认证证书,RHCE/RHCA(Red Hat Certified Architect, 红帽最高级的架构师证书)只是敲门砖,重要的是帮助老板和客户快速定位和解决RHEL/Centos或者产品的死机黑屏问题。
01 Kdump+Crash介绍
—
1. kdump+Crash工具是啥?
当系统发生崩溃的时候,需要有一种方法能把发生崩溃时候的现场(上下文)保存下来,提供给系统管理人员和开发人员进行定位分析。早在2005年的时候,kdump这个想法已经实现了,到了现在各大Linux发行版都支持kdump,包括RHEL和Centos。
当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。由于 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。
2. kdump+crash工具能解决啥问题?
笨叔把死机黑屏有两种情况,从CPU角度来看:
一种是真死:比如硬件的bug把系统总线挂死,CPU也不跑了,这是真死。这种情况有一个显著的特点:就是系统需要 poweroff下电(也叫冷启动)之后才能恢复,热启动是不行的。冷启动之后,发生奔溃的现场就从DDR内存里消失了。
第二种是假死:假死是我们看到设备没反应了,屏幕灭了,键盘鼠标也不动,ssh也访问不了等等,但是CPU是活的,这种没有相应的死,笨叔把它叫做假死,英文称为unresponsive,好比一个人休克了,但是心脏还是跳动的,医生可以利用电击等手段救活。
kdump+crash工具最擅长医治假死的情况,百医百治,药到病除。对于第一种情况,因为系统需要把电重新上电才能启动,kdump无计可施了,遇到这种情况只能上硬件仿真器等等了。
3. kdump+crash工具在Centos上的安装
kdump+crash工具在Centos 7.x系统上已经很成熟了,简单几步就安装完成。
4. 怎么测试kdump+crash工具已经部署成功?
输入命令“service kdump status”可以看到kdump服务是否配置成功。
输入如下命令可以测试:
# echo 1 > /proc/sys/kernel/sysrq ; echo c > /proc/sysrq-trigger
如果没有问题,系统会自动重启,重启后可以看到在/var/crash/目录下生成了coredump文件。
5. Crash工具有哪些常用的命令。
crash工具一共有50个命令,常用的命令也就那么几个,大家可以跟着笨叔的视频一起来学习常用的几个命令。
6. 怎么在arm64环境下玩kdump+crash?
很多小伙伴可能会对ARM64更感兴趣,希望可以搭建一个免费的可以玩的平台。笨叔教大家怎么在Host主机里利用Qemu安装一个Debian for ARM64系统,然后在里面玩kdump+crash,即免费又好玩,省去买开发板的钱。
02 kdump+crash死机案例分析
—
笨叔在这一次挑战死机的专题视频中,设计了8个死机案例,分别有:
lab1:简单的空指针引发的panic
lab2:访问已经被删除的list head链表
lab3:复杂一点的空指针引发的panic
lab4:一个真实的驱动引发的死机
lab5:一个真实的驱动引发的死锁,导致系统假死
lab6:如何找到函数调用参数的在栈中地址然后获取具体的值
lab7:分析一个复杂的线上死锁导致的死机黑屏例子
lab8: 手工恢复函数调用栈backtrack (arm64)
lab1: 简单的空指针引发的panic
一个简单的例子,来让我们看看如何使用kdump+crash工具来定位问题。
运行crash工具之后。
crash工具简单明了的告诉你panic的原因。
用bt命令可以查看发生崩溃时的内核栈调用关系backtrace,通过backtrace来反推发生了神马事情导致内核崩溃了。RIP寄存器指示了发生错误的具体地址。
通过反汇编dis命令就可以看到具体出错是在那条指令了,是不是入门很easy?
如果你觉得上面三板斧就是crash的全部,那就大错特错了,crash工具迷人的地方,就像警察破案,需要一步一步进行推理和推导。
lab4:一个来源于真实驱动例子的死机
上面是来自项目上一个小朋友写的驱动。这个驱动,一上来就死机给你一个下马威,你能看出来是真名原因导致的死机吗?
如果一下子看不了,没关系,可以来看笨叔的[死磕死机专题]视频节目。
lab6:推导函数形参的存储位置和具体的值
我们常常在进行死机分析和推理的过程中,需要分析调用函数的形参具体存放在哪里?然后就可以知道在崩溃时刻,这些形参都是具体什么值,这些值是非常珍贵的破案现场,这个过程是非常有意思的。
这是非常高级而且有用的技巧,您需要了解x84_64或者arm64体系结构的参数调用规则,以及栈是如何布局的。另外还需要结合反汇编来进行推导。
在这个实验里,笨叔教大家如何通过反汇编+backtrace,来推导出在泪崩时刻,create_oops()函数的第二和第三个参数具体存放在哪里?他们具体的值又是多少?
lab7:一个复杂的死锁死机例子
一个来源真实线上云系统死锁导致的死机的案例。
通过这个例子的学习,我们有能力和有信心去解决线上服务器或者产品发生死机黑屏的问题,我们不再是只会安装Centos系统的小运维工程师了,我们开始会分析和定位复杂的死机问题了,给老板展示我们的硬实力!!!
lab8:手动恢复函数调用栈(arm64)
这是一个非常高的技巧,在死机实战过程中是非常有用的神技。重要是要明白和理解ARM64的函数调用的协议(procedure call standard)以及栈帧是怎么布局 和组织的。
说了这么多,小伙伴会问,怎么参加笨叔的死机专题视频学习?
订阅第一季或者第二季旗舰篇的小伙伴都可以免费参加死机主题视频课程。
死机专题视频课程分成上下两集,全程5小时高清视频,140多页ppt,8大死机案例:
上集:x86_64专场,讲述Centos 7.x系统的死机案例分析 (3个多小时)
下集:ARM64专场 (约1.5小时)
联系客服