admin管理员组文章数量:1588274
文章目录
- 1、开启SysRq
- 2、使用SysRq
- 2.1 组合键按键方式
- 2.2 写/proc/sysrq-trigger方式
- 4 查看SysRq的输出信息
- 5 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。 |
g | kgdb 使用(内核调试器)。 |
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
版权声明:本文标题:内核sysrq魔术键 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728024381a1142542.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论