티스토리 뷰

Yocto Project는 리눅스 기반의 임베디드 제품의 소프트웨어 패키지를 빌드 툴로, 현재는 업계 표준 패키징 솔루션이라고 할 수 있다.


예전에는 application processor 업체나 모듈 업체들이 BSP(Board Support Package)를 제공할 때 LTIB(Linux Target Image Builder)BuildRoot 등의 간단한 루트파일시스템 빌드 툴을 제공하거나, 아니면 빌드된 rootfs image만을 제공하였으나, 최근에는 많은 업체가 Yocto Poroject를 기반으로 자신들의 추가 recipes(각 패키지를 빌드할 수 있는 명세서 등)를 제공한다. 예를 들어 아래와 AP업체들이 Yocto recipe를 제공한다.

NXP(FreeScale) i.MX series

TI

Xilinx


LTIB, Buildroot 등을 사용하여 간편하게 빌드 하였던 개발자들이 처음 Yocto Project를 사용하면 그 무거움에 당황하게 된다. X11를 포함한 기본 패키지를 빌드하기 위하여는 100GBytes 정도의 디스크 여유 공간이 필요하고, quad core CPU에서도 처음 빌드 시에는 서너시간이 소요된다.

많은 국내 임베디드 개발자들이 Windows 호스트에서 linux 가상머신을 사용하여 빌드하거나 원격 linux 서버에 접속하여 빌드하는데, 이렇게 하는 경우 설정에 따라서 전체 빌드 하는데 수십 시간이 소요될 수도 있다.


하지만 이 무거움만 극복한다면 다양한 장점을 얻을 수 있다. 무엇보다도 가장 큰 장점은 AP가 바뀌거나 제품이 변경된다 하더라도 동일한 패키지 빌드 환경을 유지할 수 있다는 것이다. 또한 SDK 패키지 빌드도 제공하기 때문에 내부 팀이나 외부 업체에 개발환경을 제공할 때도 그럴싸한 설치본을 제공해 줄 수 있다. 이외에도 각 라이센스 별 공개할 소스 패키지 분리, rpm과 같은 패키지 방식의 업그레이드나 qemu emulation 환경 제공 등 여러 장점이 있다.


물론, 개발 팀 내의 모든 인원이 모두 개발 단계에서 Yocto Project를 사용하지 않고, 한사람만 관리하고 다른 application 개발자는 SDK를 사용하는 것도 가능하다.


Yocto 에서 제공하는 기능은 다음과 같다(참고: Yocto Project 매뉴얼)




1. Yocto Project의 구성


Yocto project는 크게 다음과 같이 세 부분으로 구성된다. 


• Bitbake: Python으로 작성된 프로그램으로 recipe의 의존성에 따라 빌드를 해주는 make 툴이다. GNU Make 와는 다른 개념으로 GNU Make는 하나의 프로그램 내의 소스파일의 의존성을 관리하고 어떻게 컴파일, 링크를 할지 명세서(Makefile)에 따라서 빌드하는 툴이라면, bitbake는 각 프로그램 모듈간의 의존성을 관리하고 각 모듈을 어떤 순서로 빌드, 설치, 패키지 분리, 루트 이미지 생성 할지를 명세서(recipe)에 따라 관리해주는 툴이다. Python으로 작성된 만큼 설정파일이나 recipe도 python 언어와 유사한 프로그래밍 기능을 제공한다.

• Recipes: 각각의 모듈(예를 들어 busybox)의 빌드, 인스톨 방법, 다른 모듈과의 의존성 등을 기록한 명세서이다. Bitbake 프로그램은 이 recipe 들을 보고 의존성 있는 모든 모듈이 설치 되도록 한다.

• Document: Yocto에서 문서를 주요 부분으로 강조하는 이유는 Yocto Project의 매뉴얼이 다른 오픈 소스 프로젝트에 비교하여 체계적으로 잘 갖추어져 있기 때문이다. 이같이 문서가 잘 갖추어 진 것도 Yocto에 전신이랄 수 있는 Poky 에서 잘 다듬어 졌기 때문이다.


Recipe는 확장자가 .bb인 텍스트 파일로 간단한 예를 보면 다음과 같이 구성되어 있다.

SUMMARY = "Simple helloworld application"

SECTION = "examples"

LICENSE = "MIT"

LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"


SRC_URI = "file://helloworld.c"

S = "${WORKDIR}"


do_compile() {

${CC} helloworld.c -o helloworld

}


do_install() {

install -d ${D}${bindir}

install -m 0755 helloworld ${D}${bindir}

}


위의 recipe는 간단한 예로 do_compile()은 소스를 어떻게 compile 할지에 대하여, do_install()은 어떻게 install 할지에 대한 정의이다. 실제 프로그램의 경우 이와 같이 단순하지는 않다. 하지만 이 경우에도 autotools, make 등 해당 패키지의 make툴에 대한 정의가 있어 이를 inherit로 추가해 주면 된다. 아래는 autotools 기반(소스 빌드 시 ./configure 를 실행하는…) file utility의 recipe인 file_5.24.bb 파일이다. 

SUMMARY = "File classification tool"

DESCRIPTION = "File attempts to classify files depending \

on their contents and prints a description if a match is found."

HOMEPAGE = "http://www.darwinsys.com/file/"

SECTION = "console/utils"


# two clause BSD

LICENSE = "BSD"

LIC_FILES_CHKSUM = "file://COPYING;beginline=2;md5=6a7382872edb68d33e1a9398b6e03188"


DEPENDS = "zlib file-replacement-native"

DEPENDS_class-native = "zlib-native"


SRC_URI = "git://github.com/file/file.git \

        file://debian-742262.patch \

        file://0001-Add-P-prompt-into-Usage-info.patch \

        file://host-file.patch \

        "


SRCREV = "3c0874be4d3232d672b20f513451a39cfd7c585a"

S = "${WORKDIR}/git"


inherit autotools


EXTRA_OEMAKE_append_class-target = "-e FILE_COMPILE=${STAGING_BINDIR_NATIVE}/file-native/file"

EXTRA_OEMAKE_append_class-nativesdk = "-e FILE_COMPILE=${STAGING_BINDIR_NATIVE}/file-native/file"


FILES_${PN} += "${datadir}/misc/*.mgc"


do_install_append_class-native() {

create_cmdline_wrapper ${D}/${bindir}/file \

--magic-file ${datadir}/misc/magic.mgc

}


do_install_append_class-nativesdk() {

create_cmdline_wrapper ${D}/${bindir}/file \

--magic-file ${datadir}/misc/magic.mgc

}


BBCLASSEXTEND = "native nativesdk"

PROVIDES_append_class-native = " file-replacement-native"

# Don't use NATIVE_PACKAGE_PATH_SUFFIX as that hides libmagic from anyone who

# depends on file-replacement-native.

bindir_append_class-native = "/file-native"


Bitbake에서 compile, install과 같은 tasks는 아래와 같은 것들이 있다.

  • do_fetch: 소스를 다운로드 하기
  • do_unpack: 받은 소스를 압축 풀기
  • do_patch: 추가 patchset이 있는 경우 소스에 반영하기 
  • do_configure: 컴파일을 위한 configure 실행하기 (예를 들어 autotools인 경우 ./configure 실행)
  • do_compile: 컴파일 하기
  • do_install: make install 실행하기 
  • do_package: RPM 등으로 패키징을 위하여 bin, lib, doc, man 등으로 인스톨 파일을 분류하기 
  • do_package_write_rpm: RPM으로 패키징하기 


이 같은 과정을 거쳐서 각각의 모듈은 RPM으로 패키징 된다 (물론 설정을 변경하면 deb 등으로 만드는 것도 가능하다). 또한 이들 task는 기본적인 것들로 이외에도 다른 여러 task가 있고, 필요에 따라서 추가적으로 task를 만드는 것도 가능하다. 


Yocto를 제대로 이해하고 사용하기 위해서는 홈페이지의 documentation 를 문서를 반드시 읽어 보아야 한다. 또한 bitbake가 python으로 작성되어 있기 때문에 recipe 스크립트를 제대로 이해하기 위해서는 python에 대한 지식도 어느정도 필요하다. 



2. Yocto 빌드 과정


Yocto는 전체 빌드 과정을 보면 다음과 같은 절차를 거친다. 

  • Host용 빌드 툴 (gcc, perl, python 등)을 빌드
  • Cross compile용 빌드 툴(gcc 등)을 빌드
  • 최종 생성될 root image에 포함될 패키지를 의존성에 따라서 차례대로 빌드
  • 루트이미지 생성


빌드 과정이 복잡한 이유는 BuildRoot 등의 root image 생성툴과 달리 빌드 환경부터 만든다는 것이다. 특히 cross compiler를 어떤 환경에서 빌드해서 동일한 것을 만들어 내기 위하여 기존에 설치되어 있는 host 툴을 사용하지 않고 이도 직접 빌드하여 사용한다. 이렇게 먼저 host gcc를 빌드하고, 이를 이용해서 cross gcc를 빌드하게 되면 어떤 PC에서 빌드 하더라도 동일한 cross compiler를 만들 수 있게 된다. 



3. 호스트 컴퓨터 권장 사양


Yocto Project의 embedded linux를 빌드하기 위한 환경은 linux host PC에서만 가능하다. 

사용해본 느낌으로는 다음과 같은 사양 이상이어야 어느 정도 빌드 성능을 확보 할 수 있다. 

  • Quad core 이상의 CPU
  • Memory 16GB 이상
  • 200GB 이상의 저장 디스크


저장 디스크의 경우에도 SSD와 같이 병목이 최소화 되면 좋다. 물론 이보다 낮은 사양이어도 가능하지만 전체적인 빌드 시간이 늦어지게 된다. 

위와 같은 상태에서 전체적인 빌드 시간을 보면 대략적으로 다음과 같다. 

  • Console 기반의 루트이미지 생성: 약 30분
  • X11에 일반적인 패키지들이 적당히 포함된 경우: 3~4시간


이 시간은 처음에 빌드할 때 소요시간이고, 이후 빌드부터는 수정된 사항만 빌드되므로 시간이 오래 걸리지 않는다.


Windows PC에서 빌드를 하려는 경우에는 Ubuntu 를 virtual machine으로 실행해서 할 수 있다. 하지만 이 경우 linux guest os에 충분한 memory와 cpu 자원을 주어야만 원하는 시간 내에 빌드할 수 있다. 


Mac의 경우에도 특별히 문제될 소지는 없어 보이지만 아직까지는 지원을 하지 않는다. 실제로 빌드해보면 다음과 같은  문제가 발생한다. 

  • Mac 파일 시스템은 대소문자를 구분하지 않아, 별도로 case-sensitive disk image를 만들어야 한다.
  • bitbake 빌드 시 용량 확인을 위한 disk quata 에서 에러 발생(체크 무시 가능)


이외에도 계속 문제가 생겨서 Mac에서 지원도 Yocto에서 공식적으로 지원될 때 까지 기다리는 것이 좋을 것 같다. 결국은 Mac에서도 Windows와 동일하게 linux 가상환경에서 설치하여야 한다.


Yocto를 위하여 linux를 설치한다면 어떤 배포본이나 문제는 없으나 manual 에서 설치방법을 제공하는 Ubuntu, Fedora, OpenSUSE, CentOS 를 사용하는 것이 좋다. 처음 설치하는 경우라면 Ubuntu를 사용하는 것을 권장한다.



4. 기타


Yocto Project를 처음 사용하는 경우에는 타겟보드에 설치하는 것 보다는 매뉴얼에서 제공하는 QEMUemulation 으로 PC 상에서 돌려보는 것이 좋을 것이다. 특히 초기에 빌드에 시간이 많이 소요되기 때문에 2~3일은 끈기 있게 달라 붙어야 전체 환경을 돌려 볼 수 있을 것이다.

그리고 처음에는 fb, x11, wayland 용 이미지를 선택하면 포함되는 패키지가 많아져 가능한 가벼운 minicom console용 이미지로 먼저 시험을 해보는 것이 좋다. 익숙치 않은 상태에서 설정을 잘못하여 재 빌드하다보면 결과를 보기전에 지칠 수 있다.

댓글
댓글쓰기 폼