임베디드를 좋아하는 조금 특이한 개발자?

[Linux Debugging] Buildroot를 통해 디버깅할 리눅스 빌드 본문

Embedded/Linux

[Linux Debugging] Buildroot를 통해 디버깅할 리눅스 빌드

Gordon_ 2025. 8. 3. 08:58

- 개발 환경

WSL2 (Ubuntu 24.04 LTS)

buildroot(2024.02)


1. 서론

  리눅스 커널을 공부하면서 어떻게 하면 일반적인 어플리케이션을 디버깅 할 때 처럼 직관적이고 커널의 코드흐름을 확인 할 수 있는 방법을 고안하다 Qemu 에뮬레이터를 통해 리눅스를 실행하고 디버딩을 해보려는 시도를 하고 있습니다. 이로써 좀더 리눅스 커널을 공부하는데 많은 도움이 될 것입니다. 

  처음으로 가장 중요한 디버깅할 리눅스를 빌드하는 것입니다. 가장 중요한 포인트는 Qemu에 실행가능한 리눅스 기반 운영체제를 빌드 하는 것이고, 2번때로 중요한 포인트는 필요없는 라이브러리가 없이 최대한 리눅스 커널에 가까운 운영체제를 빌드하는 것입니다. 여기에 모두 부합하는 것이 Buildroot를 사용하는 것입니다. Buildroot의 목적이 저사양의 임베디드 시스템에서 동작하는 운영체제를 빌드하는 것이기에 Buildroot로 하기로 하였으며 더 나아가 Qemu에서 실행할 수 있도록 관련 설정이 포함되어 있습니다.

  이번 포스트에서 Buildroot를 통해 Qemu에서 동작하는 리눅스 운영체제를 빌드하고 실행까지 하는 것이 목표입니다.

2. Buildroot 준비

먼저 Buildroot를 사용하기 위한 필요 패키지를 설치합니다.

sudo apt install sed make binutils build-essential diffutils     \
		    bash patch gzip bzip2 perl tar cpio unzip    \	
                    rsync file bc findutils libncurses5-dev      \
                    libncursesw5-dev bzr curl cvs git mercurial  \
                    openssh-server subversion

 

그 다음 2024.02 버전의 Buildroot를 git으로 부터 다운받도록 합니다.

 

git clone -b 2024.02 https://github.com/buildroot/buildroot.git

 

3. Buildroot 설정

  이제 빌드할 리눅스가 어떠한 환경에서 동작할지를 설정해야합니다. 여기서 저는 Qemu에서 동작하며 CPU 아키텍쳐가 AArch64인 환경에서 동작하도록 설정하였습니다.

 

# Buildroot 폴더로 이동
cd buildroot

# qemu에서 동작할 타겟 보드 설정
make qemu_aarch64_virt_defconfig

 

   다음으로 Buildroot에 대한 추가적인 설정이 필요합니다. 바로 디버깅에 필요한 GDB를 같이 설치하는 옵션을 설정할 것입니다.

# buildroot의 설정 메뉴 열기
make menuconfig

 

Toolchain

  |-- Build cross gdb for the host

  |-- TUI support

 

위 두개의 설정을 선택한 후 저장하시면 Buildroot에 대한 설정은 완료입니다.

 

Build cross gdb for the host 옵션은 host 환경에 target 환경에서 동작하는 프로램을 디버깅하기 위한 GDB를 설치하는 옵션입니다.

Toolchain -> TUI support 옵션은 GDB 내 Layout 명령어를 사용해 디버깅하기 좋은 Layout를 제공합니다.

 

4. GDB로 디버깅할 수 있도록 리눅스 커널 설정

  이제 리눅스 커널에 대한 설정이 필요합니다. GDB는 프로그램 내 디버깅 심볼을 기준으로 디버깅을 하고 있습니다. 그러므로 Linux 커널에 디버깅 심볼이 포함하도록 설정을 해주어야 합니다.

 

참고)

해당 명령어는 꽤나 시간이 오래 걸립니다.(저의 경우 20~30분 정도 걸렸습니다.)

# 리눅스에 대한 설정
make linux-menuconfig

 

Kernel hacking

  |-- Kernel debugging

 

Kernel hacking

  |-- Compile-time checks and compiler options

        |-- Debug information : Generate DWARF Version 4 debufinfo 

        |-- Compile the kernel with frame pointers

 

Kernel hacking

  |-- Generic Kernel Debugging Instruments

        |-- Magic SysRq Key

        |-- KGDB: kernel debugger

 

Kernel hacking

  |-- Generic Kernel Debugging Instruments

        |-- KGDB: kernel debugger

              |-- KGDB: use kgdb over the serial console

 

5. 리눅스 운영체제 빌드

 이제 실행 가능하 리눅스 운영체제를 빌드하겠습니다.

 

참고)

해당 명령어는 꽤나 시간이 오래 걸립니다.(저의 경우 1시간 정도 걸렸습니다.)

make

 

 

6. Qemu를 통한 운영체제 실행

아래 명령어는  buildroot/board/qemu/aarch64-virt/readme.txt 에 적혀 있습니다.

qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -smp 1 -kernel output/images/Image -append "rootwait root=/dev/vda console=ttyAMA0" -netdev user,id=eth0 -device virtio-net-device,netdev=eth0 -drive file=output/images/rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0

 

위 사진 처럼 정상적으로 동작하는 것을 확인 할 수 있습니다.

기본 적인 ID는 root이며 비밀번호는 없습니다.

 

Qemu 종료 하는 방법은 Ctrl + A를 먼저 누르고 X를 누르면 종료됩니다.(X를 누를 때는 컨트롤 키를 떼야합니다.)