内核sysrq魔术键


1、开启SysRq

启用 CONFIG_MAGIC_SYSRQ 内核选项:
在这里插入图片描述
第二项为sysrq默认配置值,表示kernel会默认使能哪些功能。

CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1

同时,也可以通过以下指令在系统中查看sysrq使能的功能和临时修改sysrq功能。

cat /proc/sys/kernel/sysrq
echo "number" > /proc/sys/kernel/sysrq

如果需要每次系统重启仍然生效,则需要修改配置文件: /etc/sysctl.conf。

kernel.sysrq = number

执行下列命令,使修改生效。

sysctl -p

sysrq不同的功能值,可以置位多个不同的二进制位来同时开启多个功能。如130 转换成二进制就是 010000010,即允许重启/关机以和调整终端日志级别。

number(位)功能
0(1)完全禁用 sysrq
1 (1)启用 sysrq 的所有功能
2(2)允许控制终端日志级别
4(3)允许控制终端日志级别
8(4)允许调试进程dump
16(5)允许执行sync命令
32(6)允许重新挂载文件系统为之读
64(7)允许发送信号给进程(term,kill,oom-kill)
128(8)允许重启/关机
256(9)允许调整实时任务的优先级

SysRq支持的所有功能列表及相应的handler见drivers/tty/sysrq.c中静态数组sysrq_key_table[]的定义,当然,也可以通过下面提到的SysRq的help信息了解到。

2、使用SysRq

可以通过按键的方式或者写/proc/sysrq-trigger的方式来触发sysrq操作。sysrq支持的操作可参考HELP输出:

root@OpenWrt:/# echo > /proc/sysrq-trigger
[81962.987529] sysrq: HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) 

从上述HELP信息就能看出来SysRq都能干什么,在Documentation/sysrq.txt中也有详细介绍。例如,在系统卡住或出现其他异常但还没完全死掉(没有panic或触发watchdog)时,可以人为地制造OOM或panic,看看当前内核在干什么。

2.1 组合键按键方式

组合键按键,即 “sysrq键+命令键” 来触发一个操作,例如 sysrq + t 打印所有任务的状态。通过如下方式产生一个sysrq键:

  • 在Ubuntu下,图形界面环境不能使用sysrq,需进入文本虚拟终端环境(Ctrl+Alt+F1从图形桌面切换到虚拟终端,Alt+F7可切回来),按下Alt+Print Screen键+命令键可发送对应的命令。
  • 在嵌入式设备上,通过串口工具也可以触发SysRq,如果使用SecureCRT,则同时按下Alt和Print Screen键,会出现上述HELP,然后紧接着按下某个字母。

提示:此组合键在Xwindows上是无法使用的。所以,你先要转换到文本虚拟终端下。如果你当前是在图像界面,能按Ctrl+Alt+F1转换到虚拟终端。

嵌入式设备使用sysrq参见:《Linux sysrq使用》

2.2 写/proc/sysrq-trigger方式

开启sysrq后会生成 /proc/sysrq-trigger,通过写该文件向sysrq发送命令。

# 命令键 <command key> 区分大小写的
echo  <command key>  > /proc/sysrq-trigger
命令键功能
b将立即重启系统,不会同步或者卸载磁盘。
c将执行系统 crash,如果配置了系统 crashdump,将执行 crashdump。
d显示所有持有的锁。
e发送 SIGTERM 信号给所有进程,除了 init 进程。
f将调用 oom killer 杀掉一个过度占用内存的进程,如果什么任务都没杀, 也不会 panic。
gkgdb 使用(内核调试器)。
h将会显示帮助。(实际上除了这里列举的键,其他的都将显示帮助, 但是 h 容易记住)😃
i发送 SIGKILL 给所有进程,除了 init 进程。
j强制性的 “解冻它” - 用于被 FIFREEZE ioctl 操作冻住的文件系统。
k安全访问秘钥(SAK)杀掉在当前虚拟控制台的所有程序,注意:参考 下面 SAK 节重要论述。
l显示所有活动 cpu 的栈回溯。
m将导出当前内存信息到你的控制台。
n用于使所有实时任务变成普通任务。
o将关闭系统(如果配置和支持的话)。
p将导出当前寄存器和标志位到控制台。
q将导出每个 cpu 上所有已装备的高精度定时器(不是完整的 time_list 文件显示的 timers)和所有时钟事件设备的详细信息。
r关闭键盘的原始模式,设置为转换模式。
s将尝试同步所有的已挂载文件系统。
t将导出当前所有任务列表和它们的信息到控制台。
u将尝试重新挂载已挂载文件系统为只读。
v强制恢复帧缓存控制台。
v触发 ETM 缓存导出 [ARM 架构特有]
w导出处于不可中断状态(阻塞)的任务。
x在 ppc/powerpc 架构上用于 xmon 接口。 在 sparc64 架构上用于显示全局的 PMU(性能监控单元)寄存器。 在 MIPS 架构上导出所有的 tlb 条目。
y显示全局 cpu 寄存器 [SPARC-64 架构特有]
z导出 ftrace 缓存信息
0-9设置控制台日志级别,该级别控制什么样的内核信息将被打印到你的 控制台。(比如 0 ,将使得只有紧急信息,像 PANICs or OOPSes 才能到你的控制台。)

4 查看SysRq的输出信息

sysrq信息默认会通过syslog输出到/var/log/messages。 若设置的 console_loglevel(0-9) 大于 default_message_loglevel 则也会输出到本地控制台终端上去。

syslog中记录的日志应该是最完整的,然而由于负责记录日志的 syslogd 本身是一个用户进程,在某些情况下可能会被杀掉,从而导致日志记录不下来。

5 sysrq输出举例

打印内存使用信息:

root@OpenWrt:/# echo  m > /proc/sysrq-trigger
[  106.957049] sysrq: Show Memory
[  106.960140] Mem-Info:
[  106.962411] active_anon:1570 inactive_anon:8 isolated_anon:0
[  106.962411]  active_file:1508 inactive_file:2258 isolated_file:0
[  106.962411]  unevictable:1869 dirty:0 writeback:0 unstable:0
[  106.962411]  slab_reclaimable:1420 slab_unreclaimable:9672
[  106.962411]  mapped:2524 shmem:10 pagetables:160 bounce:0
[  106.962411]  free:18210 free_pcp:159 free_cma:0
[  106.995149] Node 0 active_anon:6280kB inactive_anon:32kB active_file:6032kB inactive_file:9032kB unevictable:7476kB isolated(anon):0kB isolated(file):0kB mapped:10096kB dirty:0kB writeback:0kB shmem:40kB writeback_tmp:0kB unstable:0kB all_unreclaimable? no
[  107.017886] DMA32 free:72840kB min:1916kB low:9980kB high:18044kB active_anon:6280kB inactive_anon:32kB active_file:6032kB inactive_file:9032kB unevictable:7476kB writepending:0kB present:258368kB managed:230480kB mlocked:0kB kernel_stack:1792kB pagetables:640kB bounce:0kB free_pcp:636kB local_pcp:336kB free_cma:0kB
[  107.045877] lowmem_reserve[]: 0 0 0
[  107.049364] DMA32: 44*4kB (UME) 121*8kB (UME) 23*16kB (UME) 5*32kB (ME) 102*64kB (ME) 71*128kB (M) 31*256kB (ME) 5*512kB (M) 2*1024kB (ME) 1*2048kB (M) 10*4096kB (UM) = 72840kB
[  107.065204] 5645 total pagecache pages
[  107.068953] 0 pages in swap cache
[  107.072294] Swap cache stats: add 0, delete 0, find 0/0
[  107.077511] Free swap  = 0kB
[  107.080386] Total swap = 0kB
[  107.083296] 64592 pages RAM
[  107.086098] 0 pages HighMem/MovableOnly
[  107.089990] 6972 pages reserved

打印进程列表:

root@OpenWrt:/# echo  t > /proc/sysrq-trigger
[  151.443174] sysrq: Show State
[  151.446239]   task                        PC stack   pid father
[  151.452194] init            S    0     1      0 0x00000000
[  151.457678] Call trace:
[  151.460145]  __switch_to+0xc4/0x1e0
[  151.463623]  __schedule+0x26c/0x3c0
[  151.467106]  schedule+0x30/0xb0
[  151.470264]  do_wait+0x1c0/0x1e0
[  151.473486]  kernel_wait4+0x7c/0x170
[  151.477055]  __do_sys_wait4+0x80/0xf0
[  151.480713]  __arm64_sys_wait4+0x20/0x28
[  151.484628]  el0_svc_common.constprop.2+0x7c/0x110
[  151.489429]  el0_svc_handler+0x20/0x80
[  151.493201]  el0_svc+0x8/0x680
......
[  153.398655] msgd            S    0   948    942 0x00000000
[  153.404134] Call trace:
[  153.406591]  __switch_to+0xc4/0x1e0
[  153.410105]  __schedule+0x26c/0x3c0
[  153.413619]  schedule+0x30/0xb0
[  153.416790]  schedule_hrtimeout_range_clock+0x84/0xe8
[  153.421862]  schedule_hrtimeout_range+0x10/0x18
[  153.426387]  ep_poll+0x3c8/0x460
[  153.429607]  do_epoll_wait+0xd0/0x118
[  153.433261]  __arm64_sys_epoll_pwait+0x54/0xc0
[  153.437729]  el0_svc_common.constprop.2+0x7c/0x110
[  153.442545]  el0_svc_handler+0x20/0x80
[  153.446319]  el0_svc+0x8/0x680
[  153.449387] netctrl         S    0   950    942 0x00000000
[  153.454866] Call trace:
[  153.457307]  __switch_to+0xc4/0x1e0
[  153.460808]  __schedule+0x26c/0x3c0
[  153.464309]  schedule+0x30/0xb0
[  153.467475]  schedule_hrtimeout_range_clock+0x84/0xe8
[  153.472540]  schedule_hrtimeout_range+0x10/0x18
[  153.477064]  ep_poll+0x3c8/0x460
[  153.480305]  do_epoll_wait+0xd0/0x118
[  153.483982]  __arm64_sys_epoll_pwait+0x54/0xc0
[  153.488450]  el0_svc_common.constprop.2+0x7c/0x110
[  153.493260]  el0_svc_handler+0x20/0x80
[  153.497038]  el0_svc+0x8/0x680
[  153.500088] wserver         S    0  1631    942 0x00000000
[  153.505564] Call trace:
[  153.508035]  __switch_to+0xc4/0x1e0
[  153.511512]  __schedule+0x26c/0x3c0
[  153.514999]  schedule+0x30/0xb0
[  153.518171]  schedule_hrtimeout_range_clock+0x84/0xe8
[  153.523243]  schedule_hrtimeout_range+0x10/0x18
[  153.527767]  ep_poll+0x3c8/0x460
[  153.530987]  do_epoll_wait+0xd0/0x118
[  153.534641]  __arm64_sys_epoll_pwait+0x54/0xc0
[  153.539099]  el0_svc_common.constprop.2+0x7c/0x110
[  153.543901]  el0_svc_handler+0x20/0x80
[  153.547664]  el0_svc+0x8/0x680
......
[  155.796019] dhcp6s          S    0  2751      1 0x00000000
[  155.801545] Call trace:
[  155.803988]  __switch_to+0xc4/0x1e0
[  155.807464]  __schedule+0x26c/0x3c0
[  155.810945]  schedule+0x30/0xb0
[  155.814079]  schedule_hrtimeout_range_clock+0xe0/0xe8
[  155.819166]  schedule_hrtimeout_range+0x10/0x18
[  155.823738]  do_select+0x3e4/0x600
[  155.827136]  core_sys_select+0x258/0x508
[  155.831051]  __arm64_sys_pselect6+0x168/0x1f8
[  155.835423]  el0_svc_common.constprop.2+0x7c/0x110
[  155.840233]  el0_svc_handler+0x20/0x80
[  155.844003]  el0_svc+0x8/0x680
[  155.888583] Showing busy workqueues and worker pools:
[  155.893661] workqueue events: flags=0x0
[  155.897510]   pwq 0: cpus=0 node=0 flags=0x0 nice=0 active=3/256 refcnt=4
[  155.904286]     in-flight: 660:hnat_roam_handler
[  155.908894]     pending: km_switch_stats_fn, vmstat_shepherd
[  155.914601] pool 0: cpus=0 node=0 flags=0x0 nice=0 hung=4s workers=5 idle: 21 638 5 703

显示所有活动 cpu 的栈回溯:

root@OpenWrt:/# echo  l > /proc/sysrq-trigger
[ 3602.003162] sysrq: SysRq : Show backtrace of all active CPUs
[ 3602.003919] Call trace:
[ 3602.004675] [<ffffff8008088544>] show_stack+0x24/0x30
[ 3602.005233] [<ffffff80085bbdac>] showacpu+0x68/0x84
[ 3602.005688] [<ffffff8008134b68>] flush_smp_call_function_queue+0x84/0x134
[ 3602.006303] [<ffffff8008135584>] generic_smp_call_function_single_interrupt+0x18/0x20
[ 3602.007007] [<ffffff800808cba4>] handle_IPI+0x19c/0x260
[ 3602.007490] [<ffffff8008080eec>] gic_handle_irq+0x12c/0x184
[ 3602.007995] Exception stack(0xffffffc0f2f1fd90 to 0xffffffc0f2f1fec0)
[ 3602.008580] fd80:                                   0000000000000000 0000000000000003
[ 3602.009284] fda0: 00000040ee976000 0000000000000020 00ffffffffffffff 0000001425865f85
[ 3602.009988] fdc0: 000000000004b382 0000000000000003 00000032b5593519 ffffff8008081800
[ 3602.010691] fde0: 0000000000001000 0000000000000000 0000000034d5d91d 00000040ee976000
[ 3602.011394] fe00: ffffffc0f2f0a880 0000000000000000 0000000000000000 0000000000000000
[ 3602.012098] fe20: 0000000030d00800 00000346a09ab464 0000000000000002 ffffffc00a4bac00
[ 3602.012801] fe40: ffffff80097ace18 0000000000000001 0000034697fd8ddd ffffff800974e488
[ 3602.013504] fe60: 0000000001ab4000 00000000010f8244 0000000000000000 ffffffc0f2f1fec0
[ 3602.014209] fe80: ffffff8008b9eb10 ffffffc0f2f1fec0 ffffff8008b9eb14 0000000060000145
[ 3602.014912] fea0: ffffffc0f2f1fec0 ffffff8008b9eb10 ffffffffffffffff 0000000000000002
[ 3602.015615] [<ffffff80080827b4>] el1_irq+0xb4/0x140
[ 3602.016070] [<ffffff8008b9eb14>] cpuidle_enter_state+0x1cc/0x25c
[ 3602.016624] [<ffffff8008b9ec18>] cpuidle_enter+0x34/0x44
[ 3602.017112] [<ffffff80081004e4>] call_cpuidle+0x6c/0x74
[ 3602.017598] [<ffffff8008100798>] cpu_startup_entry+0x2ac/0x2bc
[ 3602.018128] [<ffffff800808c5b0>] secondary_start_kernel+0x190/0x1bc
[ 3602.018700] [<00000000010f8188>] 0x10f8188
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值