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

심우열·2023년 5월 22일
0

1. 기본 유저 래밸 프로세스 실행 실습 및 ftrace 로그 분석

1. 실습에 사용할 코드

1. raspbian_test.c

#include <stdio.h>
#include <unistd.h>

#define PROC_TIMES 500
#define SLEEP_DURATION 3  // second unit

int main() 
{
	int proc_times = 0;

	for(proc_times = 0; proc_times < PROC_TIMES; proc_times++) {
		printf("raspbian tracing \n");
		sleep(SLEEP_DURATION);
	}

	return 0;	
}

2. clone_process_debug.sh(ftrace 설정)

#!/bin/bash

echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off" 

echo 0 > /sys/kernel/debug/tracing/events/enable
echo 8096 > /sys/kernel/debug/tracing/buffer_size_kb
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/sched/sched_switch/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable

echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_fork/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_exit/enable

echo 1 > /sys/kernel/debug/tracing/events/signal/enable

echo  do_exit copy_process > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "event enabled"

sleep 1
echo "set_ftrace_filter enabled"

echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
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"

3. get_ftrace.sh(ftrace 출력)

#!/bin/bash

echo 0 > /sys/kernel/debug/tracing/tracing_on
echo "ftrace off"

sleep 3

cp /sys/kernel/debug/tracing/trace . 
mv trace ftrace_log1.c

2. 실습 방법

1. clone_process_debug.sh 실행

#ftrace 실습은 su 권한에서 실행 추천
sudo su
#clone_process_debug.sh 실행권한 추가
chmod 777 clone_process_debug.sh
#clone_process_debug.sh 실행
./clone_process_debug.sh

2. raspbian_test.c 컴파일

Makefile

raspbian_proc: raspbian_test.c
	gcc -o raspbian_proc raspbian_test.c

3. raspbian_proc 실행

#raspbian_proc 실행 권한 추가
chmod 777 raspbian_proc
#raspbian_proc 실행
./raspbian_proc

4. 새로운 터미널 탭 열고 프로세스 목록에서 raspbain_proc 확인

ps -ely
  • PID: 2327
  • PPID(부모 프로세스 PID): 2192(bash)

5. raspbian_proc 프로세스 강제 종료

sudo kill -9 2327

6. ftrace 로그 추출

#get_ftrace.sh 실행 권한 추가
chmod 777 get_ftrece.sh
# su 권한 계정 진입
sudo su
#ftrace 로그 추출
./get_ftrace.sh

3. ftrace 로그 분석

1. 프로세스 생성

  • PID 2192 인 bash 쉘에서, PID 2327인 raspbain_proc 자식 프로세스를 fork()

2. 프로세스 종료

1. kill 프로세스

  1. kill 명령어는 su 권한이 필요하기 때문에 sudo 를 처리하기 위한 PID 2329 프로세스 생성
  2. 이후 PID 2330 의 kill 프로세스 생성
  3. kill 프로세스가 signal_generate 를 통해 9번 시그널 생성해 raspbian_proc 프로세스에게 전달

2. raspbian_proc 프로세스

  1. signal_deliver를 통해 9번 시그널을 전달받은 raspbian_proc는 do_exit()
  2. raspbian_proc는 signal_generate를 통해 17번 시그널을 생성
  3. 부모 프로세서인 PID 2192인 bash에 17번 시그널 전달

3. bash 프로세스

  1. 부모 프로세스인 bash는 signal_deliver를 통해 PID 2327인 raspbian_proc로 부터 17번 시그널 전달 받음

4. 이후

  1. kill 프로세스가 sudo 프로세스에게 종료 신호 보냄
  2. kill 프로세스의 종료 신호를 받은 sudo 프로세스도 종료
  3. sudo 프로세스의 부모 프로세스 PID 2254 bash 에게 종료 시그널 17 전달

2. exit() 함수로 프로세스가 종료되는 과정 및 ftrace 로그 분석

1. 실습에 사용할 코드

1. rpi_process_exit.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define PROC_TIMES 3
#define SLEEP_DURATION 3  // second unit

int main() 
{
	int proc_times = 0;
	
	for(proc_times = 0; proc_times < PROC_TIMES; proc_times++) {
			printf("rpi tracing \n");
			sleep(SLEEP_DURATION);
	}
	
	exit(EXIT_SUCCESS);
		
	return 0;	
}

2. process_exit.sh(ftrace 설정)

#!/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 do_exit  copy_process > /sys/kernel/debug/tracing/set_ftrace_filter

sleep 1
echo "set_ftrace_filter enabled"

echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_exit/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_fork/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_free/enable
sleep 1
echo "event enabled"

echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
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"

3. get_ftrace.sh(ftrace 출력)

#!/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. 실습 방법

1. process_exit.sh 실행

#ftrace 실습은 su 권한에서 실행 추천
sudo su
#clone_process_debug.sh 실행권한 추가
chmod 777 process_exit.sh
#clone_process_debug.sh 실행
./process_exit.sh

2. rpi_process_exit.c 컴파일

Makefile

rpi_proc_exit:rpi_process_exit.c
	gcc -o rpi_proc_exit rpi_process_exit.c

3. rpi_proc_exit 실행

#rpi_proc_exit 실행 권한 추가
chmod 777 rpi_proc_exit
#rpi_proc_exit 실행
./rpi_proc_exit

  • 9초 후 프로세스가 자동으로 종료됨

5. ftrace 로그 추출

#get_ftrace.sh 실행 권한 추가
chmod 777 get_ftrece.sh
# su 권한 계정 진입
sudo su
#ftrace 로그 추출
./get_ftrace.sh

3. ftrace 로그 분석

1. 프로세스 생성

2. 프로세스 종료

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

0개의 댓글