Yocto 프로젝트는 레이어(layer)라는 개념을 통해 다양한 작업을 관리한다. 레이어는 여러 패키지와 빌드 지침을 모아둔 집합체로, 각각의 레이어는 특정 목적이나 기능에 맞게 구성된다. 레이어는 겹치거나 결합할 수 있어, 프로젝트와 빌드 환경을 더욱 유연하고 관리하기 쉽게 만든다.

레이어 구조

레イヤ 구조는 상위 레이어와 하위 레이어로 나눌 수 있으며, 각 레이어는 다른 레이어와 우선순위(priority)를 가질 수 있다. 우선순위는 BitBake가 레시피를 처리하는 순서에 영향을 미친다.

기본 레이어

여기에는 Poky, OpenEmbedded Core, Meta-OpenEmbedded 등이 포함된다. 이러한 레이어는 Yocto 프로젝트의 기본 요소로, 다양한 하드웨어와 소프트웨어 요구사항을 충족하는 데 필요한 기본적인 레시피와 패키지를 포함하고 있다.

보드 지원 패키지(BSP) 레이어

BSP 레이어는 특정 하드웨어 보드를 지원하기 위한 레시피와 패키지를 포함한다. 예를 들어, meta-raspberrypi 레이어는 라즈베리 파이 보드를 위한 BSP를 제공한다.

커스텀 레이어

사용자가 직접 정의한 커스텀 레이어로, 특정 프로젝트나 제품의 요구사항에 맞게 생성된다. 이러한 레이어에는 프로젝트별 설정, 패키지, 이미지 등이 포함된다.

레이어 관리

레이어 관리에는 레이어 추가, 삭제, 순서 변경 등이 포함된다. Yocto 프로젝트에서는 bblayers.conf 파일을 통해 레이어를 관리한다. 이 파일은 각 레이어의 위치와 우선순위를 지정한다.

레이어 추가

레이어를 추가하려면 bblayers.conf 파일에 레이어의 경로를 추가한다. 예를 들어, 새로운 레이어인 meta-custom를 추가하려면 다음과 같이 수정한다:

BBLAYERS ?= " \
  /path/to/poky/meta \
  /path/to/poky/meta-poky \
  /path/to/poky/meta-yocto-bsp \
  /path/to/meta-custom \
  "

레이어 우선순위 변경

레이어 우선순위는 각 레이어의 conf/layer.conf 파일에 정의된 BBFILE_PRIORITY로 설정할 수 있다. 우선순위 값이 클수록 우선순위가 높아진다.

BBFILE_PRIORITY_meta-custom = "5"

BBFILE_PRIORITY_meta-custom = "10"

레이어 우선순위는 충돌하는 레시피를 처리할 때 BitBake가 어떤 레시피를 우선 적용할지 결정하는 중요한 요소이다.

BitBake 및 레시피 작성

Yocto 프로젝트에서 BitBake는 빌드 시스템의 핵심 도구로, 레시피(recipe)와 틀(template)을 이용해 소프트웨어 패키지와 이미지를 생성한다. 레시피는 패키지 빌드 방법을 정의한 파일이다.

레시피 구조

레시피는 .bb 확장자를 가지며, 다음과 같은 주요 구성 요소를 포함한다:

기본 정보

레시피의 이름, 버전, 요약, 라이선스 등을 정의한다.

SUMMARY = "Example application"
DESCRIPTION = "An example application for demo purposes"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=<checksum>"

소스 코드

소스 코드는 SRC_URI 변수에 정의한다. 이는 URL 형식으로 지정하며, 소스 코드가 위치한 곳을 나타낸다.

SRC_URI = "git://github.com/example/example-app.git;branch=main"

빌드 지침

빌드 도구 및 옵션을 지정하는 변수들이다. 다음은 몇 가지 예이다:

DEPENDS = "libexample"
S = "${WORKDIR}/git"
inherit autotools
EXTRA_OECONF = "--enable-feature"

빌드 및 설치 단계

레시피의 주요 작업 단계에는 do_configure, do_compile, do_install이 포함된다. 이 단계들은 각각 소스 코드를 구성, 컴파일, 설치하는 역할을 한다.

do_configure() {
    ./configure ${EXTRA_OECONF}
}

do_compile() {
    oe_runmake
}

do_install() {
    install -d ${D}${bindir}
    install -m 0755 example-app ${D}${bindir}/example-app
}

패치 및 수정사항 적용

패키지는 종종 소스 코드에 패치를 적용해야 할 때가 있다. Yocto 프로젝트에서는 SRC_URI 변수와 함께 .patch 파일을 사용하여 이를 처리한다.

SRC_URI = "http://example.com/source.tar.gz \
           file://fix-build.patch"

패치 파일은 레시피 빌드 전에 해당 소스 코드에 적용된다. 이를 위해 patch 유틸리티를 사용한다.

레시피 빌드 및 디버그

레시피가 작성된 후에는 BitBake를 사용하여 빌드를 시작할 수 있다.

bitbake example-app

만약 빌드에 실패하면, 로그 파일을 확인하여 문제를 해결할 수 있다. 기본적으로 로그 파일은 tmp/log 디렉토리에 저장된다.

이미지 작성 및 최적화

이미지는 다양한 패키지와 설정으로 이루어진 소프트웨어 스택의 최종 산출물이다. Yocto 프로젝트는 이미지를 생성하고 최적화하는 데 필요한 도구와 지침을 제공한다.

이미지 레시피

이미지 레시피는 .bb 확장자를 가지며, 이미지가 포함할 패키지와 구성을 정의한다. 이미지 레시피는 일반적으로 meta/recipes-core/images 디렉토리에 위치한다.

기본 이미지 레시피

기본 이미지 레시피는 포함할 패키지를 나열하고, 기본 설정을 지정한다.

DESCRIPTION = "A basic image for demonstration"
LICENSE = "MIT"

IMAGE_INSTALL = "packagegroup-core-boot \
                 example-app \
                 another-app"

inherit core-image

패키지 그룹

패키지 그룹(packagegroup)은 여러 개의 패키지를 묶어 하나의 그룹으로 처리한다. 이는 이미지를 작성할 때 중복을 줄이고 관리하기 쉽게 만든다.

PACKAGES = "${PN}-base${PN}-dev"

ALLOW_EMPTY_${PN} = "1"

RDEPENDS_${PN}-base = "example-app another-app"

이미지 최적화

이미지를 최적화하여 크기를 줄이고 성능을 개선할 수 있다. 다음은 몇 가지 방법이다:

불필요한 패키지 제거

이미지에서 사용하지 않는 패키지를 제거하여 크기를 줄이다. IMAGE_INSTALL_remove를 사용하여 불필요한 패키지를 명시적으로 제거한다.

IMAGE_INSTALL_remove = "package-to-remove"

압축 사용

이미지를 압축하여 저장 공간 절약과 전송 속도를 개선할 수 있다. Yocto 프로젝트는 IMAGE_FSTYPES 변수를 사용하여 다양한 파일 시스템 형식과 압축 옵션을 지정할 수 있다.

IMAGE_FSTYPES = "tar.bz2"

스팽크(sparse) 파일 생성

필요하지 않은 영역을 최대한 줄여 파일 시스템 크기를 줄일 수 있다. IMAGE_ROOTFS_SIZE 변수를 사용하여 스팽크 파일을 생성할 수 있다.

IMAGE_ROOTFS_SIZE = "102400"

커스텀 이미지 생성

Yocto 프로젝트는 사용자가 직접 커스텀 이미지를 생성할 수 있는 유연성을 제공한다. 이를 위해 필요한 패키지와 설정을 포함하는 새 이미지를 정의한다.

DESCRIPTION = "A custom image for specific hardware"
LICENSE = "MIT"

IMAGE_INSTALL = "custom-package \
                 another-custom-package"

IMAGE_FEATURES += "feature1 feature2"

inherit core-image

이미지 특징

IMAGE_FEATURES 변수를 사용하여 이미지에 추가적인 기능을 포함할 수 있다. 예를 들어, 디버깅 도구나 개발 도구를 포함할 수 있다.

IMAGE_FEATURES += "debug-tweaks"

이미지 빌드 및 디플로이

이미지를 빌드하려면 BitBake를 사용한다.

bitbake core-image-minimal

빌드가 완료되면 이미지는 빌드 디렉토리의 tmp/deploy/images에 저장된다. 생성된 이미지를 타겟 디바이스에 플래싱하여 사용할 수 있다.

dd if=core-image-minimal.ext3 of=/dev/sdX

이 장에서는 Yocto 프로젝트의 레이어 관리, 레시피 작성, 이미지 생성 및 최적화 방법을 다뤘습니다. 이 정보를 통해 사용자 지정 레이어와 레시피를 작성하고 최적화된 이미지를 생성하여 다양한 임베디드 시스템을 구축할 수 있다.