본문 바로가기
임베디드 & 시스템 프로그래밍

[Yocto 기본 개념 공부 정리]

by 문톰 2023. 12. 17.

회사에서 Yocto 공부 한 것을 정리한 글입니다. 

 

1.What is Yocto

1.1 Yocto란

  • 임베디드 제품(보드)에 호환하는 커스텀 리눅스 OS를 만들기 위해 탄생한 오픈소스 프로젝트

1.2 Yocto를 사용하는 이유

  • 처음 하드웨어 보드 구입 =⇒ 운영체제가 설치 X

1.3 리눅스 OS 설치

1.3-1 커스텀 리눅스 OS 설치 과정(기존)

  • 관련 소프트웨어, 의존성 고려
  • CPU 아키텍처(ARM, X86등)
  • 과정이 까다롭고 복잡함
  • 많은 시간이 소요

1.3-2 커스텀 리눅스 OS 설치 과정( Yocto 사용 )

1. 이미지 빌드(리눅스 OS 이미지 생성)

2. 이미지 하드웨어 저장 장치에 저장 (플래싱)

3.보드 전원 ON ⇒ 부트로더 실행

4.부트로더 =⇒ 저장장치 이미지 실행

1.4 Yocto의 장점 정리

1. 커스텀 리눅스 OS 구축 및 빌드 가능

  • 하드웨어 아키텍처
  • 관련 소트프웨어, 의존성

2. 재사용 가능한 구성 요소

  • Yocto 빌드에 필요한 레이어, 레시피 등을 재사용 및 공유 가능

3. 표준화된 개발 환경

  • 일관된 개발 환경을 제공합니다. 이는 협업하기 용이합니다.

2. bitbake, Metadata, layer

2.1 bitbake란

Yocto 공식 문서에서의 설명

1) 쉘 및 Python 코드를 병렬 방식으로 실행하는 툴

2) 이미지 빌드를 하는데 필요한 메타 데이터를 해석 및 실행

2.2 메타 데이터란

1) bitbake로 이미지 빌드를 수행하기 위해 사용

2) 소프트웨어를 어떻게 빌드하고 빌드 순서를 어떻게 정할지?

3) 빌드하려는 소프트웨어들 간의 의존성이 있는지 기술

2.3 메타 데이터 파일의 특징

  • 환경 설정 파일만 함수 선언 불가, 나머지는 함수, 변수, 태스크 선언 가능

1) 레시피 파일(.bb)

  • 빌드에 필요한 소프트웨어 다운 경로, 라이센스, 빌드 방법, 빌드 산출물의 경로 등을 기술합니다.
  • bitbake가 실행 할 수 있는 함수 및 태스크가 정의 될 수 있습니다.

레시피 파일 예시

### hello.bb
//설명
DESCRIPTION = "간단한 Hello World 프로그램"
   
//라이센스 
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=xxxxxx"

//다운로드 경로
SRC_URI = "file://example.com/hello-1.0.tar.gz"

//빌드 경로
S = "${WORKDIR}/hello-1.0"

//컴파일 
do_compile() {
   ${CC} hello.c ${LDFLAGS} -o hello
}

//결과물이 저장되는 장소
do_install() {
install -d ${D}${bindir}
install -m 0755 ${B}/hello ${D}${bindir}/hello
}

//파일 경로 설정
FILESEXTRAPAHTS_prepend := ${THISDIR}/source:"
  • 라이센스 설정
  • 다운로드 경로
  • 빌드 경로
  • 결과물이 저장되는 위치
  • 파일 PATH 경로

*태스크: 함수와 비슷한 개념이라고 생각!(추후 더 자세히 설명)

2) 클래스 파일(.bbclass)

-빌드를 위해 레시피 파일에서 공통적으로 사용되는 함수 및 태스크들을 정의합니다.

예시) base.bbclass

# mycommon.bbclass - Common BBClass for Recipes

# A common function that can be reused by recipes
python myfunc() {
    echo "This is a common function for recipes."
}

  • 레시피 혹은 레이어간의 공통적으로 사용할 함수들을 위와 같이 정의해서 사용할 수 있습니다.

example.bb

SUMMARY = "Simple Hello World Example"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=3f40d7994397109285ec7b81fdeb3b58"

**inherit base**

# Export the variable and function so that recipes can use them 
addtask myfunc before do_build = "r0"

SRC_URI = ""

  • 사용 시 에는 inherit 키워드를 사용해서 쓸 수 있습니다.

3) 환경 설정 파일(.conf)

-함수 및 태스크 X

-선언된 변수는 전역 변수의 특징을 갖습니다.

-주로 레시피 파일, 레이어의 경로 등변수로 갖고 있습니다. (환경 변수 같은 느낌….)

예시) bblayers.conf 파일

# bblayers.conf sample file

LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

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

4) 레시피 확장 파일(.bbappend)

-레시피 파일에서 선언된 변수, 함수, 태스크를 재정의 해서 확장 시킬 수 있도록 해줍니다.

-기존의 작성된 레시피 파일을 수정하는 것이 부담스러울 때 주로 사용됩니다.

 

 

 

5)인클루드 파일(.inc)

-클래스 파일과 동일하게 동작합니다. 하지만 include는 상속을 지원하지 않습니다.

-레시피 안에서 공통적으로 사용되는 변수들을 정의할 때 유용합니다.

2.4 레이어란

Yocto 공식문서에서의 설명

https://www.yoctoproject.org/development/yocto-project-compatible-layers/

공식문서 번역 글
  1. 이미지 빌드에 필요한 작업을 알려주는 지침 세트가 포함된 저장소
  2. 표준화를 제공, 강력한 생태계에 기여 ⇒ 공유 가능

2.5 레이어 계층 구조

 

1)주로 meta-xxx 형식의 이름으로 되어있음

2) layer 디렉토리 안에는 각각의 메타 데이터 파일들이 들어있습니다.

3) 독립적이며 의존하지 않는 모듈 형식

-각각의 레이어는 독립적이며 의존하지 않는 모듈 형식으로 되어있습니다.

-자신만의 커스텀 레이어를 만들어서 공유 할 수 있습니다.

3. bitbake가 실행되는 과정

3.1 메타 데이터 파일 분석

레시피 파일 경로 파악 과정

1) BBPATH(환경변수)

-bblayers.conf 파일에 경로를 저장한 변수가 있습니다.

2) bblayers.conf 파일

-사용할 layer들의 경로를 저장한 변수가 있습니다.

예시

# bblayers.conf sample file

LCONF_VERSION = "6"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \\
/path/to/yocto/meta \\
/path/to/yocto/meta-poky \\
/path/to/yocto/meta-yocto-bsp \\
/path/to/other/layer/meta-custom \\
"
  • ‘?=’조건부 할당 연산자로 기본 값 설정 시 이전에 값이 설정된 경우 무시합니다.
  • ‘.-=’ 덧붙이는 연산자로 기존에 있는 값 뒤에 변수에 할당된 값을 추가하는 연산자입니다

3) meta_layer(DIR) 접근

4) conf → layer.conf 파일

-bitbake가 실행할 레시피 파일의 경로를 저장한 변수가 있습니다.

# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \\
            ${LAYERDIR}/recipes-*/*/*.bbappend"

...

5) hello.bb 레시피 파일 경로 파악 완료

!!환경 설정 파일(.conf)의 주된 용도!!

-환경 설정 파일 안에는 레시피 파일 경로, 사용하는 레이어들의 경로전역 변수로 갖고 있습니다.

3.2 이미지 빌드

1) do_fetch (소스 다운로드)

-소스 코드를 원격 저장소로부터 가져옵니다.

2) do_unpack (압축 해제)

-소스 코드 압축을 해제합니다.

3) do_patch ()

-기존 소스 코드의 변경 사항을 적용하는 작업입니다.

4) do_configure

-빌드 환경을 설정합니다(예: ./configure 스크립트 실행).

5) do_compile

-소스 코드를 컴파일하여 실행 가능한 파일을 생성합니다.

6) do_install

-컴파일된 파일을 임시 설치 경로에 복사합니다.

7) do_package

-설치된 파일들을 패키지 형태로 만듭니다.

8) do_populate_sysroot

-빌드된 패키지를 시스템 루트 디렉토리에 복사합니다.

9) do_roofs

-시스템 루트에 저장된 모든 필요한 파일들을 기반으로 최종 이미지의 루트 파일 시스템

구축합니다.

10) do_image

-패키지들을 사용해서 최종적인 이미지 파일을 생성합니다

3.3 추가설명

1) Task

1)이미지 빌드 과정에서 실행되는 기본 함수

2) addtask에 정의한 함수

-Meta데이터 파일에서 addtask를 사용해서 별도로 정의한 함수

-별도로 실행시킬 함수를 호출하기 위해 사용

3) 어느 파일에서든 정의 가능( 환경 설정 파일 제외….)

-환경 설정 파일을 제외하고 어느 파일에서든 선언 가능

4) 작업 순서 지정 가능

예시

task.bbfile

addtask mycustomtask before do_compile

python do_mycustomtask() {
# 작업의 내용
}
  • 위와 같이 정의하면 이미지 빌드 시 mycustomtask 함수가 compile 이전에 실행됩니다.

2) bitbake 문법 및 Tip

### hello.bb
DESCRIPTION = "간단한 Hello World 프로그램"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=xxxxxx"

SRC_URI = "file://example.com/hello-1.0.tar.gz"

S = "${WORKDIR}/hello-1.0"

do_compile() {
   ${CC} hello.c ${LDFLAGS} -o hello
}

do_install() {
install -d ${D}${bindir}
install -m 0755 ${B}/hello ${D}${bindir}/hello
}

FILESEXTRAPAHTS_prepend := ${THISDIR}/source:"

 

1) Bitbake는 변수 타입이 없습니다.

DESCRIPTION = "간단한 Hello World 프로그램"
LICENSE = "MIT"

2) 모든 변수는 문자열로 인식됩니다.

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=xxxxxx"

3)메타데이터 설정

DESCRIPTION = "간단한 Hello World 프로그램"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=xxxxxx"
  • DESCRIPTION: 레시피의 간단한 설명입니다.
  • LICENSE: 사용된 라이선스를 나타냅니다.
  • LIC_FILES_CHKSUM: 라이선스 파일의 체크섬 입니다.

4)소스 코드 설정:

SRC_URI = "<http://example.com/hello-1.0.tar.gz>"
S = "${WORKDIR}/hello-1.0"
  • SRC_URI: bitbake가 소스 코드를 다운 받을 경로를 지정
  • S: bitbake가 소스 코드 빌드 시 제일 처음 참조하는 경로

4-1) S 경로 확인 명령어

**bitbake-getvar -r 레시피이름 변수이름**

4-2) 추가된 레이어 목록 확인 명령어

  • bblayes.conf 파일에 추가한 레이어들을 확인할 수 있습니다.
**bitbake-layers show-layers**

 

5) 결과물 저장 장소 설정

do_compile() {
   ${CC} hello.c ${LDFLAGS} -o hello
}

do_install() {
install -d ${D}${bindir}
install -m 0755 ${B}/hello ${D}${bindir}/hello
}

5-1) bindir

  • usr/bin을 의미합니다

5-2) install -d 디렉토리이름

  • 디렉토리 생성 명령어

5-3) D

  • Target의 루트 파일 시스템 경로

5-4) install -m 권한번호 실행파일이름 복사경로

  • 권한 설정 ⇒ 원하는 파일 생성 ⇒ 특정 디렉토리 경로에 복사

6) 파일경로

SRC_URI = "file://example.com/hello-1.0.tar.gz"

?=  

FILESEXTRAPAHTS_prepend ?= ${THISDIR}/source:"
  • file://’의 경로를 지정할 수 있습니다.
  • $THISDIR : 현재 파일이 위치한 경로

 

4. Poky와 OpenEmbedded

4.1 Poky

1) Poky의 유래

  • 정말 Pocky라는 과자에서 유래되었습니다. 하지만 이름 그대로 사용하면 저작권에 위배되어서 Poky라고 지었다고 합니다

2) Poky란

1) Yocto의 참조 배포판

2) 커스텀 OS 구축 및 빌드에 필요한 도구 모음

-Poky는 이러한 커스텀 OS 구축 및 빌드에 필요한 도구들을 갖고 있습니다

-내부에는 bitbake, OpenEmbedded-core, meta-yocto, meta-yocto-bsp

3) Poky의 내부 디렉토리 구조

4.2 오픈 임베디드 & 오픈 임베디드 코어

 

1) OpenEmbedded

1-1)빌드 자동화 프레임워크

1-2)크로스 컴파일 지원

1-3)Bitbake를 사용합니다.

2) OpenEmbedded-core

2-1) OpenEmbedded 내부의 핵심 구성 요소

  • Open-Embedded 안에서 이미지 빌드에 필요한 최소한의 핵심 구성 요소를 제공한다.
  • 플랫폼 독립적이고 배포 독립적인 메타 데이터를 포함하는 레이어이다.

2-2) OpenEmbedded를 Core로 나눈 이유

유지 및 관리를 쉽게 하기 위해서!!

-프로젝트가 커져감에 따라 OpenEmbeded에 너무 많은 메타 데이터들이 생겼습니다.

-유지 및 관리를 쉽게하기 위해 핵심적인 메타데이터들만 따로 분리했습니다

결론

bitbake는 Openembeded의 메타데이터를 기반으로 크로스 컴파일 및 이미지 빌드 작업을 수행합니다.

3) 전체적인 빌드 과정

5. 실습 예제 설명

5.1 실습 하기 전 설명 할 개념

1) Core-image-minimal

-커스텀 리눅스 OS를 구축 및 빌드 할 수 있는 최소한의 핵심 구성요소를 담은 이미지

  • 부트로더, 루트 파일 시스템, 리눅스 커널 등이 이미지 안에 있습니다.
  • 초기 빌드 시 3시간 정도 소요 (38번 서버는 5시간 걸림….)

2) QEMU 가상 머신

임베디드 보드를 대신해서 테스트 가능

  • 하드웨어 보드 환경을 테스트 할 수 있는 가상에뮬레이터입니다.

5.2 레시피 확장 파일을 이용한 레시피 추가

1) 실습 목표

-Core-image-minimal의 루트 파일 시스템 안에 hello.c 실행 파일을 추가

-.bbappend 사용

-“Hello World” 출력

2) 레시피 확장 파일의 장점(Remind)

  • Core-image-minimal의 레시피 파일에 영향을 끼치지 않게 레시피 추가 가능

3) 레시피 확장 파일 사용 방법

  • Layer 디렉토리 & 레시피 파일 & 레시피 확장 파일 추가

Poky 내부 디렉토리 구조

  1. Layer 디렉토리 & 레시피 파일 & 레시피 확장 파일 추가

1) Layer 디렉토리 (meta-hello) 추가

1-1) meta-hello 디렉토리의 구조

1-2) 소스파일(hello.c 파일) 추가

1-3) 레시피 파일(hello.bb 파일) 추가

tmp 디렉토리 구조를 통한 결과물 저장 장소 설명

SRC_URI

  • bitbake는 파일을 외부나 내부에서 다운 시 사용하는 파일의 경로

THISDIR

  • 현재 디렉토리 경로

WORKDIR

  • 작업 결과물 디렉토리 경로

S

  • bitbake가 소스 코드 빌드 시 제일 처음 참조하는 경로

bindir

  • usr/bin을 의미합니다

install -d 디렉토리이름

  • 디렉토리 생성 명령어

D

  • Target의 루트 파일 시스템 경로

install -m 권한번호 실행파일이름 복사경로

  • 권한 설정 ⇒ 원하는 파일 생성 ⇒ 특정 디렉토리 경로에 복사

FILESEXTRAPATHS

2) 레시피 확장 파일(.bbappend) 추가

예시) core-image-minimal.bbappend 파일

bbappend 파일 이름 작성 시 주의사항 !

-확장하려는 레시피 파일의 이름과 동일해야 합니다.

2. 레시피 & 레시피 확장 파일 경로 지정

1)layer.conf 파일에서 경로 지정

예시) layer.conf 파일

2)bblayers.conf 파일에서 경로 지정

예시) bblayers.conf 파일

3. 빌드 및 가상 머신 실행

1)bitbake 빌드(레시피 이름)

bitbake hello

2)루트 파일 시스템에 추가한 파일 적용

bitbake core-image-minimal -C rootfs

3)가상 머신 실행

runqemu core-image-minimal nographic

 

4. 출력 결과 확인

댓글