yocto 프로젝트는 임베디드 리눅스 시스템 이미지 및 루트파일시스템, SDK를 만들기위해 일련의 도구 및 여러 패키지들을 제공하는 빌스시스템프로젝트이다.
임베디드 시스템을 위한 내용이므로 범용 개발 시스템이 필요한 경우 Raspbian과 같이 이미 사용자에게 친숙한 배포판을 사용하는 것이 좋다.
yocto는 메타레이어라는 개념을 이용하여 시스템을 구축하는데 메타레이어에는 bitbake라는 기본 빌드도구가 사용하는 메타데이터들, 즉 레시피와 클래스 및 구성 파일들이있다.
이 글에서는 yocto 프로젝트를 이용해서 라즈베리파이3를 위한 Qt + 임베디드 리눅스 시스템을 구축하는 것을 목표로하므로 이에 필요한 간단한 레이어를 직접 만들어보고 구성해볼 것이다.
먼저 Linux 기반 호스트 시스템이 있어야한다. 아래는 현재 공식적으로 지원하는 리눅스 배포판이다. (필자의 경우 우분투 18.04에서 진행하였다.)
Ubuntu 16.04 (LTS)
Ubuntu 18.04
Fedora 28
CentOS 7.x
Debian GNU/Linux 8.x (Jessie)
Debian GNU/Linux 9.x (Stretch)
OpenSUSE 42.3
그리고 공식적인건 아니지만 빌드시스템의 권장사양은 아래와 같다.
60~70GB이상의 여유공간 (공식적으론 50GB)
4GB이상의 메모리
쿼드코어 이상의 CPU
최근 빌드 환경에서 꽤 높은 사양으로 가능했다. 특히 메모리 관련해서...
필수 패키지 설치
우분투 16.04 이상이라면 파이썬 2.7도 설치해야한다.
파이썬을 2.7로 링크
clone
처음에 잠깐 얘기했듯이 yocto는 메타 레이어개념을 바탕으로 결과물을 만들어낸다. 그렇기 때문에 라즈베리파이를 위한 임베디드 리눅스 시스템 및 Qt 레이어를 정의해줘야한다.
현재 yocto 프로젝트에는 많은 레이어들이 있으며 아래 링크를 방문하여 참고하자.
https://www.yoctoproject.org/software-overview/layers/
http://layers.openembedded.org/layerindex/branch/master/layers/
우선 yocto핵심 레이어와 추가적으로 meta-openembedded, meta-qt5, meta-raspberrypi레이어가 필요하다.
욕토 프로젝트 브랜치는 thud(yocto2.6.x)를 사용한다.
@ubuntu:~/workspace$ git clone -b thud git://git.yoctoproject.org/poky.git
@ubuntu:~/workspace/poky$ git clone -b thud git://git.openembedded.org/meta-openembedded
@ubuntu:~/workspace/poky$ git clone -b thud https://github.com/meta-qt5/meta-qt5
@ubuntu:~/workspace/poky$ git clone -b thud git://git.yoctoproject.org/meta-raspberrypi
meta-raspberrypi 레이어와 달리 meta-qt5 레이어는 이미지에 추가 할 수있는 일련의 레시피만 제공하고 이미지 자체는 제공하지 않는다.
폴더 생성 및 환경 설정
@ubuntu:~/workspace/poky$ cd ..
@ubuntu:~/workspace$ mkdir build
@ubuntu:~/workspace$ source poky/oe-init-build-env build/
이제 정말 간단한 레이어를 생성해본다.
메타레이어 생성
새로운 메타 레이어 생성을 위해 bitbake-layers create-layer 명령을 뒤에 meta-<레이어이름> 을 붙여 실행한다.
pjk@ubuntu:~/workspace/build$ bitbake-layers create-layer meta-mylayer
NOTE: Starting bitbake server...
Add your new layer with 'bitbake-layers add-layer meta-mylayer'
bblayers.conf파일 수정
비트베이크는 bblayers.conf 에 정의된 레이어들을 데이터베이스화 시키므로 이파일에 사용할 레이어들을 정의한다.
@ubuntu:~/workspace/build$ vim conf/bblayers.conf
local.conf 수정
빌드 타겟머신을 정의하기위해 local.conf을 열고 아래처럼 수정한다.
@ubuntu:~/workspace/poky/build/conf$ vim local.conf
이미지 레시피 작성
새로운 이미지를 정의하기 위해 basic-qt5-image.bb의 이름의 파일을 만들고 아래처럼 작성한다.
@ubuntu:~/workspace/build/meta-mylayer$ mkdir -p recipes-core/images
@ubuntu:~/workspace/build/meta-mylayer/recipes-core/images$ vim basic-qt5-image.bb
패키지 추가 레시피 작성
레이어를 생성할때 기본으로 있던 example_0.1.bb 파일의 이름을 아래와 같이 변경한다. 이것은 기존의 qt레이어를 사용하면서 필요한 패키지를 추가하기 위함이다. 아래 예제는 Qt응용프로그램을 eglfs로 동작될 수 있도록 정의한것이다.
@ubuntu:~/workspace/build/meta-mylayer/recipes-example/example$ mv example_0.1.bb qtbase_git.bbappend
@ubuntu:~/workspace/build/meta-mylayer/recipes-example/example$ vim qtbase_git.bbappend
※ userland : Raspberry Pi GPU를 위한 EGL, GLESv2 등을 제공한다.
빌드 실행
이제 직접 생성한 레이어를 빌드하기위해 아래처럼 명령어를 입력하자. 그러면 비트베이크에 의해 task가 스케줄링 되고 빌드를 수행할 것이다. (오랜 시간이 소요되므로 참고기다리자)
@ubuntu:~/workspace/build$ bitbake basic-qt5-image
SD카드에 이미지 쓰기
완료되면 build/tmp/deploy/images/raspberrypi3 경로에 이미지 및 rootfs등이 생성된다. sd카드 이미지(rpi-sdimg)가 있는지 아래처럼 sd에 이미지를 write한다.
@ubuntu:~/workspace/build/tmp/deploy/images/raspberrypi3$ sudo umount /dev/<장치명>
@ubuntu:~/workspace/build/tmp/deploy/images/raspberrypi3$ sudo dd if=basic-qt5-image-raspberrypi3.rpi-sdimg of=/dev/sdb
[sudo] password for pjk:
1130496+0 records in
1130496+0 records out
578813952 bytes (579 MB, 552 MiB) copied, 485.783 s, 1.2 MB/s
@ubuntu:~/workspace/build/tmp/deploy/images/raspberrypi3$ sync
라즈베리파이 부팅
윈도우시스템이 없고 가벼운 임베디드 리눅스 시스템을 구축하였다.
다음 포스트에는 이 시스템을 위한 SDK를 만들고 간단한 Qt응용프로그램을 빌드, 실행시켜 볼것이다.