Embedded System/Embedded Linux Build System Yocto

범용 임베디드 SoC Yocto 커스텀 이미지 빌드 가이드: local.conf, bblayers.conf 및 커널 설정

임베디드 친구 2025. 5. 14. 21:29
반응형

1. Yocto Project 기반 임베디드 SoC 리눅스 이미지 커스터마이징 개요

임베디드 리눅스 시스템 개발 환경에서 Yocto Project(Poky)는 타겟 하드웨어에 최적화된 맞춤형 OS 이미지를 생성하는 표준 도구입니다. 본 문서에서는 범용 프로세서(Generic SoC) 기반 보드를 타겟으로 하드웨어 타겟 BSP 레이어를 연동하고, local.confbblayers.conf 설정을 수정하여 커스텀 리눅스 이미지를 빌드하는 구체적인 절차를 설명합니다.

잘못 설정된 빌드 변수나 부적절한 이미지 플래싱 방식은 부트 실패를 유발합니다. 이 포스팅을 통해 범용 SoC 타겟의 U-Boot, Linux Kernel 설정 모듈 관리, BitBake 기반 패키지 제어 및 SD 카드 부팅용 wic 이미지 작성법을 습득할 수 있습니다.

2. 임베디드 SoC Yocto 빌드 핵심 설정 요약

  • 타겟 머신 정의: conf/local.confMACHINE = "generic-soc-board" 지정
  • 빌드 속도 최적화 및 디버그 오버헤드 방지: rm_work 상속 시 소스 분석에 제약이 생기므로 개발 단계에서는 주석 처리
  • 플래싱 이미지 포맷 지정: SD 카드/eMMC 직접 플래싱을 위해 IMAGE_FSTYPES = "wic wic.bmap" 사용 필수

3. 범용 SoC Yocto 레이어 구성 및 레시피 상세 분석

3.1 conf/local.conf 핵심 변수 설정 및 기술적 오해 수정

기존 설정의 INHERIT += "rm_work" 옵션은 빌드 직후 중간 작업 디렉터리(WORKDIR)를 삭제하므로, 소스 코드 분석 및 커널 디버깅 환경에서는 비활성화해야 합니다. 또한, 단순 ext4 파일 시스템은 파티션 테이블을 포함하지 않으므로 부트로더(U-Boot)와 패킹된 전체 펌웨어 이미지로 부팅하기 위해서는 wic 포맷을 사용해야 합니다.

 

conf/local.conf 파일의 필수 설정 항목을 아래와 같이 정정하여 반영합니다.

# Path: conf/local.conf

# Set target machine for Generic SoC
MACHINE ?= "generic-soc-board"

# Set parallel build options based on host CPU core count
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j8"

# Set image generation formats (wic for bootable SD card/eMMC image)
IMAGE_FSTYPES = "wic wic.bmap ext4.gz"

# Set root file system default size (in KB)
IMAGE_ROOTFS_SIZE = "81920"

# Note: Keep rm_work commented out during development phase to retain work directory
# INHERIT += "rm_work"
설정 변수 역할 및 권장 설정값 비고 및 주의사항


MACHINE
타겟 SoC/Board 지정 (generic-soc-board) 타겟 BSP 레이어의 conf/machine/ 내부 .conf 파일명과 일치해야 함


BB_NUMBER_THREADS
BitBake 태스크 병렬 실행 수 호스트 CPU 코어 수 수준으로 설정


PARALLEL_MAKE
개별 레시피 Compile 단계 병렬 수

-jN 형태로 지정


IMAGE_FSTYPES
최종 생성될 이미지 타입 (wic wic.bmap) MBR/GPT 및 U-Boot/Kernel/RootFS 파티션 통합을 위해 wic 필수

3.2 conf/bblayers.conf 내 BSP 레이어 의존성 설정

범용 임베디드 SoC 보드 동작을 위해서는 기본 Poky 레이어 외에도 meta-openembedded 및 하드웨어 전용 BSP 레이어가 반드시 포함되어야 합니다.

# Path: conf/bblayers.conf

BBLAYERS ?= " \
  ${TOPDIR}/../meta \
  ${TOPDIR}/../meta-poky \
  ${TOPDIR}/../meta-yocto-bsp \
  ${TOPDIR}/../meta-openembedded/meta-oe \
  ${TOPDIR}/../meta-openembedded/meta-python \
  ${TOPDIR}/../meta-soc \
"

3.3 IMAGE_INSTALL 변수를 활용한 패키지 인클루드/엑스클루드

이미지 레시피 또는 local.conf에서 이미지 패키지 리스트를 조작할 때 Yocto Scarthgap / Kirkstone 최신 구문을 준수해야 합니다.

# Path: conf/local.conf

# Append user-space utilities to the target image
IMAGE_INSTALL:append = " nano htop wget dropbear"

# Remove unnecessary packages from the target image
IMAGE_INSTALL:remove = "connman"

전체 제공 가능 패키지 및 레시피 목록 확인 명령어:

bitbake -s

3.4 U-Boot 및 Linux Kernel Configuration (menuconfig) 커스텀

 

EXTRA_OECONF는 Autotools 기반 빌드 시스템용 옵션이므로 U-Boot Kconfig 설정에 적용되지 않습니다. U-Boot 구성을 수정하려면 .bbappend 파일 또는 Kconfig/defconfig 방식을 적용해야 합니다.

Linux Kernel menuconfig 및 패치 생성 절차

커널 옵션을 변경하고 이를 레시피에 영구 적용하는 정석 절차는 다음과 같습니다.

# 1. Run Linux Kernel menuconfig interface
bitbake virtual/kernel -c menuconfig

# 2. Save the updated configuration as a defconfig fragment
bitbake virtual/kernel -c diffconfig

생성된 fragment.cfg 파일을 meta-soc/recipes-kernel/linux/linux-soc_%.bbappend 디렉터리에 복사하고 아래와 같이 레시피를 구성합니다.

# Path: meta-soc/recipes-kernel/linux/linux-soc_%.bbappend

FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI:append = " file://fragment.cfg"

3.5 BitBake 이미지 빌드 수행

설정이 완료되면 타겟 이미지를 빌드합니다.

bitbake core-image-minimal

빌드 완료 후 생성물은 아래 디렉터리에서 확인 가능합니다.

ls -al tmp/deploy/images/generic-soc/

4. 범용 SoC 디버깅 및 시스템 개발 팁

  • BitBake 환경 변수 확인: 특정 레시피의 최종 변수 값이 어떻게 재정의되었는지 추적하려면 -e 옵션을 사용합니다.
bitbake -e core-image-minimal | grep ^IMAGE_INSTALL=
  • Devtool을 활용한 커널 소스 실시간 수정: devtool을 사용하면 커널 소스를 로컬 디렉터리에 추출하여 즉시 수정 및 테스트할 수 있습니다.
devtool modify virtual/kernel
# Modify kernel source files in workspace/sources/linux-soc
bitbake core-image-minimal
devtool finish virtual/kernel meta-soc

5. Yocto 기반 SoC 빌드 시 자주 하는 실수 및 해결책

1. ext4 이미지를 dd로 직접 플래싱하여 부팅에 실패하는 경우

ext4 파일 시스템은 RootFS 전용 데이터 구조입니다. 타겟 SoC 보드가 부팅되려면 전용 U-Boot SPL, TPL, GPT 파티션 테이블이 포함된 전체 블록 이미지가 필요합니다.

  • 해결책: local.confIMAGE_FSTYPES = "wic"를 지정하고, 생성된 .wic 파일 또는 .wic.gz 압축 해제 파일을 플래싱합니다.

2. bmaptool을 사용하지 않고 dd 구문으로 전체 바이너리를 쓰는 경우

dd 사용 시 0으로 채워진 빈 영역까지 모두 쓰기 작업을 수행하여 SD 카드/eMMC 플래싱 시간이 오래 걸리고 수명이 단축됩니다.

  • 해결책: bmaptool을 활용하여 유효 블록만 고속 플래싱합니다.
# Efficient and safe flashing using bmaptool
sudo bmaptool copy tmp/deploy/images/generic-soc/core-image-minimal-generic-soc.wic.gz /dev/sdX

6. 결론

Yocto Project를 활용한 범용 임베디드 SoC 이미지 커스터마이징은 local.conf 내의 MACHINEIMAGE_FSTYPES 지정, bblayers.conf 레이어 의존성 설정, 그리고 menuconfig/diffconfig를 통한 커널 패치 관리가 핵심입니다. 본 문서에 서술된 wic 포맷 활용 및 bmaptool 플래싱 방식을 적용하면 신뢰성 높고 최적화된 임베디드 리눅스 시스템을 구축할 수 있습니다.

반응형