Linux Magic System Request Key Hacks

⇢ 

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.

sysrq - from trufflesecurity.com

sysrq - from trufflesecurity.com

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

b

Will immediately reboot the system without syncing or unmounting your disks.

c

Will perform a system crash and a crashdump will be taken if configured.

d

Shows all locks that are held.

e

Send a SIGTERM to all processes, except for init.

f

Will call the oom killer to kill a memory hog process, but do not panic if nothing can be killed.

g

Used by kgdb (kernel debugger)

h

Will display help (actually any other key than those listed here will display help. but h is easy to remember :-)

i

Send a SIGKILL to all processes, except for init.

j

Forcibly “Just thaw it” - filesystems frozen by the FIFREEZE ioctl.

k

Secure Access Key (SAK) Kills all programs on the current virtual console. NOTE: See important comments below in SAK section.

l

Shows a stack backtrace for all active CPUs.

m

Will dump current memory info to your console.

n

Used to make RT tasks nice-able

o

Will shut your system off (if configured and supported).

p

Will dump the current registers and flags to your console.

q

Will dump per CPU lists of all armed hrtimers (but NOT regular timer_list timers) and detailed information about all clockevent devices.

r

Turns off keyboard raw mode and sets it to XLATE.

s

Will attempt to sync all mounted filesystems.

t

Will dump a list of current tasks and their information to your console.

u

Will attempt to remount all mounted filesystems read-only.

v

Forcefully restores framebuffer console

v

Causes ETM buffer dump [ARM-specific]

w

Dumps tasks that are in uninterruptible (blocked) state.

x

Used by xmon interface on ppc/powerpc platforms. Show global PMU Registers on sparc64. Dump all TLB entries on MIPS.

y

Show global CPU Registers [SPARC-64 specific]

z

Dump the ftrace buffer

0-9

Sets the console log level, controlling which kernel messages will be printed to your console. (0, for example would make it so that only emergency messages like PANICs or OOPSes would make it to your console.)

R

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