Linux:内核调试之内核魔术键sysrq

        在linux系统下,我们可能会遇到系统某个命令hang住的情况,通常情况下,我们会查看/proc/pid/wchan文件,看看进程处于什么状况,然后进一步查看系统日志或者使用strace跟踪命令执行时的系统调用等等方法来分析问题。我们知道命令hang,一般问题都出在内核里, 如果我们能根据自己的需要打印内核的信息,可能会事半功倍,很快定位到问题。

        幸运的是linux真的有提供这样的方式,就是通过SysRq,今天在这里我就介绍一下。

一、Sysrq

        SysRq(system request) 是 Linux 操作系统内核理解的一系列键,可以触发一组预定义的操作。 当无法通过传统管理 (执行虚拟机故障排除或恢复时,通常使用这些命令,例如,VM 未) 响应。 

        Sysrq被称为”魔术组合键”, 是内建于Linux内核的调试工具,只要内核没有完全锁住,不管内核在做什么事情,内核都会响应这一系列组合键,使用这些组合键可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。

        SysRq 键在确认内核运行、调查内核死机原因等各种情况下都非常有效。

二、启用sysrq

        要想使用 Magic SysRq key 打开内核配置选项 CONFIG_MAGIC_SYSRQ,一般的发行版都默认打开该配置选项:

#

# Kernel hacking

#

......

CONFIG_MAGIC_SYSRQ=y

        当运行一个编译了SysRq的内核时,/proc/sys/kernel/sysrq文件的值控制着允许通过SysRq键(键盘组合键)调用的函数,下面是/proc/sys/kernel/sysrq中可能的值列表:

0 - disable sysrq completely

1 - enable all functions of sysrq

>1 - bitmask of allowed sysrq functions (see below for detailed function description):

      2 =   0x2 - enable control of console logging level
      4 =   0x4 - enable control of keyboard (SAK, unraw)
      8 =   0x8 - enable debugging dumps of processes etc.
     16 =  0x10 - enable sync command
     32 =  0x20 - enable remount read-only
     64 =  0x40 - enable signalling of processes (term, kill, oom-kill)
    128 =  0x80 - allow reboot/poweroff
    256 = 0x100 - allow nicing of all RT tasks

/proc/sys/kernel/sysrq文件的值控制着SysRq键(键盘组合键)的一些功能。

echo "number" >/proc/sys/kernel/sysr

例如:

echo 1 >/proc/sys/kernel/sysrq      ##设置为1时,使能SysRq键的所有功能。

或者通过 sysctl 命令也可以设置或者读写内核参数:

sysctl -w kernel.sysrq = 1

        备注:/proc/sys/kernel/sysrq的值只影响通过 键盘组合键的调用。通过/proc/sysrq-trigger调用任何操作总是被允许的(由具有管理权限的用户)。
即 /proc/sys/kernel/sysrq的值 只是影响 键盘组合键触发内核操作,对于 /proc/sysrq-trigger触发内核操作没有影响。

内核配置选项中使能CONFIG_MAGIC_SYSRQ选项,这样系统启动之后,会生成/proc/sysrq-trigger节点用于调试。

        一般用法:

sysctl -n kernel.sysrq      ####显示当前的sysrq值,通常是16, 表示使用“sysnc”命令

sysctl -w kernel.sysrq=1   ### “1”表示启用sysrq全部功能键。

sysctl -n kernel.sysrq      ###确认sysrq功能键启用,也可以用以下命令查看

若要使 SysReq 配置持久化,可以执行以下操作来启用所有 SysRq 命令

将此行添加到 /etc/sysctl.conf

kernel.sysrq = 1

或者

echo "kernel.sysrq = 1" >> /etc/sysctl.conf

通过运行重新启动或更新 sysctl

sysctl -p

三、SysRq的使用

SysRq的使用有两种方式:

  • 第一种是键盘组合键:Alt+SysRq + command key 。(受到/proc/sys/kernel/sysrq值的影响)
  • 第二种是修改/proc/sysrq-trigger文件的值。(不受/proc/sys/kernel/sysrq值的影响)

  主要介绍第二种方式:

/proc/sysrq-trigger文件的值不受/proc/sys/kernel/sysrq值的影响,所以将/proc/sys/kernel/sysrq的值设置为0,依然可以触发内核的各种事件。

[root@localhost ~]# echo 0 > /proc/sys/kernel/sysrq
[root@localhost ~]# cat /proc/sys/kernel/sysrq
0

比如:

echo t > /proc/sysrq-trigger

四、命令介绍(部分)

echo <command key> > /proc/sysrq-trigger

键名    功能说明

b         在没有同步或卸载硬盘的情况下立即启动。

c         为了获取崩溃转储执行kexe重启动。

d         显示被持的所有锁。

e         发送信号SIGTERM给所有进程,除了init外。

f         将调用oom_kill杀死内存热进程。

g         在平台ppc和sh上被kgdb使用。

h         显示帮助信息。

i         发送信号SIGKILL给所有的进程,除了init外。

k         安全访问密钥(Secure Access Key,SAK)杀死在当前虚拟终端上的所有程序。

m         转储当前的内存信息到控制台。

n         用于设置实时任务为可调整nice的。

o         将关闭系统(如果配置为支持)。

p         打印当前寄存器和标识到控制台。

q         将转储所有正运行定时器的列表。

r         关闭键盘Raw模式并设置为XLATE模式。

s         尝试同步所有挂接的文件系统。

t         将转储当前的任务列表和它们的信息到控制台。

u         尝试以仅读的方式重挂接所有已挂接的文件系统。

v         转储Voyager SMP处理器信息到控制台。

w         转储的所有非可中断(已阻塞)状态的任务。

x         在平台ppc/powerpc上被xmon(X监视器)接口使用。

0~9    设备控制台日志级别,控制将打印到控制台的内核信息。例如:0仅打印紧急信息,如:PANIC和OOPS信息。

1、echo m > /proc/sysrq-trigger

        将当前内存信息转储到主机。

2、echo t > /proc/sysrq-trigger

        该命令会输出系统中所有进程(包括系统的和用户的)的执行状态、调用栈信息

3、echo w > /proc/sysrq-trigger

转储处于不可中断 (阻止) 状态的任务。

4、echo l > /proc/sysrq-trigger

显示所有活动 CPU 的堆栈回溯。

5、echo p > /proc/sysrq-trigger

将当前寄存器和标志转储到主机。

6、echo q > /proc/sysrq-trigger

 将转储每个 CPU 列表的所有武装 hrtimers (但不是常规timer_list计时器) 和有关所有时钟事件设备的详细信息。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
linux内核调试分析指南 linux内核调试分析指南--上篇 本文档已经转到下面的网址,位于zh-kernel.org的文档停止更新,请访问新网址 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 skyeye的使用 UML的使用 vmware的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环境的建立 gdb基础 基本命令 gdb之gui gdb技巧 gdb宏 汇编基础--X86篇 用户手册 AT&T汇编格式 内联汇编 汇编与C函数的相互调用 调用链形成和参数传递 C难点的汇编解释 优化级别的影响 汇编基础--ARM篇 用户手册 调用链形成和参数传递 源码浏览工具 调用图生成工具 find + grep wine + SI global Source-Navigator vim + cscope/ctags kscope lxr SI等与gdb的特点 调用链、调用树和调用图 理想调用链 函数指针调用 调用链的层次 非理想调用链 调用树与调用图 穿越盲区 穿越gdb的盲区 穿越交叉索引工具的盲区 工程方法 bug 与 OOPS linux内核调试分析指南--下篇 ***第二部分:内核分析*** 内核组织层次和复杂度 内核层次 内核复杂度 复杂度隔离 gdb在内核分析中的用途 数据验证 界面剥离 参数记忆 路径快照 长程跟踪 整理思路 内核编码的艺术 信息聚集 数据聚集 关系聚集 操作聚集 松散聚集 顺序聚集 链表聚集 哈希聚集 树形聚集 分层聚集 分块聚集 对象聚集 设施客户 设备驱动模型分析 linux设备子系统的组成 设备驱动模型 usb子系统分析 如何阅读分析大型子系统 btrfs文件系统分析 区间树核心代码分析 B树核心代码分析 调试相关子系统 kgdb源码分析 sysrq oprofile kprobes 驱动分析 载入模块符号 ***第三部分:其他工具*** kexec strace ltrace SystemTap MEMWATCH YAMD Magic SysRq 附录:社区交流相关 补丁提交相关文档 补丁制作与提交示范 多补丁发送工具 git使用 Git公共库创建及使用 附录:内核参考书籍文章 内核git库 书籍 子系统官方网站 必看网站 参考文章 私人备忘

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值