Linux Magic System Request Key Hacks
Table of contents
Source: https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html
Giới thiệu
Trong quá trình vận hành, bạn đã bao giờ gặp tình trạng hệ thống Linux của mình bị “treo” hoặc không phản hồi? Khi đó, hãy sử dụng Magic System Request Key (SysRq) để được cứu rỗi. Vậy nó là gì và có thể làm gì?
SysRq là một tính năng của Linux, cho phép người dùng gửi “tín hiệu cầu cứu” trực tiếp đến kernel của hệ điều hành.
Cấu hình SysRq
Để cấu hình SysRq, bạn có thể sử dụng command sau:
echo "number" >/proc/sys/kernel/sysrq
Giá trị của “number” có thể nằm trong các trường hợp sau:
0 - disable sysrq completely
1 - enable all functions of sysrq
>1 – bitmask to allow specific sysrq functions
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
Kiểm tra giá trị hiện tại của sysrq:
root@vm1:/home/kien# cat /proc/sys/kernel/sysrq
176
# 176 không match với giá trị nào, well, thực ra 176 ở đây là 16+32+128 = 176
#
# 16 = 0x10 - enable sync command
# 32 = 0x20 - enable remount read-only
# 128 = 0x80 - allow reboot/poweroff
# Để test, bật hết lên cho đơn giản
root@vm1:/home/kien# root@vm1:/home/kien# echo 1 > /proc/sys/kernel/sysrq
Cách sử dụng
Bạn có thể sử dụng tính năng bằng cách ấn tổ hợp phím (tùy thuộc hệ điều hành, đối với x86 là ALT-SysRq-<command key>
, bàn phím của bạn thường sẽ có SysRq keyboard, để ý nhé) hoặc echo ký tự commands vào /proc/sysrq-trigger
.
echo <command key> > /proc/sysrq-trigger
Danh sách command key (ấn để show all)
Command | Function |
---|---|
| Will immediately reboot the system without syncing or unmounting your disks. |
| Will perform a system crash and a crashdump will be taken if configured. |
| Shows all locks that are held. |
| Send a SIGTERM to all processes, except for init. |
| Will call the oom killer to kill a memory hog process, but do not panic if nothing can be killed. |
| Used by kgdb (kernel debugger) |
| Will display help (actually any other key than those listed
here will display help. but |
| Send a SIGKILL to all processes, except for init. |
| Forcibly “Just thaw it” - filesystems frozen by the FIFREEZE ioctl. |
| Secure Access Key (SAK) Kills all programs on the current virtual console. NOTE: See important comments below in SAK section. |
| Shows a stack backtrace for all active CPUs. |
| Will dump current memory info to your console. |
| Used to make RT tasks nice-able |
| Will shut your system off (if configured and supported). |
| Will dump the current registers and flags to your console. |
| Will dump per CPU lists of all armed hrtimers (but NOT regular timer_list timers) and detailed information about all clockevent devices. |
| Turns off keyboard raw mode and sets it to XLATE. |
| Will attempt to sync all mounted filesystems. |
| Will dump a list of current tasks and their information to your console. |
| Will attempt to remount all mounted filesystems read-only. |
| Forcefully restores framebuffer console |
| Causes ETM buffer dump [ARM-specific] |
| Dumps tasks that are in uninterruptible (blocked) state. |
| Used by xmon interface on ppc/powerpc platforms. Show global PMU Registers on sparc64. Dump all TLB entries on MIPS. |
| Show global CPU Registers [SPARC-64 specific] |
| Dump the ftrace buffer |
| Sets the console log level, controlling which kernel messages
will be printed to your console. ( |
| Replay the kernel log messages on consoles. |
Một số command keys hữu ích
Để dễ hình dung, ví dụ dưới đây sẽ sử dụng phương án echo ký tự vào /proc/sysrq-trigger
Poweroff
root@vm1:/home/kien# echo o > /proc/sysrq-trigger
Reboot
root@vm1:/home/kien# echo b > /proc/sysrq-trigger
Crash
Trigger crashdump thủ công nếu hệ thống bị treo. Đây cũng là một cách hay để giả lập kernel crashdump.
root@vm1:/home/kien# echo c > /proc/sysrq-trigger
Đồng bộ filesystems
root@vm1:/home/kien# echo s > /proc/sysrq-trigger
Remount filesystem read-only
root@vm1:/home/kien# echo u > /proc/sysrq-trigger
root@vm1:/home/kien# touch abc
touch: cannot touch 'abc': Read-only file system
Kill tất cả processes trừ tiến trình init
Command key này đặc biệt hữu ích nếu bạn có tiến trình không thể kill, đặc biệt nếu tiến trình đó liên tục spawning ra các tiến trình khác.
# Linux gửi SIGTERM đến tất cả các processes, trừ init
root@vm1:/home/kien# echo e > /proc/sysrq-trigger
# Linux gửi SIGKILL đến tất cả các processes, trừ init
root@vm1:/home/kien# echo i > /proc/sysrq-trigger
Gọi OOM Killer
OOM Killer được gọi và hoàn thành nhiệm vụ của nó - kill tiến trình gây high memory usage.
root@vm1:/home/kien# echo f > /proc/sysrq-trigger
# Check kern.log để kiểm tra log
3585:Dec 5 03:31:40 vm1 kernel: [ 195.899186] sysrq: Manual OOM execution
3586:Dec 5 03:31:40 vm1 kernel: [ 195.901176] kworker/0:1 invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=-1, oom_score_adj=0
Xem danh sách blocked state processes
root@vm1:/home/kien# echo w > /proc/sysrq-trigger
# Check kern.log để kiểm tra
Dec 5 03:33:02 vm1 kernel: [ 277.781446] sysrq: Show Blocked State