- VM: VMWare
- OS: Ubuntu-64bit 22.04.2
- Kernel: 5.19.0-42-generic
sudo su echo -h > /proc/sysrq-trigger dmesg
- kernel의 정보를 나타나게 하는 콤보 키
- kernel이 어떤 동작을 하던중이라도 사용자의 요청에 Blocking 없이 특별한 명령을 처리하는 기능을 제공
- sysRq 명령이 실행되면 kernel은 해당 정보를 kernel ring buffer에 넣고 system console에 나타나게 함
- 일반적인 경우에 이 정보들은 syslog를 통해
/var/log/messages에 출력됨/var/log/dmesg.(x) 로 출력됨
- 만약 system의 root계정인 경우 /proc/sysrq-trigger파일을 이용하여 sysrq를 실행할수 있다.
sysrq-trigger 에 h 콤보키 사용
- h 콤보키를 이용해 help message 출력
1. dmesg란?
- 시스템 부팅 메세지를 확인하는 명령어
- 또한 커널에서 출력되는 메세지를 일정 수준 기록하는 버퍼 역할을 수행
- 커널 부팅 중에 에러가 났다면 어느 단계에서 에러가 났는지 범위를 좁히고 찾아내는데 사용 가능
- dmesg -c
-> 모든 메세지를 삭제하며 입력 이후에 새롭게 로그 쌓음
-Help 메시지를 어떻게 가져오는지 확인할 방법을 못찾겠어서 sysrq 관련 자료 탐색 중, sysrq.c에 정의 되어 있다는 것을 알게 되었다
sysrq.c
void __handle_sysrq(int key, bool check_mask)
{
const struct sysrq_key_op *op_p;
int orig_log_level;
int orig_suppress_printk;
int i;
orig_suppress_printk = suppress_printk;
suppress_printk = 0;
rcu_sysrq_start();
rcu_read_lock();
/*
* Raise the apparent loglevel to maximum so that the sysrq header
* is shown to provide the user with positive feedback. We do not
* simply emit this at KERN_EMERG as that would change message
* routing in the consumers of /proc/kmsg.
*/
orig_log_level = console_loglevel;
console_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
op_p = __sysrq_get_key_op(key);
if (op_p) {
/*
* Should we check for enabled operations (/proc/sysrq-trigger
* should not) and is the invoked operation enabled?
*/
if (!check_mask || sysrq_on_mask(op_p->enable_mask)) {
pr_info("%s\n", op_p->action_msg);
console_loglevel = orig_log_level;
op_p->handler(key);
} else {
pr_info("This sysrq operation is disabled.\n");
console_loglevel = orig_log_level;
}
} else {
pr_info("HELP : ");
/* Only print the help msg once per handler */
for (i = 0; i < ARRAY_SIZE(sysrq_key_table); i++) {
if (sysrq_key_table[i]) {
int j;
for (j = 0; sysrq_key_table[i] !=
sysrq_key_table[j]; j++)
;
if (j != i)
continue;
pr_cont("%s ", sysrq_key_table[i]->help_msg);
}
}
pr_cont("\n");
console_loglevel = orig_log_level;
}
rcu_read_unlock();
rcu_sysrq_end();
suppress_printk = orig_suppress_printk;
}
#!/bin/sh
echo 0 > /sys/kernel/debug/tracing/tracing_on
echo "ftrace off"
sleep 3
cp /sys/kernel/debug/tracing/trace .
mv trace ftrace_log.c
#!/bin/bash
#!/bin/bash
echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"
echo 8096 > /sys/kernel/debug/tracing/buffer_size_kb
sleep 1
echo nop > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_stat_runtime/enable
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"
#!/bin/bash
echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"
echo 0 > /sys/kernel/debug/tracing/events/enable
sleep 1
echo "events disabled"
echo do_init_module > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter init"
echo function > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo "function tracer enabled"
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
echo 1 > /sys/kernel/debug/tracing/events/printk/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
sleep 1
echo "event enabled"
echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
echo 1 > /sys/kernel/debug/tracing/options/stacktrace
echo 1 > /sys/kernel/debug/tracing/options/sym-offset
echo "function stack trace enabled"
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"
<idle>-0 [001] d.h.. 8119.208237: irq_handler_entry: irq=52 name=ens160-tx-0
nop_trace.sh-2779 [000] d.h.. 8119.208256: irq_handler_entry: irq=10 name=arch_timer
<idle>-0 [001] d.h.. 8119.208289: irq_handler_exit: irq=52 ret=handled
nop_trace.sh-2779 [000] dNh.. 8119.208330: sched_wakeup: comm=in:imklog pid=874 prio=120 target_cpu=000
<idle>-0 [001] d.H.. 8119.208357: irq_handler_entry: irq=52 name=ens160-tx-0
<idle>-0 [001] d.H.. 8119.208363: irq_handler_exit: irq=52 ret=handled
nop_trace.sh-2779 [000] dNh.. 8119.208544: sched_stat_runtime: comm=nop_trace.sh pid=2779 runtime=773208 [ns] vruntime=170545331 [ns]
nop_trace.sh-2779 [000] dNh.. 8119.208554: irq_handler_exit: irq=10 ret=handled