개요

Yocto 프로젝트란?

  • 개발자가 제품의 하드웨어 아키텍처와 관계없이 임베디드 제품용으로 설계된 맞춤형 리눅스 기반 시스템을 만들 수 있도록 지원하는 오픈소스 협업 프로젝트
  • 이 프로젝트는 임베디드 소프트웨어 스택을 제공하는데 거의 표준, 유지 관리와 확장이 가능한 소프트웨어 스택과 여러 하드웨어 플랫폼에 대한 맞춤형 소프트웨어 그리고 빌드를 제공

Yocto 프로젝트의 입출력

  • 입력: 임베디드 플랫폼의사양을 설명하는 데이터(메타데이터) 집합
  • 출력: 리눅시 기반 임베디드 제품 소프트웨어 모음(부트로더, 리눅스 커널, 루트 파일 시스템)

Poky란?

  • 임베디드 제품의 빌드를 위한 기본 Yocto 프로젝트 배포판
  • 플랫폼에 독립적인 "비트베이크"와 "오픈임베디드 코어" 그리고 "메타데이터"를 활용한 빌드(크로스컴파일) 환경 제공

Bitbake란?

  • Python과 Shell Script로 작성된 구문을 분석(파싱)하여 빌드를 수행하는 빌드 자동화 툴(엔진)
  • 파싱된 코드를 통해 빌드 태스크를 생성하여 의존성에 맞추어 자동으로 빌드를 도와줌

Metadata란?

  • 레시피(.bb), 설정(.conf), 클래스(.bbclass, .bbappend), 레이어(layers) 파일을 포함해서 설명하는 단어
  • meta-poky, meta-yocto-bsp 등과 같이 meta-* 접두사가 붙으면 레이어라고 불림
    • meta-poky: 배포 정책, 이미지 빌드(core-image-minimal 등) 레퍼런스 등을 제공하는 Poky의 기본 레이어
    • meta-yocto-bsp: 레퍼런스 하드웨어 BSP를 지원하는 Yocto 프로젝트 하위 배포판의 기본 레이어
  • Python과 Shell Script로 구성되어 유연한 형태로 관리 가능

 

※ Bitbake를 사용하는 방법과 Metadata를 작성하는 방법은 뒷 장에서 상세히 설명한다.

※ 본 학습은 Yocto 프로젝트 버전 중 Kirkstone(4.0)을 기준으로 진행되었다.

 

튜토리얼

학습을 본격적으로 진행하기 전에 Yocto 프로젝트(Poky)를 활용해 x86-64 아키텍처에서 실행가능한 이미지를 빌드하고, 이를 QEMU 환경에서 간략히 실행해본다.

(필자의 환경은 Windows 11 머신이므로 학습을 위해 WSLv2에 Ubuntu 24.04를 먼저 설치 후 다음을 진행하였다.)

 

빌드를 위한 의존성을 먼저 설치 및 설정한다.

$ sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping qeum-kvm libvirt-daemon-system libvirt-clients virtinst virt-manager bridge-utils zstd lz4
$ sudo adduser $USER kvm

 

의존성 설치와 설정을 마쳤다면, 이제 Poky 저장소를 내려받는다.

$ git clone https://git.yoctoproject.org/poky -b kirkstone

 

Poky 저장소를 내려받았다면, 내려받은 저장소로 이동 후 빌드 환경을 준비하는 스크립트를 실행시키고 빌드를 진행한다.

$ cd poky

# <build_target>을 빈칸으로 실행시키면 Default로 build/ 디렉터리로 생성된다.
$ source oe-init-build-env <build_target>

 

빌드를 위한 타겟 머신을 QEMU 플랫폼의 x86-64로 설정하기 위해 전역 설정 파일인 local.conf로 접근한다.

 

local.conf 파일은 빌드 프로세스에 전역으로 관여하는 기본 설정 파일이다. 하지만, 내용을 수정하더라도 빌드 시스템(Bitbake)은 이에 대한 임시 변경 사항을 추적하지 않기 때문에 이를 주의해야 한다.

# oe-init-build-env를 실행시키면 자동으로 <build_target> 디렉터리로 이동한다.
# <build_target> 위치를 기준으로 conf/local.conf를 수정한다.
$ vi conf/local.conf

 

이제 local.conf 파일의 MACHIEN 변수를 아래 빨간박스(MACHINE ??= "qemux86-64")와 같이 작성한다.

 

MACHINE은 빌드할 타겟 머신을 설정할 때 작성하며, 기본 meta-yocto-bsp 레이어를 통해 여러 레퍼런스 타겟 머신을 제공하고 있다. 레퍼런스 타겟 머신의 종류 (qemuarm,  qemuam64 등)는 아래 캡쳐의 주석 부분을 참조하면 된다.

 

이제 bitbake 명령을 활용해 qemux86-64 플랫폼을 실행시키기 위한 이미지를 빌드한다.

# WSLv2에서는 꽤 오랜 시간이 걸린다.. 4시간 이상 걸렸던 것 같다..
$ bitbake core-image-full-cmdline

 

Bitbake에서 기본적으로 제공하는 이미지 빌드 레시피 종류는 다음과 같다.

  • core-image-minimal: 타겟 머신이 부팅되기 위한 최소한의 컴포넌트(부트로더, 커널 등)를 가진 이미지를 위한 레시피
  • core-image-base: 타겟 머신에 대한 기본적인 하드웨어 지원을 제공하는 콘솔 전용 이미지
  • core-image-x11: 터미널을 제공하는 기본적인 x11 이미지
  • core-image-sato: Sato UI를 지원하고 모바일 환경을 지원하는 x11 이미지, 터미널, 편집기 등을 지원하는 이미지
  • core-image-full-cmdline: 리눅스 시스템에서 제공하는 모든 기능을 담고 있는 콘솔 전용 이미지

 

이미지 빌드가 완료되었다면, qemu 명령을 활용해 빌드가 완료된 이미지를 가상화된 환경에서 실행시킬 수 있다.

# runqemu <machine> <zimage> <filesystem>
$ runqemu qemux86-64 core-image-full-cmdline

 

 

튜토리얼을 통해 알게된 Poky 배포판의 Bitbake를 활용한 빌드의 큰 과정은 다음과 같다.

  1. source oe-init-build-env를 활용해 타겟 머신을 빌드하기 위한 빌드 디렉터리 생성
  2. 타겟 머신을 빌드하기 위한 설정, 클래스, 레시피 등 메타데이터 작성
  3. bitbake <recipe_name>을 활용해 타겟 머신 이미지를 생성하기 위한 빌드 진행

 

트러블슈팅

bitbake core-image-full-cmdline을 실행시킬 때 빌드 시스템에서 PATH 환경 변수를 파싱하지 못한 문제가 발생하였었다. 이는 WSLv2를 사용한다면 반드시 발생되는 문제일 것이라 생각든다. 이 문제는 아래 과정을 통해서 해결하였다.

 

빌드 중에 발생된 에러 로그
해결한 과정

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기