do{학습}while

Kernel) QEMU와 Buildroot로 ftrace 실습 환경 만들기 본문

Linux/Kernel

Kernel) QEMU와 Buildroot로 ftrace 실습 환경 만들기

하이오야이 2025. 5. 24. 19:34

 

QEMU와 Buildroot로 ftrace 실습 환경 만들기

이번 글에서는 QEMU와 Buildroot를 이용해 ftrace를 실습할 수 있는 환경을 구축하는 방법을 정리한다. ftrace는 Linux 커널 내부의 동작을 추적할 수 있는 매우 강력한 도구이며, 별도의 추가 설치 없이 커널만 잘 구성해도 바로 사용할 수 있다. 이 실습은 x86_64 환경을 기준으로 진행된다.

1. ftrace란?

ftrace는 Linux 커널에 내장된 트레이싱 프레임워크로, 다음과 같은 작업에 사용된다:

  • 함수 호출 추적
  • 스케줄링 전환 추적
  • 인터럽트 오프/온 상태 추적
  • IRQ 지연 분석 등

ftrace는 /sys/kernel/debug/tracing 디렉토리를 통해 접근할 수 있으며, debugfs 파일 시스템이 마운트되어 있어야 한다.


2. 준비물


3. Buildroot 설정 및 커널 빌드

3-1. Buildroot 다운로드 및 기본 설정

git clone https://github.com/buildroot/buildroot.git
cd buildroot
make qemu_x86_64_defconfig

3-2. menuconfig 설정

make menuconfig

아래 항목을 확인하거나 수정한다:

  • System configuration → Custom post-build script:
  • board/qemu/x86_64/post-build.sh

기타 항목은 기본값을 사용해도 무방하다.


4. post-build.sh 작성

board/qemu/x86_64/post-build.sh 파일을 아래와 같이 생성한다:

#!/bin/sh

set -u
set -e

# tty1 콘솔 추가 (QEMU 그래픽 창 사용 시)
if [ -e ${TARGET_DIR}/etc/inittab ]; then
    grep -qE '^tty1::' ${TARGET_DIR}/etc/inittab || \
        sed -i '/GENERIC_SERIAL/a\
tty1::respawn:/sbin/getty -L  tty1 0 vt100 # QEMU graphical window' ${TARGET_DIR}/etc/inittab
fi

# rcS 초기화 스크립트 추가
mkdir -p ${TARGET_DIR}/etc/init.d
cat <<EOF > ${TARGET_DIR}/etc/init.d/rcS
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
echo "Init done"
EOF
chmod +x ${TARGET_DIR}/etc/init.d/rcS

이 스크립트는 파일 시스템 이미지가 생성되기 직전에 실행되며, ftrace 사용을 위한 debugfs 마운트를 자동으로 처리해준다.


5. 이미지 빌드

병렬 빌드를 위해 현재 시스템의 코어 수를 확인한다:

nproc

출력값이 14라면:

make -j14

또는 자동화 형태로:

make -j$(nproc)

6. QEMU로 부팅

qemu-system-x86_64 \
  -kernel output/images/bzImage \
  -hda output/images/rootfs.ext4 \
  -append "root=/dev/sda console=ttyS0" \
  -nographic

부팅이 완료되면 로그인 없이 바로 쉘로 진입할 수 있다.


7. ftrace 기본 사용법

부팅 후 다음 명령어로 debugfs 마운트 상태를 확인한다:

mount | grep debugfs

정상적으로 마운트되어 있다면 다음 경로로 진입 가능:

cd /sys/kernel/debug/tracing

기본 사용 예시는 다음과 같다:

echo function > current_tracer
echo > trace
echo 1 > tracing_on
ls /
echo 0 > tracing_on
cat trace

마무리

이 환경을 활용하면 커널 함수 호출, 스케줄링 전환, IRQ 상태 등 다양한 커널 내부 동작을 실시간으로 추적할 수 있다. 향후에는 다음과 같은 실습을 이어나갈 수 있다:

  • 특정 함수만 추적하기 (set_ftrace_filter)
  • function_graph를 통한 콜스택 시각화
  • sched_switch를 이용한 스케줄러 분석