리눅스데브코스 [7주차 - 5(7)]<운영체제 개념과 리눅스 커널 실습(1)>

심우열·2023년 5월 19일
0

실습 환경

  • VM: VMWare
  • OS: Ubuntu-64bit 22.04.2
  • Kernel: 5.19.0-42-generic

1. echo

1. 실행해보기

sudo su
echo -h > /proc/sysrq-trigger
dmesg

2. sysrq 란?

sysrq?_1
sysrq?_2

  • kernel의 정보를 나타나게 하는 콤보 키
  • kernel이 어떤 동작을 하던중이라도 사용자의 요청에 Blocking 없이 특별한 명령을 처리하는 기능을 제공
  • sysRq 명령이 실행되면 kernel은 해당 정보를 kernel ring buffer에 넣고 system console에 나타나게 함
  • 일반적인 경우에 이 정보들은 syslog를 통해 /var/log/messages에 출력됨 /var/log/dmesg.(x) 로 출력됨

1. sysrq-trigger 란?

  • 만약 system의 root계정인 경우 /proc/sysrq-trigger파일을 이용하여 sysrq를 실행할수 있다.

2. sysrq와 함께 사용하는 콤보 키

3. echo -h > /proc/sysrq-trigger ?

sysrq-trigger 에 h 콤보키 사용

  • h 콤보키를 이용해 help message 출력

4. 그럼 help message는 어디서 어떻게?

1. dmesg란?

dmesg란?

  • 시스템 부팅 메세지를 확인하는 명령어
  • 또한 커널에서 출력되는 메세지를 일정 수준 기록하는 버퍼 역할을 수행
  • 커널 부팅 중에 에러가 났다면 어느 단계에서 에러가 났는지 범위를 좁히고 찾아내는데 사용 가능
  • dmesg -c
    -> 모든 메세지를 삭제하며 입력 이후에 새롭게 로그 쌓음

5. sysrq.c

-Help 메시지를 어떻게 가져오는지 확인할 방법을 못찾겠어서 sysrq 관련 자료 탐색 중, sysrq.c에 정의 되어 있다는 것을 알게 되었다
sysrq.c

6. Help 메시지 출력 부분 함수

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;
}

2. ftrace

1. get_ftrace.sh

#!/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

2. nop_tracer

1. nop_tracer.sh

#!/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"

3. function_tracer

1. function_tracer.sh

#!/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"

4. 인터럽트 컨텍스트

          <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

5. sched_stat_runtime ftrace

profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글