1. Yocto Project 기반 임베디드 SoC 리눅스 이미지 커스터마이징 개요
임베디드 리눅스 시스템 개발 환경에서 Yocto Project(Poky)는 타겟 하드웨어에 최적화된 맞춤형 OS 이미지를 생성하는 표준 도구입니다. 본 문서에서는 범용 프로세서(Generic SoC) 기반 보드를 타겟으로 하드웨어 타겟 BSP 레이어를 연동하고, local.conf 및 bblayers.conf 설정을 수정하여 커스텀 리눅스 이미지를 빌드하는 구체적인 절차를 설명합니다.
잘못 설정된 빌드 변수나 부적절한 이미지 플래싱 방식은 부트 실패를 유발합니다. 이 포스팅을 통해 범용 SoC 타겟의 U-Boot, Linux Kernel 설정 모듈 관리, BitBake 기반 패키지 제어 및 SD 카드 부팅용 wic 이미지 작성법을 습득할 수 있습니다.
2. 임베디드 SoC Yocto 빌드 핵심 설정 요약
- 타겟 머신 정의: conf/local.conf 내 MACHINE = "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.conf에 IMAGE_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 내의 MACHINE 및 IMAGE_FSTYPES 지정, bblayers.conf 레이어 의존성 설정, 그리고 menuconfig/diffconfig를 통한 커널 패치 관리가 핵심입니다. 본 문서에 서술된 wic 포맷 활용 및 bmaptool 플래싱 방식을 적용하면 신뢰성 높고 최적화된 임베디드 리눅스 시스템을 구축할 수 있습니다.
'Embedded System > Embedded Linux Build System Yocto' 카테고리의 다른 글
| Yocto Project C/C++ 애플리케이션 및 외부 라이브러리 Recipe(bb) 작성 가이드 (0) | 2025.05.16 |
|---|---|
| 임베디드 SoC 커스텀 BSP Layer 개발 및 layer.conf 설정 방법 (0) | 2025.05.15 |
| Yocto BitBake 패키지 빌드 가이드: WORKDIR 구조 및 log.do_compile 디버깅 (0) | 2025.05.13 |
| Yocto Project 핵심 개념 정리: BitBake, Poky, BSP Layer 및 Custom Recipe 작성 가이드 (0) | 2025.05.12 |
| Yocto Mickledore 기준 core-image-minimal 빌드 및 커스텀 BSP 레이어 bblayers.conf 설정 가이드 (0) | 2025.05.11 |