2016년 2월 18일 목요일

Image customizing 방법

Image에 원하는 package를 추가하는 4가지 방법에 대해서 알아 보자.


1. local.conf 사용.
  • local.conf IMAGE_INSTALL 혹은 IMAGE_INSTALL_append을 사용하는것은 페키지를 이미지에 추가하는 가장 쉬운 방법이나 확장성이 낮다.
  • 예) IMAGE_INSTALL_append = " strace"
    strace를 이미지에 추가.
    주의!. 반드시 추가하고자 하는 페키지 이전에 공백 1칸이 추가되어야 한다.
  • 추가되는 페키지의 순서가 중요하지 않다면 IMAGE_INSTALL += " strace" 와 같이 사용해도 된다.
  • 특정이미지에 한정시킬수도 있다.
  • 예) IMAGE_INSTALL_append_pn-core-image-minimal = " strace"
    core-image-minimal에만 한정적으로 strace가 추가

2. IMAGE_FEATURES and EXTRA_IMAGE_FEATURES 이용.
  • 이미 존재하는 이미지에 추가로 페키지를 추가 할때 유용한 방법으로 IMAGE_FEATURES 와 EXTRA_IMAGE_FEATURES 이용. 둘의 차이는 거의 없으나 사용 구분을 위해 recipes에서는 IMAGE_FEATURES를, local.conf에서는 EXTRA_IMAGE_FEATURES를 사용.
  • meta/classes/core-image.bbclass에 가능한 IMAGE_FEATURES 목록있으니 참고하여 추가.
  • 테스트 : Dropbear SSH server를 core-image-minimal에 추가하자.
  • - core-image-minimal에는 기본으로 ssh server가 들어있지 않음.
    - meta/recipes-core/images/core-image-minimal.bb 아래에 한줄추가.
    IMAGE_FEATURES += "ssh-server-dropbear"
    - $ bitbake core-image-minimal 이후 qemu 실행. 실행시 SSH server 자동실행됨 확인 및 ps으로 확인.
3. custom .bb 파일 사용.
  • custom recipe를 생성했을경우 image폴더의 .bb파일에 INSTALL_IMAGE로 추가할 페키지를 정의할수 있음. 
  • 테스트 : core-image-minimal에 strace추가.
  • meta/recipes-core/images/core-image-minimal.bb 아래에 한줄추가. 
  • IMAGE_INSTALL += "strace"
  • $ bitbake core-image-minimal 이후 qemu 실행. 
  • qemu에서 strace 실행 확인.


4. Custom package group 사용
  • 복잡한 custom image에서는 group recipe를 생성해서 원하는 package들을 한번에 관리하는것이 편리하다.;
  • .meta/recipes-core/packagegroups/packagegroup-base.bb이 좋은 example로서 PACKAGES에 group package목록들이 있고 RDEPENDS와 RRECOMMENDS에서 각 group에 대한 package들을 열거하고 있다.
  • IMAGE_INSTALL += "strace"
  • 아래는 간단한 group recipe 예제
DESCRIPTION = "My Custom Package Groups"
inherit packagegroup
PACKAGES = "\
         packagegroup-custom-apps \
         packagegroup-custom-tools \
         "
RDEPENDS_packagegroup-custom-apps = "\
         dropbear \
         portmap \
         psplash"
RDEPENDS_packagegroup-custom-tools = "\
         oprofile \
         oprofileui-server \
         lttng-tools"
RRECOMMENDS_packagegroup-custom-tools = "\
         kernel-module-oprofile"
    위의 예제의 packagegroup-custom-app와 packagegroup-custom-tools를 IMAGE_INSTALL에 추가하여 관련 package들을 한번에 추가한다.


2016년 2월 17일 수요일

yocto-layer를 이용한 helloworld추가



1. yocto-layer로 recipe 생성.

생성할 layer이름을 custom이라고 하자.

$ cd ~/yocto/poky
$ source oe-init-build-env qemux86
$ cd ..
$ yocto-layer create custom   

이후, example 생성하겠냐는 물음에 y로 대답 진행하면 기본예제로 helloworld.c 및 기본 자동 생성. 


2. 생성된 디랙토리

[meta-custom]
├── COPYING.MIT
├── README
├── conf
   └── layer.conf
├── recipes-example
   └── example
       ├── example-0.1
          ├── example.patch
          └── helloworld.c
       └── example_0.1.bb
└── recipes-example-bbappend
    └── example-bbappend
        ├── example-0.1
           └── example.patch
        └── example_0.1.bbappend



3. qemux86/conf/bblayer.conf 수정.  

새로운 layer(노란색부분)추가.  
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"

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

BBLAYERS ?= " \
  /home/keunho/yocto/poky/meta \
  /home/keunho/yocto/poky/meta-yocto \
  /home/keunho/yocto/poky/meta-custom \
  "
BBLAYERS_NON_REMOVABLE ?= " \
  /home/keunho/yocto/poky/meta \
  /home/keunho/yocto/poky/meta-yocto \
  "

4. qemux86/conf/local.conf 제일 마지막에 아래 라인 추가.

IMAGE_INSTALL_append = " example"


example 실행되면서 실제 실행파일인 helloworld /usr/sbin 설치.


5. 빌드
$ bitbake core-image-minimal

6. 실행
$ runqemu qemux86 core-image-minimal

7. 확인
QEMU에서 helloworld 입력하면 Hello World! 출력

GNU project 추가방법은 아래 링크 참고. https://wiki.yoctoproject.org/wiki/How_do_I#Q:_How_do_I_put_my_recipe_into_Yocto.3F

2016년 2월 11일 목요일

Yocto 빌드 성능향상 팁


빌드 성능 향상을 통해 빌드시간을 조금이라도 더 줄여 봅시다. 


빌드성능 향상 팁.

1. 빌드용 디렉토리는 기본 스토리지를 사용 권고. 외부 스토리지 사용시(부득이한 경우)는 최대한 속도가 빠른것으로 사용 권고. 

    --> 실제로 USB3.0에 SSD를 사용했을경우, 기본 스토리지와 크게 속도차이가 없었음. 
2. ext4 file system 사용권고
3. ext4 마운트 옵션 noatime,barrier=0,commit=6000 추가. 
4. 네트웍으로 마운트된 드라이버에서 빌드하지 말것.


$ sudo vi /etc/fstab 으로 수정후 결과.












테스트 결과 이전 1시간 소요되던 빌드가 50분정도로 줄어듬. 




VirtualBox + UBuntu 14.04 환경에 Yocto 설치

UBuntu 14.04 VirtualBox 설치된 환경에 Yocto 설치 과정 설명


Yocto 빌드는 초기에는 시간이 많이 소요되므로 되도록 전용 머신을 권고하고 있지만 yocto만을 위해 장비를 따로 두기도 어렵고해서 VirtualBox환경에서 빌드를 진행하기로 함. 사실 느릴거라는 걱정외에 다른 문제가 있을것이라고는 생각되지 않기도 하고.. 

몇몇 machine type 테스트 결과 "문제없이 잘되더라"가 지금까지 테스트 결과. 
뭐.. 좀더 해보다 보면 문제를 만날수도 있을것 같은데 지금까지는 문제 없이 잘되고 있음 확인. 머신따로 없어도 될것같아 다행 ㅎㅎ

실행 명령어 목록 및 설명 - 기본사양
1. tool 설치
$ cd ~
$ sudo apt-get update
$ sudo apt-get install git tar python
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm

2. 디렉토리 생성및 최신 버전 다운로드
$ mkdir yocto
$ cd yocto
$ git clone git://git.yoctoproject.org/poky
$ cd poky
$ git checkout -b jethro origin/jethro

3. 빌드환경 초기화.  x86용 빌드디렉토리(qemux86) 생성
$ source oe-init-build-env qemux86

4. 빌드. 여러 이미지를 선택가능하나 그중 GUI가 그럴듯한 core-image-sato 선택.  나의 환경에서는 4시간 소요. 
$ bitbake core-image-sato

5. 실행. 
$ runqemu qemux86

qemu 실행 이미지.  




한번 빌드가 되면 이후 동일한 machine type( 경우는 x86) 이미지 빌드는 소요시간이 대폭적으로 단축됨

$ bitbake core-image-minimal 같이 간단한것은 10 이내로 단축됨

ARM 빌드
빌드 디렉토리에 대한 특별한 룰은 없으나 machine type 따라 빌드 디렉토리를 따로 관리하는것이 좋다고 "Embedded Linux Projects Using Yocto cookbook"에서는 권고하고 있어 ARM 빌드용 디렉토리를 따로 만듬.

1. 빌드환경 초기화 디렉토리(qemuarm) 생성
$ cd ~/yocto/poky
$ source oe-init-build-env qemuarm  

2. 빌드.  이번에는 간단한 core-image-minimal로 빌드. 1시간 정도 소요.
$ MACHINE=qemuarm bitbake core-image-minimal

MACHINE는 machine type을 의미하며 conf/local.conf에 설정 값이 있다. 
conf/local.conf를 에디팅해서 MACHINE=qemuarm로 했다면 bitbake 명령 서두에 굳이 MACHINE=qemuarm을 추가 하지 않아도 된다.

3. 실행.  간단한 text 콘솔화면을 볼수 있음. 
$ runqemu qemuarm core-image-minimal


테스트로 x86 이미지를 빌드했으나 문제 없이 잘됨. 책에서 말한것은 어디까지나 권고사항 이었음..


$ MACHINE=qemux86 bitbake core-image-minimal

생성된 이미지들은 tmp/deploy/images 아래에 생성됨. 따라서 qemuarm qemux86 디렉토리가 생성되었음을 확인할수 있다
아래 그림과 같이 폴더내에는 image 종류에 따라 빌드된 이미지들이 들어 있음을 확인할 있다.

참고로 아래 3가지 이미지가 생성되었음을 확인 할 수 있다. 
- core-image-minimal
- core-image-minimal-dev
- core-image-sato

Default images are: 이미지 종류
  • core-image-minimal : This is the smallest BusyBox-, sysvinit-, and udev-based console-only image
  • core-image-full-cmdline : This is the BusyBox-based console-only image with full hardware support and a more complete Linux system, including bash
  • core-image-lsb : This is a console-only image that is based on Linux Standard Base compliance
  • core-image-x11 : This is the basic X11 Windows-system-based image with a graphical terminal
  • core-image-sato : This is the X11 Window-system-based image with a SATO theme and a GNOME Mobile desktop environment
  • core-image-weston : This is a Wayland protocol and Weston reference compositorbased image


You will also find images with the following suffixes:
  • dev : These images are suitable for development work, as they contain headers and libraries.
  • sdk : These images include a complete SDK that can be used for development on the target.
  • initramfs : This is an image that can be used for a RAM-RAM-based root filesystem, which can optionally be embedded with the Linux kernel.